Easy-to-manage touch screens
Free, open-source touch screens. Guided USB setup, a drag-and-drop editor and local control. Made for Home Assistant.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
YakPack
翻訳待ち
Loading the full README. The saved excerpt is shown below.
An offline-first packing and itinerary companion for the mountains.
Weather-aware packing · a shared list for up to four people · an AI guide you bring your own key for
• What it does
• Architecture
• The decision worth reading first
• Ticking something off with no signal
• Four more decisions
• Repo structure
• Quick start
• Environment
• Roles and data
• Testing
• What's imperfect
• Tech stack
• LicenceRead the full README ↗An offline-first packing and itinerary companion for the mountains.
Weather-aware packing · a shared list for up to four people · an AI guide you bring your own key for
yakpack.tech · Terms · Privacy
I wrote it for one specific trip: nine days from Delhi into the Spiti Valley and back, climbing from 216 m to 4,590 m at Kunzum La, with two days where the itinerary's own notes record the signal as "near-zero" and then gone entirely.
Packing for that with other people is genuinely awkward. You carry a down jacket you will not touch for four days and a headlamp you need at exactly one campsite. Half the kit is shared and should only be carried once. And the day the packing matters most is the day you cannot reach the internet.
So the trip became the spec.
lib/weather.ts, not in a prompt.lib/ams.ts derives acute-mountain-sickness risk from the day's altitude gain with no AI involved, so the warning still works with the network off.flowchart LR
subgraph Phones["📱 Up to four phones"]
PWA["PWA shell<br/>service worker + outbox"]
end
subgraph Edge["Next.js 16 on Vercel"]
PX["proxy.ts<br/>auth gate on every route"]
RSC["Server Components<br/>one reader per screen"]
ACT["Server Actions<br/>all writes"]
API["Route Handlers<br/>ai · weather · import"]
end
subgraph Supa["Supabase"]
PG[("Postgres<br/>RLS scoped per trip")]
AUTH["Auth"]
RT["Realtime"]
end
OM["Open-Meteo<br/>forecast + geocoding, keyless"]
OAI["OpenAI<br/>the user's own key"]
PWA --> PX
PX --> RSC
PX --> ACT
PX --> API
RSC --> PG
ACT --> PG
RSC --> OM
API --> OM
API --> OAI
AUTH --- PG
RT -. "pushes changes" .-> PWA
Reads go through one getXData() per screen in lib/, each parallel-fetching under RLS with the cookie-bound client. Writes are server actions that re-check the session and sanitise free text before it can reach a prompt. Weather is fetched server-side directly rather than by the server calling its own /api/weather — building an internal URL from the Host header is an SSRF vector.
A service worker that must not cache the framework's own navigation.
The obvious service worker has a catch-all branch: try the network, fall back to the cache, and cache whatever comes back. I wrote that one. It broke the app in both directions, and the online direction was the surprising one.
Next's client-side navigation is not a document navigation. It is a fetch carrying an RSC: 1 header and a ?_rsc=<hash> query parameter, and request.mode === 'navigate' is false for it. So it misses every handler written to recognise a page load and lands in the catch-all instead.
flowchart TD
F(["fetch event"]) --> A{"GET?"}
A -- no --> N["pass through"]
A -- yes --> B{"http or https?"}
B -- no --> N
B -- yes --> C{"dev build?"}
C -- yes --> N
C -- no --> D{"RSC: 1 header<br/>or ?_rsc= param?"}
D -- yes --> G["pass through — the guard"]
D -- no --> E{"which URL?"}
E -- "Supabase rest/v1" --> H["network-first, DATA_CACHE"]
E -- "api/weather" --> I["network-first, WEATHER_CACHE"]
E -- "other api routes" --> N
E -- "next/static, icons" --> J["cache-first, STATIC_CACHE"]
E -- "document navigation" --> K["network-first, PAGE_CACHE, then offline shell"]
style G fill:#d4943a,stroke:#333,color:#000
Once an RSC payload lands in a cache, two things go wrong:
This is the beginning of the README. Read the rest at the original. Read the full README ↗