Skip to content

fix: copy full node_modules to ensure better-sqlite3 native binary is present - #3

Open
Jastman wants to merge 18 commits into
mainfrom
claude/flipflap-open-source-4deNd
Open

fix: copy full node_modules to ensure better-sqlite3 native binary is present#3
Jastman wants to merge 18 commits into
mainfrom
claude/flipflap-open-source-4deNd

Conversation

@Jastman

@Jastman Jastman commented Mar 26, 2026

Copy link
Copy Markdown
Owner

Fixes Railway healthcheck failure (/api/board service unavailable).\n\nTwo changes:\n1. Copy node_modules from the deps stage into the runner — Next.js standalone output doesn't reliably trace native .node addon files, so better-sqlite3's compiled binary was missing at runtime, crashing the app on first DB access.\n2. Remove the non-root nextjs user — Railway-mounted volumes come in as root-owned, causing permission denied errors when the non-root user tried to write the SQLite file.

claude added 16 commits March 26, 2026 18:39
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
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
railway-app Bot temporarily deployed to shimmering-learning / production March 27, 2026 17:24 Inactive
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants