Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
매일 아침, 아이에게 재미와 똑똑함이 담긴 종이와 58mm 열감지 스트립을 제공합니다. 부모가 모듈을 설정하고 별도 계정이 필요 없습니다
Every morning, something fun and a little smart waits for your kid on paper. Parents configure modules; kids get a 58mm thermal strip — no kid accounts.
라이프스타일TypeScript · PythonGitHub @jon-tompkins온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Every morning, something fun and a little smart waits for your kid on paper.
Tearaway is the parent web app for a kitchen strip (58mm thermal today; US Letter / N80 next). Parents configure a kid profile (name, age band, paper size → slots, print time, weather, watchlist, calendar). Kids never log in — they are profiles, not accounts (COPPA).
This MVP is a local demo: no auth, no Stripe, no secrets, no real printer. Config lives in data/store.json (seeded from data/store.sample.json).
Open http://localhost:3000.README 전문 보기 ↗Every morning, something fun and a little smart waits for your kid on paper.
Tearaway is the parent web app for a kitchen strip (58mm thermal today; US Letter / N80 next). Parents configure a kid profile (name, age band, paper size → slots, print time, weather, watchlist, calendar). Kids never log in — they are profiles, not accounts (COPPA).
This MVP is a local demo: no auth, no Stripe, no secrets, no real printer. Config lives in data/store.json (seeded from data/store.sample.json).
cd /workspace/tearaway-app
npm install
npm run dev
Open http://localhost:3000.
Production build:
npm run build
npm start
| Path | What |
|---|---|
/ | Marketing home |
/app | Dashboard — live strip/letter preview, Generate new strip, recent preview history, Print now |
/app/setup | Create a kid (name + age band + paper size + starter modules) |
/app/modules | Paper size → fixed slots; add modules into slots; in-order / random when a slot has 2+ |
/app/settings | Timezone / print time, weather, watchlist, calendar; tier stub (modulePoolLimit) |
Aliases that redirect: /dashboard → /app, /setup → /app/setup, /modules → /app/modules, /settings → /app/settings.
paperSize and slots live on each kid (not global kitchen settings). Kitchen settings.paperSize is only the default for newly created kids.
| Paper size | Slots | Preview |
|---|---|---|
strip58 | 4 | Classic ~384px thermal strip |
letter | 7 | Wider ~612px letter-ish page (2-column body) |
Flow on /app/modules:
Empty slots are skipped at generate time; save requires at least one filled slot.
single) → that modulein_order → moduleIds[cursor % length]; cursor advances after each successful Generate / Print now (persisted in store.json)random → seeded RNG from date + kid first name + nonce + slotId (reshuffle changes outcome)Legacy flat kid.modules: ModuleId[] is still written (unique pool across slots) and migrated into slots on read if slots is missing.
On /app, Generate new strip bumps the per-kid nonce, regenerates the preview (random slots reshuffle; in-order slots use the current cursor then advance), and keeps the last 3–5 previews for comparison. Print now saves a job using the current seed and slot picks, then advances in-order cursors. Refresh preview reloads without bumping the seed or cursors.
settings.modulePoolLimit: number | null — null unlocks all first-party modules (MVP). Later tiers can cap how many unique modules sit in a kid’s pool. No Stripe / payments in this build. Settings shows a short note.
The parent UI is not required for printing. Later firmware (ESP32 + Oreilet 58mm) can HTTP-fetch today’s strip.
| URL | What |
|---|---|
GET /api/render?kid=<id> | HTML of today’s strip (default format=html) |
GET /api/render?kid=<id>&format=png | PNG preview (strip width today) |
GET /api/render?kid=<id>&format=json | Structured PrintJob (sections + meta; no HTML) |
GET /strip/<id> | Same HTML strip in a page (iframe preview) |
GET /api/print-jobs/preview | Generate for the active kid (no persist; no cursor advance) |
POST /api/print-jobs/reshuffle | Bump nonce + preview + advance in-order cursors |
POST /api/print-jobs/print-now | Generate + save queued job + advance in-order cursors |
GET /api/print-jobs/latest | Last queued job for the active kid |
GET / PUT /api/store | Read / patch JSON store |
GET /api/weather | Open-Meteo snapshot (falls back to mock offline) |
Query params for /api/render
kid (required) — profile id, e.g. demo-samdate (optional) — YYYY-MM-DD. Default: today in the kid’s timezoneformat (optional) — html | png | jsonExample: /api/render?kid=demo-sam&date=2026-09-16&format=png
No ESC/POS yet. No talk to a real printer. HTML/PNG/JSON is the handoff.
Content is seeded by date + kid first name + nonce. Same inputs → same strip. Bumping the nonce (Generate new strip) reshuffles without changing the day. Multi-module slots add another layer of pick resolution (above).
| Module | Notes |
|---|---|
| Maze | Perfect maze; size by age band |
| Word Find | Tiny word-search (6×6–8×8) that fits 58mm |
| Connect the Dots | Funny numbered dots + silly caption (SVG) |
| Riddle | Question + answer on the strip (think first) |
| Number Puzzle | 4×4 / 6×6 / easy 9×9; parent key on-screen only |
| Module | Notes |
|---|---|
| Word of the Day | Age-banded definition + example |
| Poem of the Day | Short printable poem |
| Breakfast Joke | Age-banded groaners; kid-safe, no mean stuff |
| Spanish Word | Spanish + phonetic + English + try-it line |
| Module | Notes |
|---|---|
| This Day in History | Kid-appropriate local catalog |
| Fun Fact | Curated sample copy |
Wonder + discovery tone. No violence / politics anxiety. City news is generic “hometown” style (no geo API yet).
| Module | Notes |
|---|---|
| World News | Animals, space, discoveries |
| National News | Parks, science fairs, kindness |
| Hometown News | Library, playground, neighbors |
| Tech News | Robots, code, gadgets |
| Gamer News | Games, makers, fair play |
| Module | Notes |
|---|---|
| Weather | Open-Meteo + Zippopotam (no API key); mock if offline |
| Stock Watchlist | Mocked prices — not live market data |
| Calendar | Local events you edit in Settings |
| Module | Notes |
|---|---|
| Tiny Doodle | 30-second drawing prompt for the strip margin |
| Would You Rather | Two choices + a tiny debate nudge |
Demo kid (data/store.sample.json): strip58 with four slots — word · joke/riddle (in order) · doodle/wyr/poem (random) · maze/spanish (in order).
Space Week, Scorecard, Gratitude Note, Tongue Twister — shown in the modules UI as “coming soon.” First-party modules above are not duplicated here. No payments or pack install yet.
data/store.json (gitignored)data/store.sample.json (committed)kid.paperSize: "strip58" | "letter"
kid.slots: Array<{
id: string
moduleIds: ModuleId[]
mode: "single" | "in_order" | "random"
cursor?: number // in_order only
}>
settings.modulePoolLimit: number | null // null = all unlocked
Next.js (App Router) · TypeScript · Tailwind CSS · local JSON store
Private prototype — dad + kid project.
All animal line art is from OpenMoji, © OpenMoji contributors, licensed CC BY-SA 4.0. See src/lib/puzzles/animal-art.ts.