2026-01-28 22:31:53 -08:00
2026-01-28 20:39:59 -08:00
2026-01-28 20:39:59 -08:00
2026-01-28 20:39:59 -08:00
2026-01-28 20:39:59 -08:00
2026-01-28 20:39:59 -08:00
2026-01-28 20:39:59 -08:00
2026-01-28 20:39:59 -08:00
2026-01-28 20:39:59 -08:00
2026-01-28 20:39:59 -08:00
2026-01-28 20:39:59 -08:00
2026-01-28 20:39:59 -08:00
2026-01-28 22:31:53 -08:00
2026-01-28 22:31:53 -08:00
2026-01-28 20:39:59 -08:00
2026-01-28 20:39:59 -08:00

This is a Proof of Concept build.

Client front-end is HTML/CSS/JS and hosted on Phoenix server with the backend services. A tunnel has been created to a publicly available web server called Dragon (soon to be replaced).

The system captures an image of a handwritten page and passes it to Qwen3 VL 8B AWQ (4-bit) for conversion to digital text.

Your config locations cheat sheet:

| What | Location | ------|----------| FastAPI config | ~/htr-api/.env | vLLM | service | /etc/systemd/system/vllm-htr.service | HTR service | | /etc/systemd/system/hhtr-api.service | FastAPI service | | /etc/systemd/system/htr-api.service | nginx config | | /etc/nginx/sites-enabled/htr | Frontend | /var/www/htr/index.html | | Cloudflare tunnel | /etc/cloudflared/config.yml |

After changing the model in .env, run the following:

sudo systemctl daemon-reload sudo systemctl stop vllm-htr htr-api sudo systemctl start vllm-htr htr-api

Future Update

To create an MVP using Capacitor to wrap the front-end HTML/CSS/JS and call the service through a future web server (Cerberus) running Ghost with API access via FastAPI?

Need to test Qwen3 VL 2B and modify the prompt to see if accuracy occurs.

PRD for the MVP is located in a document, "PRD-Pen2Post_MVP-FINAL.md"

Description
Pen2Post is a mobile-first handwriting-to-text app for fast, friction-free capture of handwritten notes. Users snap a handwritten page, Pen2Post turns it into editable text, and they share or copy it into their preferred tools in seconds.
Readme 62 KiB
Languages
HTML 56.7%
Python 17.9%
JavaScript 16.6%
CSS 8.8%