- 06 Sep, 2026 9 commits
-
-
PLN (Algolia) authored
-
PLN (Algolia) authored
-
PLN (Algolia) authored
-
PLN (Algolia) authored
-
PLN (Algolia) authored
-
Adds remark-gfm/directive/parse/rehype, rehype-pretty-code, shiki, unified, unist-util-visit; retires remark/remark-html. Under PnP there are no real node_modules dirs — cache zips live under paths *containing* /node_modules/, so jest's transformIgnorePatterns now only excludes the css module mocks, keeping the ESM-only unified chain transformable.
PLN (Algolia) authored -
The site ships as flat files (out/) served by self-hosted nginx; every route prerenders at build. next/image ships originals (unoptimized) — optimization needs a server. The two parvagues revalidate = 60 exports go with ISR; rebuild-on-push replaces it.
PLN (Algolia) authored -
The one render chain: remark-gfm, remark-directive (mapped-tag escape hatch for future embed islands), rehype-figure, rehype-pretty-code with vesper highlighting at build time. Shipped pages are flat HTML with inline token colors and zero client JS. - lib/markdown.ts mints all /blog HTML; lib/blog.js binds the section - app/blog + app/blog/[slug] on the App Router (SSG, generateMetadata); app/post/[id] and lib/posts.js removed with the route - content/posts moved to content/blog; the 2021 entries are draft:true, hello-world-again is the one published post (engine fixture: figure captioning, shiki, GFM table) with its edge.png image - yarn post / yarn post:image scaffold posts and stage images - e2e smoke routes follow the rename
PLN (Algolia) authored -
PLN (Algolia) authored
-
- 24 Aug, 2026 1 commit
-
-
Aurora-glass cosmos, frosted-glass cards with iridescent foil edges, Fraunces + Space Mono. Hybrid DRAW/BROWSE: chilled 3D tarot flip (spring 42/22/1.3), semantic swipes (left discard, right favorite, up stash), haptics, kept-spread; realtime typotolerant search with incremental 16-card rendering. Date-seeded daily card. State in localStorage + URL hash only. Each card face carries a unique deterministic sacred-geometry figure: mulberry32 seeded on card id + hexagram codepoint drives ring count, packing, rotation, polygon overlays, and dash patterns — 187/187 distinct, with a radial-mask quiet zone keeping the central text zone clear. App Router native: server pages export metadata, interactive bodies are 'use client' leaves (ObliqueClient / DesignClient), per cosmicfest conventions. Data: 187 deduped strategies (ceejbot cross-edition superset) tagged with I Ching hexagrams. Validated on the production build: routes 200, no console errors, no horizontal overflow, tap targets >=44px, browse incremental 16->48 on scroll, geometry uniqueness 48/48 sampled distinct, daily card deals, Fraunces 25px legible on mobile.
PLN (Algolia) authored
-
- 15 Aug, 2026 2 commits
-
-
Two gaps between the live page and the canonical invite text. 1. The lineup named the three acts but linked nowhere. PLN's invite carries a destination for each, so the page now sends people to the work: ParVagues -> soundcloud.com/parvagues Nesta Flex -> soundcloud.com/antoine-renaudet shipow -> instagram.com/shipow The anchor takes `color: inherit` so the existing odd/even cyan/magenta :hover rules on .lineupName stay in charge; the underline is a 30% mix that solidifies on hover/focus-visible rather than a permanent blue link. 2. The RSVP paragraph read "une réponse avant le 1er août, ce serait top." True when written, silently wrong since 2 August, and actively confusing today — 15 August, with arrivals open and jour J six days out. A page whose copy expires is the same failure as a countdown to a date that has passed. So it reads the clock instead of a frozen sentence. Four phases off the existing JOUR_J plus three new date constants: before the deadline, after it but pre-arrivals, during the 15-23 August window, and after — which hands over to the v3.42Hz teaser from the invite. Rendered null on the server and filled in an effect, because the phase depends on the viewer's clock and a server/client disagreement is a hydration mismatch. The invariant "pas de billetterie / Riders, come to the storm" line stays outside the component, so the paragraph still reads correctly if JS never arrives. Every other fact on the page was checked against the canonical invite and already matched: 20-23 August, arrivals from the 15th, Labenne-Océan, jour J the 22nd, 10 indoor places, tents, van, 16 capacity, +1 welcome, both stations, the 15-minute Bayonne->Labenne train, the taxis, and the packing list. Verified: clean build, all three hrefs present in the prerendered HTML, and zero occurrences of "1er août" in the server output.PLN (Algolia) authored -
origin/main carried PR #7 — the entanglement-themed CosmicFest rebuild, merged 2026-06-29 and LIVE on me.nech.pl/cosmicfest ever since. Meanwhile this branch hoisted the whole app out of next/ and deleted the Pages Router. The two sides had zero overlapping paths, so a naive `git diff --name-only` check reported no conflict — and was wrong in the most expensive way available: one side had deleted the entire tree the other side was editing. Resolving "ours" would have silently deleted the invite from a page guests are reading right now, six days before the festival. Resolving "theirs" would have resurrected the Pages Router. Both merge without complaint. So: a port. Git's rename detection did most of it — Countdown, the stylesheet and EntanglementField all landed at their App Router homes automatically. Five content hunks in the page body needed hand-resolution, all "theirs, adapted": - next/pages/cosmicfest/index.js -> app/cosmicfest/CosmicFestClient.js - <Head> block -> page.js `metadata` + `viewport` exports (App Router has no <Head>; theme-color moves to `viewport` per Next 15) - kept 'use client' and the @/ path aliases over the ../../ relatives - dropped the v0 June-21st countdown; JOUR_J is now 2026-08-22T18:00:00+02:00 Also fixes a build break that predates this merge and had nothing to do with it: #161 regenerated the OPAL tracks.json from the parsers, renaming `ingredients` to `samples` AND changing its shape — rich {type,code,description} objects became bare name strings. LiveEvent.js still called track.ingredients.map(), so /parvagues/live/opal-festival-2026 threw at prerender and failed the whole build. Now renders whichever generation is present, guarded with Array.isArray so a third shape can't crash the build either. Verified: yarn build clean, 86/86 static pages. /cosmicfest 6.04 kB vs the 6.3 kB the original PR measured. Built HTML carries intrication, v2.67Hz, Labenne, the full lineup, <title>cosmicfest_v2.67Hz</title>, theme-color #1a1330, and zero occurrences of "juin". The 2026-08-22 target is present in the shipped chunk. next/ stays deleted — 0 files.PLN (Algolia) authored
-
- 14 Aug, 2026 1 commit
-
-
These timecodes were generated before #148 — back when track boundaries came from Pulsar tab-focus events rather than from the audio. Tab focus records when PLN LOOKED at a file, not when the music changed, so every cut was wrong by however long he sat on a tab before evaluating it. Regenerated from the measured boundaries (segments_v3.json) via Tidal/tools/gig-metadata.py, which now reads that shape directly and matches segments to the setlist by title rather than by position. # track was now drift 5 You My Sunshine 0:25:41 0:25:58 +18s 7 Piment Bresilien 0:36:51 0:37:07 +17s 9 Perfect 0:48:24 0:49:14 +50s 10 Gimme Acid 0:53:39 0:54:12 +33s 11 Ghosts in the Toilets 0:58:48 0:59:20 +32s 13 Vague de CRIME 1:04:33 1:04:49 +16s 14 Desire 1:09:12 1:09:40 +28s totalDuration_s 4809 -> 4769.1. Tracks 1, 12 and 15 were already correct. Only timing changed: names, order, bpmRange, styleDistribution and all 60 samplePacks diff byte-identical against the previous file, and venue/stage are carried through verbatim. This matters beyond the website — Slopmotion reads this file to cut visuals to the set, so shipping it stale would have put the cuts half a minute off the music on a third of the album.
PLN (Algolia) authored
-
- 12 Aug, 2026 1 commit
-
-
Third Opal in a row and the first on the main stage. Saturday 8 Aug 2026, sunset slot, 1h20, 15 tracks of live-coded TidalCycles. tracks.json is GENERATED, not typed — Sound/Tidal/tools/gig-metadata.py reads membership/order/name/bpm/section from backlog.md via the setlist parser, the sample packs from each .tidal via setlist_samples, and the timecodes from the Ardour take. Nothing here was copied by hand, which is the point: the last time gig strings were hand-carried between files they were wrong. The per-track timecodes are new for a lives entry and deliberate — they let Shipow cut Slopmotion visuals to the set without re-deriving boundaries by ear. They were measured by aligning the 1 Hz gig log to the audio via cross-correlation (r>=0.99 over 20 probes, 0.00 ms spread). Note for whoever touches lives content next: the live tree is content/lives/, NOT content/parvagues/lives/ (legacy, last moved by the June hoist) and not next/content/lives/ (the path Sound/Tidal/CLAUDE.md still documents — stale since the app moved out of next/).
PLN (Algolia) authored
-
- 29 Jun, 2026 1 commit
-
-
Full redesign of the standalone invite page for the 2026 edition (20-23 August, Labenne-Ocean, jour J samedi 22). Concept: intrication (entanglement) - two states, one system, communicating across distance. Dark OKLCH design system with a paired cyan/magenta accent language, an EntanglementField canvas (starfield + mirrored particle pairs + 67Hz interference waveform), Archivo (wdth) + Martian Mono, replacing the v0 light theme. - new EntanglementField signature canvas (DPR-capped, mobile-scaled, full prefers-reduced-motion static path) - sections: hero, concept, jour-J lineup, sejour, hebergement, transport, packing, v0 souvenirs (lifted audio embeds + accessible photo lightbox), RSVP - countdown retargeted to 2026-08-22, hydration-safe placeholder - lightbox renders full-size via plain img with managed focus - add PRODUCT.md / DESIGN.md design context at repo root Verified: clean SSG build (6.3 kB), WCAG AA contrast, zero console errors, correct SSR + reduced-motion paths.
Paul-Louis NECH authored
-
- 23 Jun, 2026 1 commit
-
-
The canonical tracklist carried the old track name "Aria Sans Serif" and, worse, a `file` pointing at live/collab/raph/aria_sans_serif.tidal — a path that no longer exists. The track was renamed to Mafia Sans Serif in the score long ago (real file: mafia_sans_serif.tidal); only the published metadata lagged. Since the track identity in the armada catalog pipeline IS its .tidal path, the dangling ref meant the catalog keyed this track on a non-existent score. Fixed both the display name and the file ref to the real score. This is the canonical root: the armada catalog regenerates from here (tide.py build).
PLN (Algolia) authored
-
- 07 Jun, 2026 9 commits
-
-
Reflect Step 5: single lib/content/index.ts (two collection shapes), wrappers re-export from @/lib/content, plain string[] ids + .map((id) => ({ id })), and the parvagues-presence.ts seam. Co-Authored-By:Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PLN (Algolia) authored -
Phase 1 Step 5. Fold lib/utils.js (flat Markdown collections) and lib/livesData.js (year-foldered ParVagues gigs) into one module, lib/content/index.ts — two collection shapes in one entry, not one forced shape. Thin section wrappers (posts/hydras/poems/talks) now re-export from @/lib/content; the two ParVagues pages import the lives API from there too. Old lib/utils.js and lib/livesData.js deleted. - strip the per-file console.log noise that was in lib/utils.js; - getAllContentIds now returns plain string[]; the three dynamic pages drop the vestigial Pages-Router `.map(({params}) => params)` adapter for `.map((id) => ({ id }))`; - add lib/content/parvagues-presence.ts: a single thin seam holding the already-in-repo platform links, so a future tooling-emitted presence.json swaps in without touching components. No schema, no invented links, components not yet rewired (deliberate). Verified: prod build green (14 routes, all dynamic params intact); fresh-dev smoke 14/14. Co-Authored-By:Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PLN (Algolia) authored -
Phase 1 Step 4. Move the palette out of globals.css :root into a new styles/tokens.css: a neutral/professional default on :root (landing + content) and the ParVagues neon/dark palette scoped to [data-theme="parvagues"], set on the app/parvagues/layout.tsx wrapper. The ~90 var(--…) consumers resolve against that ancestor scope, so theming is one attribute — no per-component edits. - globals.css: drop the :root palette + hardcoded dark html/body bg; body now reads var(--surface)/var(--text-primary). - parvagues.module.css: remove the dead duplicate .colorRoot/.colorContainer. - main.css: replace the body:not(:has(.parvagues-root)) element-style hack with a positive .site-shell scope on the content Layout container; links use the new --link token. - delete dead styles/dunbar.module.css. Verified: prod build green (14 routes, ParVagues ISR intact); fresh-dev smoke all 200; data-theme scoping confirmed (landing neutral, parvagues neon). Co-Authored-By:Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PLN (Algolia) authored -
Step 3 (group 3 of 3) — completes the App Router migration. The Pages Router is now fully gone (no more pages/ or _app.js). - /cosmicfest: server metadata wrapper + CosmicFestClient ('use client') for the modal/keyboard state. Swapped the deprecated next/image layout="intrinsic"/objectFit props for modern width/height + style. - Deleted the dead legacy shells components/ParVaguesHeader.js and components/ParVaguesFooter.js (only ever referenced by commented-out imports in CosmicFest). - tests/jest.setup.js: mock next/navigation (App Router hooks) instead of next/router. - CLAUDE.md: Pages Router -> App Router throughout (global CSS from app/layout.tsx, server-components-by-default + 'use client' leaves, generateStaticParams, the root-shell + ParVagues-sub-layout split, next/navigation in tests). Full App Router build green; route-smoke 14/14. Co-Authored-By:Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PLN (Algolia) authored -
Step 3 (group 2 of 3). Moves /parvagues, /parvagues/fiche, /parvagues/live and /parvagues/live/[slug] to the App Router under a single segment layout, retiring the old per-page components/parvagues/Layout.js. - app/parvagues/layout.tsx: the ParVagues sub-shell (Syne via next/font, parvagues-root/noise-overlay wrapper, footer) inheriting the root shell. Header scroll-state and the `.reveal` IntersectionObserver are split into client leaves (ParvaguesHeader, RevealController); the latter re-arms on client-side navigation via usePathname so reveals keep working between pages. - Pages become thin server components: data fetch + metadata + segment config (revalidate=60 on /parvagues and /parvagues/live/[slug] preserved; getStaticPaths -> generateStaticParams; per-page <title> -> metadata). - /parvagues/live redirect: client useRouter.replace -> server redirect(). - /parvagues/live/[slug]: the interactive body (Prism, loupe, countdown, gallery) extracted to a client component (LiveEvent); the server page does the fs/data fetch. - /parvagues/fiche: window.print + <style jsx global> body extracted to a client component (FicheContent) behind a server metadata wrapper. - Marked the page-rendered feature components 'use client' (TourTimeline, MusicSection, VideoSection, BookingForm); Hero/BioSection/ AsSeenAt stay server. - Dropped og:type="music.musician" (not in Next's typed Metadata enum; it threw at prerender) — inherits the root "website" default; see note for Phase 2. Build green; route-smoke 14/14. Only /cosmicfest remains on the Pages Router. Co-Authored-By:Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PLN (Algolia) authored -
Step 3 (group 1 of 3) of the foundation redesign. Stands up the root App-Router shell and moves the low-risk static/content routes onto it, leaving ParVagues + CosmicFest on the Pages Router for now (no route URL changes — the smoke net stays green across the split). - app/layout.tsx: the one root shell (<html>/<body> + global CSS), with the shared <head> (OG/twitter/icons/title template) consolidated from components/layout.js into the Metadata API. - Migrated: / , /talks, /starry-nights, /hydra, /hydra/[id], /post/[id], /poesie/[id], /poesie, /fleurs. getStaticProps -> inline server fetch; getStaticPaths -> generateStaticParams; <Head> -> metadata. - components/layout.js: now a client component using next/navigation (router.back) instead of next/router; <Head> removed. - Client boundaries split out where needed: HydraClient (ssr:false dynamic), PoemsBrowser (filter/sort state), FleursClient (p5 + styled-jsx). - Deprecation sweep: dropped next/link legacyBehavior (talks, starry-nights; they wrapped invalid nested anchors) and the render-blocking Google Fonts <link> on /fleurs (now next/font Cormorant Garamond). Removed dead ReactPlayer import on /talks. - tsconfig moduleResolution -> bundler; added .yarn/sdks (PnP TS SDK for editors). next.config: skip Next's build-time type-check — its generated route validators deep-import a Next-internal type that stock (non-PnP) tsc can't resolve in Yarn PnP zips; SWC compile + lint + smoke are the gates. Build green (App + Pages split); route-smoke 14/14. Co-Authored-By:Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PLN (Algolia) authored -
Re-establish a baseline of coverage (Phase 0 removed all tests with Dunbar) and guard the upcoming App Router migration: the route URLs are stable across that migration, so this spec must stay green before and after. - tests/e2e/smoke.spec.ts: visits all 14 public routes, asserts the document responds < 400, renders non-empty content, and throws no genuine uncaught exception. Tolerates dev-only React hydration warnings and third-party embed noise (would otherwise be flaky); caps the settle wait so embed-heavy pages don't hang. - Fix a pre-existing Playwright version split: @playwright/test (1.57.0 via ^1.55.0) and playwright (1.58.2) resolved to two copies, breaking the runner ("test() not expected here"). Pin both to 1.60.0. All 14 routes green (~55s, Node 20). Surfaced for later: a real /cosmicfest dev-mode hydration mismatch (task #7), a legacyBehavior next/link deprecation, and a next/head stylesheet warning — all to address in the App Router pass. Co-Authored-By:Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PLN (Algolia) authored -
Flatten the nested next/ app directory up to the repository root, removing the `cd next` friction that the old .cursor/rules existed largely to manage. - Move all app files (pages, components, lib, styles, content, public, tests, scripts, configs) and Yarn Zero-Install state (.pnp.cjs, .yarn/) from next/ to repo root via git mv (history preserved, 316 renames). - Merge next/.gitignore into the root .gitignore; note .pnp.cjs/.yarn are committed (Zero-Install) and must not be ignored. - Pin outputFileTracingRoot to the project in next.config.js: a stray ~/package-lock.json was making Next infer the wrong workspace root. Also makes standalone output tracing correct for self-hosting later. - Update CLAUDE.md: commands run from repo root; @/ alias, content/, public/, .next/ paths corrected; Vercel root dir must become '.'. Build green from root (yarn build, Node 20, all 14 route patterns, zero warnings). Content loaders (process.cwd()-based) resolve correctly since content/ and public/ now sit at the root. Co-Authored-By:Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PLN (Algolia) authored -
Demolition step ahead of the site rationalization (App Router + shared design system foundation to follow). - Remove Dunbar entirely (pages, components, lib, tests); it's folding into a separate project. UX learnings preserved at docs/dunbar-design-learnings.md. - Prune 6 now-unused deps: d3-force, d3-zoom, minisearch, react-force-graph(-2d), snowball-stemmers, stopword. - Fix 3 production bugs in layout.js: drop the http://localhost:8097 React DevTools script, replace the create-next-app template OG image with the site profile image, and compute the footer year dynamically. - Delete dead files: pages/parvagues.js.backup, the unused HeroVariants. - Add CLAUDE.md documenting the codebase and the redesign state. Build green (yarn build, 40 routes). Note: this removes all test coverage (it was all Dunbar's) — to be re-established in Phase 2. Co-Authored-By:
Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PLN (Algolia) authored
-
- 24 May, 2026 3 commits
-
-
Shrink the loupe popup to (viewport_width - 32px) when 480px would overflow, keeping the 16:9 aspect ratio. Centering math uses the computed width so the clamp keeps the popup fully on-screen.
PLN (Algolia) authored -
On touch devices the loupe overlay is now revealed by the first tap on a track thumbnail (the link's default action is prevented). A second tap on the same thumbnail navigates to the Instagram album. Tap-outside or 4s timeout auto-closes the loupe. Desktop hover behavior unchanged — gated on (hover: hover) media query.
PLN (Algolia) authored -
15-track collapsible list driven by metadata extracted from the .tidal sources via the Pulsar HUD parser. Each row: name, BPM, style, expandable ingredients (per-orbit sample/role/CC bindings) + git.nech.pl src link. Six tracks have IG story loops (5s, 16:9 cropped from 9:16 originals, ~150 KB each) with a fixed-position hover loupe (480×270) that escapes the row's clipping box; click opens the highlight album. Page-level SC embed + Instagram album link in MediaSection. Full-length story MP4s gitignored — only the loop previews + jpg thumbs ship.
PLN (Algolia) authored
-
- 01 May, 2026 1 commit
-
-
Sleek single-page fiche technique to share with festivals and venues: show info, artist apport, audio/video/electrical/stage requirements, SVG stage plot, timings, contact. Print-optimised CSS for dense A4 PDF export via the browser's print dialog. Co-Authored-By:Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PLN (Algolia) authored
-
- 16 Mar, 2026 5 commits
-
-
Opal Festival (Normandie): Aug 10 2024, Aug 10 2025. SoundCloud + Spotify recordings linked. Remove duplicate Bazurto 2024 (only played 2022). Update ontology with Opal venue + event data.
PLN (Algolia) authored -
Seed venues.yaml, samples.yaml, events.yaml from artist domain knowledge. Add country flag detection in TourTimeline (France/Germany/Online).
PLN (Algolia) authored -
Smoothed Catmull-Rom SVG chart with neon accent on dark bg. Global Y-axis (60-170 BPM) for cross-set comparison. Fix hallucinated sample description (Private Number = Judy Clay & William Bell).
PLN (Algolia) authored -
Wave logo takes center stage with neon glow, title below in spaced uppercase, radial gradient backdrop.
PLN (Algolia) authored -
- Tidal source analysis: ~60 tracks across 20 gigs mapped to .tidal files with 5 key ingredients each (pattern/sample/effect/technique/structure) - Fix streaming embeds: SoundCloud user ID, YouTube video ID, Bandcamp params - Live subpages: rewrite [slug].js with proper frontmatter access, server-side isPostEvent, MediaSection with SoundCloud/archive.org inline embeds - REC badge: clickable button opens best audio source directly - AsSeenAt: correct URLs (TOPLAP, Opal, Cookie Collective), tighter layout - Replace em dashes with hyphens across all content - Fix past events showing "details coming soon" - FairyTeuf location: PSC
PLN (Algolia) authored
-
- 15 Mar, 2026 6 commits
-
-
PLN (Algolia) authored
-
PLN (Algolia) authored
-
- Add BioSection (livecoding explainer + genre tags) after hero - Add AsSeenAt strip (TOPLAP, Algorave GZ, Opal, Cookie, 38C3, 39C3) - Featured Algorave GZ25 video with neon badge - New releases: CosmicFest album + Ton Numéro single with covers - Fix Bandcamp/Spotify/YouTube streaming embeds + privacy consent - Fix social links: remove Bluesky, GitLab at nech.pl/Tidal - New live events: 38C3 House of Tea, Chaos Music Club, 39C3 sets - Track metadata with Tidal code ingredients for 3 pilot gigs - Poster support on live subpages (Algorave GZ25 poster) - Expandable track breakdowns with code snippets on subpages
PLN (Algolia) authored -
PLN (Algolia) authored
-
- Add 2 YouTube performances: Algorave GZ25, Live Coding @ Algolia - Privacy-first: YouTube embeds require click consent (shows thumbnail + "Cliquer pour charger depuis YouTube" overlay). Archive.org loads directly (privacy-friendly host) - Use youtube-nocookie.com for embeds (no tracking cookies) - Fix hero title: clamp(3rem, 12vw, 9rem) to prevent overflow clipping - Videos sorted reverse-chronological, archive.org prioritized over YouTube when both exist for same performance
PLN (Algolia) authored -
- Remove max-w-4xl from hero content (title was clipped at "ParVag") - Scope main.css img rule to non-parvagues pages (was forcing max-width:100% + display:block on next/image fill elements in Firefox) - Use inline styles for video thumbnail positioning to avoid CSS specificity issues with legacy rules
PLN (Algolia) authored
-