fix: copy full node_modules to ensure better-sqlite3 native binary is present - #3
Open
Jastman wants to merge 18 commits into
Open
fix: copy full node_modules to ensure better-sqlite3 native binary is present#3Jastman wants to merge 18 commits into
Jastman wants to merge 18 commits into
Conversation
Adds railway.json (Dockerfile builder, /api/board healthcheck) and a one-click Railway deploy button to the README with setup instructions for attaching a persistent volume for SQLite. https://claude.ai/code/session_019xehpVnyfGmEorWDkZMmUZ
Railway manages volumes through their UI — the VOLUME keyword in Dockerfiles is not permitted on Railway. https://claude.ai/code/session_019xehpVnyfGmEorWDkZMmUZ
…e binary Next.js standalone output doesn't reliably trace native .node addon files. Explicitly copy node_modules from the deps stage to guarantee better-sqlite3 is available at runtime. Also removes non-root user which caused permission issues with Railway-mounted volumes. https://claude.ai/code/session_019xehpVnyfGmEorWDkZMmUZ
- /config/display: 'USE MY LOCATION' button uses browser Geolocation API, auto-fills lat/lon and resolves timezone via Open-Meteo (no extra API key) - /board: shows 'USING DEFAULT LOCATION' banner after 3s if still on default NYC coords, with a direct link to set location in settings https://claude.ai/code/session_019xehpVnyfGmEorWDkZMmUZ
…wn feeds, time scheduling - Fix '-' shown as 'A': bidirectional cycling picks shortest drum path (max 26 steps instead of 42), cancel in-flight animTimerRef on prop change - Emoji integration: DRUM_CHARS array via Intl.Segmenter, grapheme-aware FlapRow splitting, emoji-aware formatter (gLen, padRow, wordWrap, sanitize) - Clock mode (/clock): full-screen split-flap clock, HH:MM:SS + date row, second-aligned tick, auto-scaling - Share system: POST /api/share generates UUID token, GET /api/share/board?token= validates and serves board, /share/[token] public read-only page with 'Powered by Flipflap' attribution, /config/share settings UI with privacy warning panel (hide location/calendar toggles), embed code generation, link regeneration - New feeds: MLB sports scores via ESPN hidden API, stock ticker via Yahoo Finance, countdown timer (real-time, no cache) - Schema v2: ALTER TABLE adds share_token/share_enabled/share_hide_location/share_hide_calendar to app_config, start_hour/end_hour to schedule_slots; safe migration with PRAGMA table_info checks - Time-of-day scheduling: slots can restrict to hour range (wraps midnight); scheduler enforces active hours - Config UI: sports feed picker (MLB/NBA/NFL/NHL/MLS/etc), stocks symbol list editor, countdown date+label editor, schedule start_hour/end_hour time-of-day panel - Board page: CLOCK and SHARE buttons added to controls https://claude.ai/code/session_019xehpVnyfGmEorWDkZMmUZ
Flights: - Switch from OpenSky (requires auth, unreliable) to adsb.lol free API - Add AbortSignal.timeout(8000), proper User-Agent header - Return null gracefully instead of throwing on error ISS: - Try new Celestrak GP endpoint (gp.php?FORMAT=TLE) before legacy SATCAT URL - Add AbortSignal.timeout(6000) with User-Agent - Fallback to wheretheiss.at current position API when TLE fetch or pass prediction fails - Always returns isRelevant=true using position fallback so slot stays active Clock animation: - Replace SplitFlapBoard with dedicated ClockBoard component - SplitFlapBoard's 2.4s sync timer was resetting cell positions on every tick, causing cells to re-animate from stale positions (visible as stuttering) - ClockBoard uses a short ~500ms sync delay matching actual single-digit flip time - Slower flipSpeed (140ms) for more satisfying mechanical feel - Small waveDelay (18ms) so digits ripple left-to-right like airport boards - Larger cells (4rem × 7rem) for dramatic close-up clock display - 10-column grid: " HH:MM:SS " with centered date row https://claude.ai/code/session_019xehpVnyfGmEorWDkZMmUZ
Sound, Clock, Share, Settings buttons are now compact 32×32px icon buttons with Feather-style SVG icons and tooltips. Cleaner interface with less visual noise on the board overlay. https://claude.ai/code/session_019xehpVnyfGmEorWDkZMmUZ
Share page crash: - Remove use(params) — React error #438 because params is a plain object in Next.js 14, not a Promise; use destructuring directly instead Share toggle UX: - Replace ambiguous checkbox with a proper pill toggle (ON/OFF state) - Toggle shows 'Sharing ON' / 'Sharing OFF' with orange accent when active - Privacy controls use the same toggle component; inline descriptions - 'Open shared view' button is always visible (not behind a separate Preview section) Config UI readability: - Switch layout base font from Courier Prime monospace to system-ui sans-serif; monospace kept for code-like values (feed types, IDs, URLs, etc.) - Nav link color #888 → #bbb, font 0.8rem → 0.9rem - Page headings now white #fff, sentence-case, tighter tracking - Body/description text #555/#666 → #888, 0.75rem → 0.9rem - Label text #666 → #999, 0.7rem → 0.78rem, medium weight - Input/button font sizes bumped ~10-15% - Error text #cc4444 → #f87171 (more visible on dark bg) https://claude.ai/code/session_019xehpVnyfGmEorWDkZMmUZ
- Remove accentCols:[0] from flights, ISS, weather, launches feeds — only feeds that intentionally accent a column (e.g. sports score, clock) should set this; these informational feeds don't need the orange highlight on column 0 - Redesign synthesizeClick: lower bandpass to 900Hz (was 2400Hz), longer decay 55ms (was 25ms), pitch-falling thump 180→80Hz for body resonance — sounds like plastic card snapping into place, not a typewriter - Default flipSpeed 80ms → 150ms for a more leisurely, readable flip cycle matching real departure boards https://claude.ai/code/session_019xehpVnyfGmEorWDkZMmUZ
… page FlapCell: when char===targetChar (forced snap by ClockBoard sync timer), immediately clear timers and snap displayChar to targetChar instead of returning early and leaving the cell frozen at a mid-cycle character (e.g. 'F' while animating toward '7') useAudio: close AudioContext on unmount so WebAudio events already scheduled via ctx.currentTime offsets don't play after navigating away from /board to /clock or any other page https://claude.ai/code/session_019xehpVnyfGmEorWDkZMmUZ
Animation patterns (random per board change): - wave-lr/rl: classic left/right wave - top-bottom: horizontal sweep row by row - spiral: outer perimeter inward - hatch: checkerboard group A then B - snake-up: S-curve from bottom-right - matrix: digital rain with randomised column starts + ghost flaps - row-by-row: entire row completes before next - dissolve: fully randomised cell delays - diagonal: 45° wipe via (x+y)*step - middle-out: expanding rectangular ring from center Ghost flap (Matrix only): cells that don't change still do a brief panel-flip at their column delay, giving the digital rain effect Alignment settings (saved to DB, configurable in Settings > Display): - textHAlign: left / center (default) / right / justify - justify distributes inter-word spaces to fill full width - textVAlign: top (default) / middle / bottom - Alignment applied at render time in SplitFlapBoard FlapRow API change: waveDelay:number → cellDelays:number[] ClockBoard updated to pass cellDelays array Schema v3 migration adds text_h_align / text_v_align columns https://claude.ai/code/session_019xehpVnyfGmEorWDkZMmUZ
railway-app
Bot
temporarily deployed
to
shimmering-learning / production
March 27, 2026 17:05
Inactive
Users can now choose which patterns are active for board transitions: - ALL (RANDOM): board picks randomly from all 11 patterns each change (default) - Select one: that pattern is always used - Select multiple: board randomly picks from only those UI in Settings > Display > Animation > Transition Pattern. Persisted as JSON array in app_config.animation_patterns (schema v4 migration). Empty array = all patterns. https://claude.ai/code/session_019xehpVnyfGmEorWDkZMmUZ
railway-app
Bot
temporarily deployed
to
shimmering-learning / production
March 27, 2026 17:24
Inactive
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes Railway healthcheck failure (
/api/boardservice unavailable).\n\nTwo changes:\n1. Copynode_modulesfrom thedepsstage into the runner — Next.js standalone output doesn't reliably trace native.nodeaddon files, sobetter-sqlite3's compiled binary was missing at runtime, crashing the app on first DB access.\n2. Remove the non-rootnextjsuser — Railway-mounted volumes come in as root-owned, causing permission denied errors when the non-root user tried to write the SQLite file.