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.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Shared trip planner for Nov 13–27, 2026: Pattaya 3 nights, Phuket 5, Bangkok 6. The calendar and activity list share the landing page so drag-and-drop and tap-to-place stay intact. The other numbered sections have separate static pages, with a common 17-item menu and the original grid-paper styling. The fixed calendar itinerary covers Nov 13–26, as in the original.
Use Node.js 20 or newer. No npm dependencies are required:
npm run dev
Open http://127.0.0.1:4317. The development server builds the site and watches source files. Native JavaScript modules need HTTP; opening files directly is unsupported. Use HTTPS when publishing.
src/
layouts/base.html Shared document, header, navigation and footer
pages/ Page content, without duplicated document wrappers
assets/
styles/main.css Layout, responsive styles and print rules
js/app.js Page initialization and navigation guards
js/components/ Shared navigation
js/pages/ Calendar, catalogue, hotel guide, checklist, ledger and sharing
js/lib/ Shared data access, calculations and utilities
js/data/trip.js Fixed itinerary and catalogue
js/data/hotels.js Sourced hotel shortlist and room-budget calculations
scripts/ Static build and local development server
database/ Versioned Supabase schema
tests/ Node test suite
docs/ Verification notes
dist/ Generated site; ignored by Git
Edit src/, then run npm run build to produce dist/. All pages use one layout. Routes such as /hotels/ work directly and on refresh; old .html links redirect to their current routes. Calendar and activities stay together at /#calendar and /#activities, side by side on wide screens and stacked on phones. The Sections button opens the complete index without sideways scrolling.
The browser uses the Supabase project and public publishable key in src/assets/js/lib/config.js. That key is public configuration. Never replace it with a secret or service-role key.
The intended access model is anyone with the link can read and edit, including clearing the shared calendar and resetting the shared trip after confirmation. There are no individual accounts. The database permissions also allow these actions directly through the API; a browser confirmation is a convenience, not an access control. Do not store secrets in this planner.
Only three app-specific tables are exposed to the anonymous role:
thailand_placements: one UUID per calendar occurrence, including custom and per-entry edited activity details.thailand_expenses: one UUID per expense, with the fixed crew's payer and split participants.thailand_settings: checklist ticks and legacy settings (48 keys retained for compatibility).Explicit grants, row-level policies and value constraints are in database/001_thailand_shared.sql. It also defines transaction-based clear/reset/import functions using caller privileges. Existing unrelated tables and their policies are untouched.
Both numbered migrations have been applied to the confirmed project gvlpnygtuuouejndhzzh with explicit approval of anonymous editing, deletion and shared reset. For a different empty project, apply 001_thailand_shared.sql then 002_explicit_clear_filters.sql once using migration tooling. The first creates the three tables, seeds settings and adds the tables to supabase_realtime; it deliberately fails if the tables already exist. The second adds explicit primary-key predicates to intentional clear/reset deletes so PostgREST's safeupdate guard accepts them. Permissions and RLS remain unchanged. Ordinary page loads never seed or upload local browser data. Fixed itinerary pins remain in src/assets/js/data/trip.js.
Supabase JS 2.117.2 is loaded as a version-pinned ES module from jsDelivr (https://cdn.jsdelivr.net/npm/@supabase/[email protected]/+esm). Internet access to that CDN and the configured Supabase project is required. There is no runtime npm installation.
Changes use individual record/field writes and Postgres Changes subscriptions. Focus, reconnect and coming online refetch current database state. Same-field changes use the last accepted database write. Numeric fields commit on change/blur; menu navigation waits for submitted writes and flushes pending settings. Incoming data does not replace active drafts. Failed writes retain a draft or leave the previous saved state visible with an explicit retry. Offline writes are paused; custom activity drafts can still be opened and retained. Reconnect reads current data and never replays an offline queue.
Drag an activity from section 02 (the list) directly into a calendar slot, or tap its + and choose Place here in a day/time slot on the same page. Calendar and Activities links jump between these sections. The old activities.html URL redirects to the list. Use + add for custom activities, such as Dinner | 500. Each added occurrence has Edit, Move and remove controls; flight and hotel pins remain fixed. Print includes the calendar and fixed pins, with the catalogue and editing controls hidden.
Expenses and checklist ticks are shared. Hotel research, stars and guest-review snapshots live in src/assets/js/data/hotels.js, with sources linked beside each choice. The hotel guide replaces the old credit/points calculator; legacy database keys remain for compatibility. Its two/three-room, five/six-adult budget scenario is temporary browser state and works even if the shared database is unavailable. All displayed hotel budget figures are illustrative US dollars per room per night, not verified availability or rates for November. Search filters, navigation and unsubmitted expense forms are also temporary.
This is the beginning of the README. Read the rest at the original. Read the full README ↗