CleanFrame
A personal home screen for Samsung The Frame. A starting point to fork and adapt.
A craving list and tasting journal for burgers.
LifestyleGitHub @LuckyP86HOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
RESTAURANT APP THAT LETS USERS INPUT THEIR FAVOURITE BURGER
Translation pending
Loading the full README.
Read the full README ↗A craving list and tasting journal. Write down the burgers you want, then devour them with a 1–5 rating and a note. Every day, 今日汉堡 (today's burger) picks one for you from what it has learned about your taste.
Originally a 2019 bootcamp assignment (Express, MySQL, Handlebars and a hand-made ORM), rebuilt in 2026.
The original taught the basic CRUD loop: form → route → SQL → HTML. This version keeps that loop and uses it to teach three things the other projects in this set don't:
How the card is made, in three steps you can read in src/taste/:
bacon +1, salty −1. A keyword tagger (English and Chinese) runs instantly; if a model is connected it re-reads the text in the background and its validated tags replace the keyword ones.count + 2 keeps a tag near zero until it has a few examples (the idea behind ridge regularisation). Weights like smoky +0.8, salty −0.9 are the whole model.The card is written to feel good, using four small ideas from psychology:
| On the card | Example | Why it works |
|---|---|---|
| A memory, in your own words | 💭 You gave Smoked brisket smash 5/5 "great char". This one is smoky too. | Being remembered feels personal; a generic "you might like" does not. |
| A sensory preview | Picture it: crispy, lacy edges, cheese melting over the side and a deep smoky char. | Imagining the first bite is part of the pleasure (anticipation, or savouring). |
| One new thing | ✨ Something new for you: your first plant-based pick. | Novelty inside something familiar is exciting rather than risky. |
| A promise | 👌 Easy on the salt: you've said "too salty" twice. | Removing a known worry beats warning about it. |
A model, if configured, only rewrites the sensory preview. Until it answers, or if it fails, a template preview stands in, and the card says which wrote it.
| No JavaScript at all | An AI agent logs a burger |
|---|---|
Plain <form>s and redirects, so it works everywhere. htmx only makes it smoother. | Real MCP calls against a local server, then the same journal in the browser. |
corepack enable
pnpm install
pnpm dev # http://localhost:8787, with a local D1 database
| Command | What it does |
|---|---|
pnpm test | Worker tests inside the real Workers runtime (workerd) with a local D1, once without a model and once with a scripted fake model |
pnpm e2e | Playwright: desktop and phone, JavaScript on and off, axe accessibility scans in both themes |
pnpm validate | Lint, types, tests, build, e2e, knip |
pnpm gifs | Re-records the GIFs above from the live app (needs ffmpeg) |
flowchart LR
B[Browser<br/>forms + htmx] -->|POST /burgers ...| H
A[AI agent<br/>MCP client] -->|POST /mcp/key| H
subgraph Worker
H[Hono routes] --> V[Zod rules<br/>domain.ts]
V --> Q[SQL<br/>db.ts]
end
Q --> D[(D1<br/>burgers)]
Read the code in this order; it is about 600 lines in total:
This is the beginning of the README. Read the rest at the original. Read the full README ↗