Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
오프라인 우선 패킹·여정 동반자, 날씨 반영 목록·공유 일정·AI 가이드 제공
An offline-first packing and itinerary companion. Weather-aware lists, a shared plan for everyone travelling with you, and an AI guide you bring your own key for.
라이프스타일TypeScript · PLpgSQLGitHub @kritish08온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
YakPack
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
• 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
• LicenceREADME 전문 보기 ↗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:
여기까지가 README 앞부분입니다. 나머지는 원문에서 읽을 수 있습니다. README 전문 보기 ↗