summaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorLines
31 hoursAdd navigation progress bar for client-side transitionsHEADmasteryyamashita-1/+46
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
4 daysFix day-of-week bug in recap mail: getDay()→getUTCDay() on noon UTCyyamashita-3/+2
+09:00 midnight をパースすると内部では前日15:00UTCになり、 getDay()がシステムタイムゾーン(UTC)で前日の曜日を返していた。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
4 daysrecap mail: remove price column, make title a linkyyamashita-8/+5
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
5 daysFix scraper restart loop: MARZ 500 on unpublished month + set -eyyamashita-3/+3
新宿MARZ翌月スケジュールのHTTP 500がスクレイパー全体を失敗させ、 set -e によりentrypointがcron起動前に終了→再起動ループを引き起こしていた。 - marz-shinjuku: 404/500は未掲載扱いで空配列を返すよう変更 - scraper-entrypoint.sh: set -e を削除し初回スクレイプ失敗でもcronを起動 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
13 daysAdd scrapers for 新宿MARZ and 東高円寺U.F.O.CLUByyamashita-0/+256
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18Fix HTML entity leakage in FAD scraper and Pitbar _clone date bugyyamashita-7/+6
fad-yokohama: replace innerHTML manipulation with Cheerio .clone().text() so that HTML entities (&nbsp; etc.) are decoded before storing titles. pitbar-nishiogikubo: strip non-numeric suffix from day part of element ID to handle _clone-suffixed IDs that freecalend.com generates after JS renders. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17Fix image proxy 400 for application/octet-stream responsesyyamashita-5/+20
GCS-backed Active Storage (omatsuri.tech, used by rinky.info venues) returns application/octet-stream instead of image/*. Detect actual image type from magic bytes (JPEG/PNG/GIF/WebP) and serve with correct Content-Type. Also add X-Content-Type-Options: nosniff. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17Add image proxy endpoint to avoid mixed content issuesyyamashita-2/+83
Serve external event images through /api/image?url=<encoded> so HTTP image URLs from venue sites are fetched server-side and delivered over HTTPS. Validates Content-Type is image/*, blocks private IPs (SSRF), and caches responses in memory (24h TTL, 200-entry LRU). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09Use Postfix container for recap mail; add Message-ID headeryyamashita-5/+8
Port 25 outbound unblocked: send-recap.ts now routes through the mail container (Postfix + OpenDKIM) for direct MX delivery with DKIM signing. Removes inline MX lookup logic added in the previous workaround. Also adds Message-ID header (required by Gmail) and updates default RECAP_TO to mazideyabai@gmail.com. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04Fix cron PATH: use absolute path for node in /etc/cron.d/scraperyyamashita-2/+2
cron runs with a minimal PATH that excludes /usr/local/bin, causing 'node: not found' errors for both scrape and recap jobs. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02Fix double JST offset in send-recap date calculationyyamashita-1/+1
isoDate() already adds JST_MS; calling it with nowJST() (which also adds JST_MS) shifted the date +18h, showing tomorrow's date instead of today's. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01Show today's (JST) events only, add link to by-date pageyyamashita-47/+27
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01Add daily recap email job via Postfix MTA containeryyamashita-1/+284
Sends an HTML digest of the next 7 days' events to efemeraladdress+golive@gmail.com at 08:00 JST daily (23:00 UTC cron). Adds scraper to the web Docker network so it can reach mail:25. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22Add filters to date view (keyword, venue, area, capacity)yyamashita-9/+105
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-19Add venue visibility toggles with localStorage persistenceyyamashita-4/+74
Each venue on /venues can be toggled on/off; state persists in localStorage. Hidden venues are filtered out of the event list, with a notice linking back to the venues page to manage the setting. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-19Add RIPS 八王子 and MatchVox 八王子 scrapersyyamashita-0/+300
Both venues are RinkyDink-affiliated live houses in Hachioji. WordPress + My Calendar plugin; parses mc-list HTML for date, title, artist, OPEN/START times, and price across 3 months. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17Defer repo/hook setup to hetzner-infra/scripts/install.shyyamashita-16/+11
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17Remove inline hook from server-setup.sh; hooks managed by hetzner-infrayyamashita-15/+3
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14Add BuzzFront YOKOHAMA scraperyyamashita-0/+113
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14Add JSON REST API: GET /api/events, /api/events/:id, /api/venues, ↵yyamashita-0/+423
/api/openapi.json Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14Remove unused template files home.tsx and welcome.tsxyyamashita-102/+0
Routes not registered in routes.ts caused a persistent tsc error on the auto-generated +types/home module. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14Add 東高円寺二万電圧 (den-atsu) scraperyyamashita-0/+151
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10Fix multi-month scrape coverage and add duo MUSIC EXCHANGEyyamashita-236/+659
- Extend 8 scrapers (liquid-room, shibuya-o, club-quattro, meets-otsuka, nishieifuku-jam, fever-shindaita, fad-yokohama, and new duo-music-exchange) to fetch 3 calendar months instead of 1-2, covering the full 65-day window - Add duo MUSIC EXCHANGE scraper (渋谷, ~700 cap, /schedule/YYYY/index_YYYY-MM.html) - Add npm test: Node.js built-in test runner verifies each scraper fetches all required month URLs via mocked fetch (10 tests, no extra deps) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10Add calendar export (Google/ICS) and extend scrape window to 65 daysyyamashita-1/+201
- Event detail page: add Google Calendar link and .ics download button - New route GET /api/events/:id/calendar.ics returns RFC 5545 iCalendar - Scrape window extended from 35 → 65 days (~2 months ahead) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08Update server-setup.sh: use /app/tokyo-livehouse-events work treeyyamashita-11/+5
2026-05-08Remove embedded Caddy, join shared web network as tokyo-app containeryyamashita-17/+7
2026-05-08Fix all TODO bugs and implement feature additionsyyamashita-19/+188
- SCRAPE_TARGETS.md: add 5 missing venues (nine-spices, nishieifuku-jam, fever-shindaita, moon-step-nakano, mod-shibasaki) - Navigation: add 日付別 link to venues.tsx and events.$id.tsx headers - venues.tsx: add official site external links per venue card - ScrapeButton: new component with useFetcher-based trigger + 2s polling progress UI showing per-venue status and event count - venues.tsx / events._index.tsx: wire in ScrapeButton - FilterBar + db.server.ts: add area filter derived from venues, threaded through queryEvents Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08Add TODO.md tracking known bugs and feature requestsyyamashita-0/+27
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08Fix scraper Docker build: copy package-lock.json into playwright-baseyyamashita-1/+1
Without the lock file, npm install tsx resolved @react-router/dev to its latest version (7.15.0), which has a peer dependency conflict with the installed react-router@7.3.0. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08Speed up Docker build by sharing prod-deps and playwright-base stagesyyamashita-12/+20
- Add prod-deps stage to run `npm ci --omit=dev` once (was twice) - Add playwright-base stage to install Chromium once (was twice) - Both app and scraper stages inherit from playwright-base - Add BuildKit cache mounts for npm to accelerate repeated builds Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08Add capacity filter for live houses (~100 / 100~300 / 300~)yyamashita-13/+67
- Add capacity field to VenueMeta and all 17 scrapers (researched values) - Add capacity column to venues table with auto-migration for existing DBs - Add capacity_range filter to queryEvents (small/medium/large) - Add capacity selector to FilterBar UI Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08Add navey-floor and shimokitazawa-era scrapersyyamashita-0/+153
navey floor (赤坂): 29件取得、Cheerio + WordPress カスタムCMS 下北沢ERA: 22件取得、HTTP only (TLS証明書無効のため) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08Update CLAUDE.md: reflect warp-kichijoji and pitbar-nishiogikubo now registeredyyamashita-4/+4
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08Register warp-kichijoji and pitbar-nishiogikubo scrapers in ALL_SCRAPERSyyamashita-0/+4
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08Run scrape immediately on container start before handing off to cronyyamashita-1/+9
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08Add scraper service to docker-compose with 6-hourly cronyyamashita-2/+32
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-07Noindex entire site via robots.txt and X-Robots-Tag headeryyamashita-5/+2
2026-05-07Disallow .well-known in robots.txtyyamashita-0/+1
2026-05-07Add robots.txtyyamashita-0/+2
2026-05-07Add .well-known/security.txt with noindex headeryyamashita-0/+6
2026-05-07Add Referrer-Policy no-referrer headeryyamashita-3/+4
2026-05-07Add Deploy.mdyyamashita-0/+74
2026-05-07Add Docker + Hetzner deploy setupyyamashita-16/+85
2026-05-07trigger redeployyyamashita-0/+0
2026-05-07Fix mobile layout for iPhone-sized viewportsyyamashita-22/+22
- Stack header vertically on mobile (flex-col sm:flex-row) to prevent logo+nav overflow - Hide venue and price columns in list/row views on mobile to give title room - Shrink date/time columns on mobile (w-24 sm:w-32, w-20 sm:w-28) - Make keyword filter input full-width on mobile (w-full sm:w-52) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-07Add F.A.D YOKOHAMA scraperyyamashita-0/+179
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-07Add Claude Code settings with bypass permissions modeyyamashita-0/+6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-07Fix scrapers returning 0 events for 4 venuesyyamashita-184/+132
Rewrote selectors to match actual HTML structure after inspecting each site: - LIQUID ROOM: article selector, date extracted from URL (_YYYYMMDD suffix) - WWW/WWW X: article.column selector, month from li.month nav, day rollover detection - 新宿 LOFT: section.block_schedule_list links, full date from time div.year/month/day - CLUB QUATTRO: li[data-event-date] with ISO date attribute, jp-label time parsing Result: 0件 → LIQUID ROOM 25件 / WWW 48件 / LOFT 13件 / QUATTRO 24件 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-07Add CLAUDE.md with architecture and development guidanceyyamashita-0/+332
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-07Add 5 new venue scrapers; extract artist info for WARP, shibuya-o, MOON ↵yyamashita-65/+621
STEP, mod New scrapers: Fever 下北沢, Nine Spices 下北沢, 西荻窪 JAM, mod 柴崎, 中野 MOON STEP Artist extraction added/fixed: - warp-kichijoji: parse div.w-flyer (clone + remove nested notes-wrapper) - shibuya-o: rewrite to scrape each sub-venue; artist from li.p-scheduled-card__artist-item - moon-step-nakano: parse 出演 section from WordPress API description HTML - mod-shibasaki: fetch individual event pages in parallel; handle live:/出演:/・ bullet formats Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>