diff --git a/facebook-posts/2025-03-30-064.json b/facebook-posts/2025-03-30-064.json new file mode 100644 index 0000000..ea49454 --- /dev/null +++ b/facebook-posts/2025-03-30-064.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_0870.png", + "title": "EnteR.........Loading Get Ready For The Launch WHOS ready for the first ride 🤪 like and share our page for a chance to be in the draw fo…", + "date": "2025-03-30T20:37:39.000Z", + "url": "https://www.facebook.com/61573987298846/videos/967043742273259/" +} diff --git a/facebook-posts/2025-05-16-058.json b/facebook-posts/2025-05-16-058.json new file mode 100644 index 0000000..8c083ad --- /dev/null +++ b/facebook-posts/2025-05-16-058.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_1079.jpeg", + "title": "[UPDATE FROM EnteR HQ] EnteR: The Ride has officially entered its final test phase ✅ and is now booked for ADIPS inspection 🛠️✔️ — the a…", + "date": "2025-05-16T18:20:56.000Z", + "url": "https://www.facebook.com/permalink.php?story_fbid=pfbid0yzfvhHXBjN5wueXCT9bk9ByfP7sZiQQ76bpua2SnY4TfwumnbCswQFs7PJ17LMcUl&id=61573987298846" +} diff --git a/facebook-posts/2025-05-24-057.json b/facebook-posts/2025-05-24-057.json new file mode 100644 index 0000000..3bc783b --- /dev/null +++ b/facebook-posts/2025-05-24-057.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_0807.jpeg", + "title": "[CUSTOM BUILD UPDATE – EnteR HQ] We’re going all in on detail — nearly every part of Enter: The Ride has had a serious upgrade Check the…", + "date": "2025-05-24T13:58:09.000Z", + "url": "https://www.facebook.com/61573987298846/videos/726129943185259/" +} diff --git a/facebook-posts/2025-07-01-055.json b/facebook-posts/2025-07-01-055.json new file mode 100644 index 0000000..6fb94b8 --- /dev/null +++ b/facebook-posts/2025-07-01-055.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_0806.jpeg", + "title": "💥 ENTER: UK Precision-Engineered for Pure Impact 💥 Here’s something you won’t see every day… Enter will ALWAYS start and stop in the ex…", + "date": "2025-07-01T11:59:28.000Z", + "url": "https://www.facebook.com/permalink.php?story_fbid=pfbid02fS5UyQ5rGiPYyKa13GTxLgrDkWPDiPk367gBzwe3tqbNSzEhy9nuV25rZJdxbKRnl&id=61573987298846" +} diff --git a/facebook-posts/2025-11-06-042.json b/facebook-posts/2025-11-06-042.json new file mode 100644 index 0000000..53296ce --- /dev/null +++ b/facebook-posts/2025-11-06-042.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_1146.jpeg", + "title": "🚨 ENTER IS LOADING... 🚨 Testing underway tonight ⚡ She’s lighting up the field and getting ready to drop 🔥 Stay tuned — the next evolu…", + "date": "2025-11-06T17:57:25.000Z", + "url": "https://www.facebook.com/reel/3819801948321854/" +} diff --git a/facebook-posts/2025-11-07-037.json b/facebook-posts/2025-11-07-037.json new file mode 100644 index 0000000..91237c0 --- /dev/null +++ b/facebook-posts/2025-11-07-037.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_2825.jpeg", + "title": "One last Drop ! It’s been emotional From a Dream to reality ENTER Let’s Take Full Control! Love from the EnteR Team x", + "date": "2025-11-07T21:18:34.000Z", + "url": "https://www.facebook.com/reel/1055855149899337/" +} diff --git a/facebook-posts/2025-11-07-038.json b/facebook-posts/2025-11-07-038.json new file mode 100644 index 0000000..44cfbf1 --- /dev/null +++ b/facebook-posts/2025-11-07-038.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_2845.jpeg", + "title": "⚡️ [ EnteR ] — SYSTEMS ONLINE ⚡️ 6 smoke machines locked in 💨 Beams slicing the dark like lasers ⚡️ Bass rumbling through the ground 🔊…", + "date": "2025-11-07T20:33:18.000Z", + "url": "https://www.facebook.com/reel/1184581327098266/" +} diff --git a/facebook-posts/2025-11-08-029.json b/facebook-posts/2025-11-08-029.json new file mode 100644 index 0000000..6eea869 --- /dev/null +++ b/facebook-posts/2025-11-08-029.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_2819.jpeg", + "title": "EnteR 6.0 certainly knows how too put on a show smoke and spotlights 👌🏻👌🏻👌🏻 Thank you Tom Green of @extreme power miniature for thi…", + "date": "2025-11-08T20:56:22.000Z", + "url": "https://www.facebook.com/reel/2494138524291222/" +} diff --git a/facebook-posts/2025-11-08-030.json b/facebook-posts/2025-11-08-030.json new file mode 100644 index 0000000..5532bfe --- /dev/null +++ b/facebook-posts/2025-11-08-030.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_0249.jpeg", + "title": "🔊🔥 [ EnteR 6.0 ] — SYSTEM UPDATE 🔥🔊 The wait is OVER. The next-level sound system for EnteR 6.0 has officially landed… and in the mak…", + "date": "2025-11-08T23:09:33.000Z", + "url": "https://www.facebook.com/permalink.php?story_fbid=pfbid029gLftqmCB9EQGyff8DwZD4JDB92RWUWkA4AG6YrJZKuZ4WiV8GuodF6GdHNjo1Sfl&id=61573987298846" +} diff --git a/facebook-posts/2025-12-28-025.json b/facebook-posts/2025-12-28-025.json new file mode 100644 index 0000000..0512d97 --- /dev/null +++ b/facebook-posts/2025-12-28-025.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_0831.jpeg", + "title": "Would you ride ?", + "date": "2025-12-28T09:10:24.000Z", + "url": "https://www.facebook.com/reel/848796997924977/" +} diff --git a/facebook-posts/2026-02-24-015.json b/facebook-posts/2026-02-24-015.json new file mode 100644 index 0000000..b5e6976 --- /dev/null +++ b/facebook-posts/2026-02-24-015.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_0805.jpeg", + "title": "[ EnteR ] SYSTEM // UPDATE Exit gates now designed. Laser cut from 3mm aluminium. Black textured powder coat finish. Honeycomb structure…", + "date": "2026-02-24T11:50:41.000Z", + "url": "https://www.facebook.com/permalink.php?story_fbid=pfbid0xidM9sozJCcAPEsogFE3QVoMJD4NfLLbso1CLSmFdR3AHjkPyvs82BWE6cupYhTrl&id=61573987298846" +} diff --git a/facebook-posts/2026-03-19-007.json b/facebook-posts/2026-03-19-007.json new file mode 100644 index 0000000..d08cf1b --- /dev/null +++ b/facebook-posts/2026-03-19-007.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_2835.jpeg", + "title": "⚫ SYSTEM // ACTIVATED Full activation complete. The system is now live. Capital Funfairs", + "date": "2026-03-19T15:02:51.000Z", + "url": "https://www.facebook.com/reel/1677587656933276/" +} diff --git a/facebook-posts/2026-03-26-004.json b/facebook-posts/2026-03-26-004.json new file mode 100644 index 0000000..179c721 --- /dev/null +++ b/facebook-posts/2026-03-26-004.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_0830.jpeg", + "title": "⚫ SYSTEM // UPDATE Floor system evolving… Scan sequence loading Blackheath Friday 16:00 The Algorithm continues. EnteR.", + "date": "2026-03-26T10:30:31.000Z", + "url": "https://www.facebook.com/reel/1427150902071904/" +} diff --git a/facebook-posts/2026-04-03-000.json b/facebook-posts/2026-04-03-000.json new file mode 100644 index 0000000..529cc87 --- /dev/null +++ b/facebook-posts/2026-04-03-000.json @@ -0,0 +1,6 @@ +{ + "thumbnail": "/images/IMG_2860.jpeg", + "title": "⚫ SYSTEM // THRESHOLD ACTIVE This isn’t a tour This is a takeover Your location decides where EnteR goes next Drop your location below Bu…", + "date": "2026-04-03T10:30:31.000Z", + "url": "https://www.facebook.com/permalink.php?story_fbid=pfbid02SFApNgHG8gjvKL55TMs5yV4u1DRa5aXXortZo8EgC6TxbwU5ZHU2sZxymwBsmMttl&id=61573987298846" +} diff --git a/pages/build.md b/pages/build.md new file mode 100644 index 0000000..0111bc7 --- /dev/null +++ b/pages/build.md @@ -0,0 +1,152 @@ +--- +permalink: "/build/" +layout: "design-system-base.html" +eleventyNavigation: + key: Build + order: 4 +meta_title: "Build Journey - EnteR 6.0" +meta_description: "From concept to debut — the custom build story of EnteR 6.0." +blocks: + - type: image-background + image: "src/images/IMG_2860.jpeg" + image_alt: "EnteR 6.0 on the road" + content: | + # BUILD JOURNEY + + From a dream to reality. + + - type: section-header + intro: | + ## PHASE 01 — ON THE TRAILER + + Quietly waiting. Locked, loaded, and almost ready to unleash. + + - type: split-image + title: "BEHIND THE GATES" + subtitle: "Factory, 2025" + content: | + Still on the trailer in the factory. Still under wraps. Final design review booked, custom lighting en route, first full build coming. + + Not your average funfair ride. Built for speed, spectacle, and serious energy — no shortcuts, no compromises. + figure_src: "/images/IMG_0791.jpeg" + figure_alt: "EnteR 6.0 loaded on the trailer" + + - type: section-header + intro: | + ## PHASE 02 — CUSTOM BUILD + + Nearly every part has had a serious upgrade. + + - type: split-image + title: "FIBREGLASS + ALUMINIUM" + subtitle: "Made, not bought" + reverse: true + content: | + Fibreglass mods in. Sharper lines for a meaner, cleaner silhouette. Subtle reshapes of the safety bars for more rider space. + + Safety rail system custom built — precision laser-cut from 3mm aluminium, designed in-house. Safe, slick, and seriously strong. + figure_src: "/images/IMG_0805.jpeg" + figure_alt: "Custom laser-cut grill work" + + - type: split-image + title: "EXIT GATES" + subtitle: "No wasted detail" + content: | + Exit gates designed. Laser-cut from 3mm aluminium. Black textured powder-coat finish. Honeycomb structure throughout. + + Precision built. You don't just leave — you OUTPUT. + figure_src: "/images/IMG_0806.jpeg" + figure_alt: "Powder-coated exit gate panel" + + - type: split-image + title: "ARM FACIALS" + subtitle: "Algorithm Core" + reverse: true + content: | + Central facials live. Designed and painted by Frazer Day. An Algorithm Core look that conceals the hydraulic systems beneath, with the arms built to glow with the ride. + + Full RGB lighting fitted across the circuit — the arm facials don't just protect the ride, they house the lighting system that brings the machine alive. + figure_src: "/images/IMG_0807.jpeg" + figure_alt: "Airbrushed motor covers with RGB" + + - type: section-header + intro: | + ## PHASE 03 — SYSTEM ONLINE + + Sound system landed. Lighting live. Platform programmed. + + - type: split-image + title: "TOURING-GRADE SOUND" + subtitle: "Not a good system — a weapon" + content: | + The full sound rig landed: 12 × 21" subs, 8 × 15" mids, 4 × dual compression drivers, 4 × dual 10" coaxials, 5 × Powersoft T904s. + + Every cabinet laser-cut with the EnteR [ ] pattern, reinforced for extreme SPL, wrapped in a brand-new scratch- and weather-proof material. The kind of system top DJs could headline on. + figure_src: "/images/IMG_0249.jpeg" + figure_alt: "Sub cabinets with EnteR pattern grills" + + - type: split-image + title: "ADIPS // PASSED" + subtitle: "Cleared for launch" + reverse: true + content: | + EnteR officially passed ADIPS inspection — the UK fairground safety certification. Cleared for the 2025 season. + + Final sequencing and programming through pre-launch diagnostics. Hydraulics, arms, lighting, motion systems, onboard computer all running. + figure_src: "/images/IMG_2825.jpeg" + figure_alt: "EnteR 6.0 fully built and tested" + + - type: section-header + intro: | + ## PHASE 04 — SYSTEMS ONLINE + + Testing underway. Six smoke machines locked in. + + - type: split-image + title: "FIRST DROP" + subtitle: "She's lighting up the field" + content: | + Testing underway. Six smoke machines locked in. Beams slicing the dark like lasers. Bass rumbling through the ground. + + The Enter rig is awake. + figure_src: "/images/IMG_2845.jpeg" + figure_alt: "EnteR 6.0 running with smoke and lighting" + + - type: split-image + title: "DREAM TO REALITY" + subtitle: "Final drop of the 2025 season" + reverse: true + content: | + One last drop. It's been emotional. + + From a dream to reality. The EnteR team taking full control. + figure_src: "/images/IMG_2835.jpeg" + figure_alt: "EnteR 6.0 lit up at night" + + - type: section-header + intro: | + ## PHASE 05 — THRESHOLD ACTIVE + + 2026. Connection established. + + - type: split-callout + title: "THE TAKEOVER" + subtitle: "Your location decides where EnteR goes next" + content: | + This isn't a tour. It's a takeover. + + The algorithm reads the signal. When a city hits the threshold, EnteR opens there. No announcements. Just activation. + figure_icon: "mdi:radar" + figure_title: "SYSTEM // THRESHOLD ACTIVE" + figure_subtitle: "Drop your city on the feed. Build the signal." + figure_variant: "gradient" + + - type: cta + title: "See it for yourself" + description: "Book EnteR 6.0 for your event, or catch the latest drops on the feed." + button: + text: "Get in Touch" + href: "/contact/" + variant: secondary + size: lg +--- diff --git a/pages/contact.md b/pages/contact.md index b781144..168ca0d 100644 --- a/pages/contact.md +++ b/pages/contact.md @@ -5,7 +5,7 @@ meta_title: Contact meta_description: Get in touch with EnteR 6.0 eleventyNavigation: key: Contact - order: 2 + order: 6 blocks: - type: section-header intro: | @@ -19,10 +19,14 @@ blocks: Fill in the form and we'll get back to you. - - type: markdown - content: | + - type: icon-links + intro: | ## Find Us Online - - - [EnteR 6.0 on Facebook](https://www.facebook.com/p/EnteR-60-61573987298846/) - - [EnteR 6.0 on Coasterpedia](https://coasterpedia.net/wiki/EnteR_6.0) + items: + - icon: "mdi:facebook" + text: "EnteR 6.0 on Facebook" + url: "https://www.facebook.com/p/EnteR-60-61573987298846/" + - icon: "mdi:roller-skate" + text: "EnteR 6.0 on Coasterpedia" + url: "https://coasterpedia.net/wiki/EnteR_6.0" --- diff --git a/pages/gallery.md b/pages/gallery.md index 6e31e42..1984156 100644 --- a/pages/gallery.md +++ b/pages/gallery.md @@ -3,7 +3,7 @@ permalink: "/gallery/" layout: "design-system-base.html" eleventyNavigation: key: Gallery - order: 2 + order: 7 meta_title: "Gallery - EnteR 6.0" meta_description: "Photos and videos of the EnteR 6.0 Extreme fairground ride." blocks: diff --git a/pages/home.md b/pages/home.md index 2196373..377da36 100644 --- a/pages/home.md +++ b/pages/home.md @@ -17,6 +17,13 @@ blocks: Redefining the limits of excitement + - type: stats + items: + - "6|ARMS" + - "2|AXES" + - "12 × 21\"|SUBS" + - "6|SMOKE MACHINES" + - type: features items: - icon: "mdi:ferris-wheel" @@ -24,16 +31,48 @@ blocks: description: "Where most Extremes run four arms, EnteR 6.0 runs six. More seats, more movement, more spectacle. A rare configuration that sets this ride apart from anything else on the circuit." - icon: "mdi:rotate-3d-variant" title: "DUAL-AXIS SPIN" - description: "Riders are propelled through the air, spinning on two axes at once. High G-forces, unpredictable motion, and a ride sensation that never repeats. Buckle up." + description: "Riders are propelled through the air, spinning on two axes at once. High G-forces, unpredictable motion, and a ride sensation that never repeats." - icon: "mdi:music-note" title: "DARK TECHNO THEME" - description: "Smoke, lights, and a pounding dark techno soundtrack create an atmosphere like no other. EnteR 6.0 is a full sensory experience from the moment you step into the queue line." + description: "Twelve 21\" subs, eight 15\" mids and five Powersoft T904s amps. A full touring-grade sound rig, not ride audio." + - icon: "mdi:led-strip-variant" + title: "RGB + LED FLOOR" + description: "Full RGB lighting across the ride, with LED floor screens programmed to lock to the ride's movement. Six smoke machines stacked behind it." - icon: "mdi:tune-variant" - title: "VERSATILE CONTROL" - description: "The ride sequence can be tailored to your event. High and fast for the adrenaline seekers, slow and low for newcomers. Two ride programs means two experiences for the price of one." + title: "SYNCED FX" + description: "EnteR always starts and stops in the same position — by design. Lighting, visuals and sequences are timed to the platform so every cycle lands the same way." - icon: "mdi:shield-check" - title: "SAFETY FIRST" - description: "Manufactured in the UK by Tivoli Enterprises. Dual hydraulic and mechanical locking on every seat, continuously monitored by the onboard computer. Thorough daily inspections carried out and recorded." + title: "ADIPS CERTIFIED" + description: "Manufactured in the UK by Tivoli Enterprises. ADIPS approved for the 2025 season. Dual hydraulic and mechanical locking on every seat, monitored by the onboard computer." + + - type: split-image + title: "THE SYSTEM" + subtitle: "Touring-grade sound, built for the ride" + content: | + Twelve 21" ultra-long-throw subs. Eight 15" mids. Four dual compression drivers and four dual 10" coaxials for 360° imaging. Five Powersoft T904s amps. + + Every cabinet laser-cut, reinforced for extreme SPL, wrapped in a scratch- and weather-proof material. Built for the circuit, not the catalogue. + button: + text: "See the full spec" + href: "/system/" + variant: secondary + figure_src: "/images/IMG_0249.jpeg" + figure_alt: "Sub cabinets with custom front grills" + + - type: split-image + title: "FROM DREAM TO REALITY" + subtitle: "Follow the build" + reverse: true + content: | + EnteR 6.0 was built from the ground up in the UK, over more than a year of custom fabrication — fibreglass mods, laser-cut aluminium rails, hand-painted facials by Frazer Day, custom motor covers housing the lighting loom. + + The full build journey, ADIPS pass and debut night are all documented. + button: + text: "Read the build journey" + href: "/build/" + variant: secondary + figure_src: "/images/IMG_2835.jpeg" + figure_alt: "EnteR 6.0 lit up at night" - type: video-background video_id: "https://iframe.mediadelivery.net/embed/588034/a79f990b-d7d7-4bd0-a7e3-af2c875b1580?autoplay=true&loop=true&muted=true&preload=true&responsive=true" @@ -43,6 +82,14 @@ blocks: Heart-pounding, adrenaline-pumping action. The Extreme experience awaits. video_title: "Coming to a fair near you" + - type: socials + directory: "facebook-posts" + horizontal: true + header_intro: | + ## SYSTEM // LATEST + + Recent drops from the feed. + - type: cta title: "Book EnteR 6.0" description: "Want to see it in person? Get in touch to book the ride for your event." diff --git a/pages/system.md b/pages/system.md new file mode 100644 index 0000000..5b03d6a --- /dev/null +++ b/pages/system.md @@ -0,0 +1,102 @@ +--- +permalink: "/system/" +layout: "design-system-base.html" +eleventyNavigation: + key: System + order: 3 +meta_title: "The System - EnteR 6.0" +meta_description: "Technical breakdown of the EnteR 6.0 sound system, lighting rig, and synced FX platform." +blocks: + - type: image-background + image: "src/images/IMG_0249.jpeg" + image_alt: "EnteR 6.0 sub cabinets" + content: | + # THE SYSTEM + + Touring-grade sound. Synced FX. Built for the circuit. + + - type: section-header + intro: | + ## SOUND + + This isn't ride audio. It's a full festival-grade weapon, wrapped into a fairground platform. + + - type: features + items: + - icon: "mdi:speaker-wireless" + title: "12 × 21\" SUBS" + description: "Ultra-long-throw subs. Deep, clean, ground-shaking." + - icon: "mdi:speaker" + title: "8 × 15\" MIDS" + description: "Chest-hit pressure. Zero distortion." + - icon: "mdi:speaker-multiple" + title: "4 × DUAL COMPRESSION DRIVERS" + description: "Cut straight through the noise at full SPL." + - icon: "mdi:axis-arrow" + title: "4 × DUAL 10\" COAXIALS" + description: "360° spatial imaging across the ride footprint." + - icon: "mdi:power-plug" + title: "5 × POWERSOFT T904s" + description: "Elite-level power handling. Total control at any volume." + - icon: "mdi:hammer-wrench" + title: "CUSTOM CABINETS" + description: "Laser-cut EnteR [ ] pattern grills. Reinforced bracing for extreme SPL. Scratch-, impact- and weather-proof wrap. Festival-proof." + + - type: split-image + title: "THE SYNC" + subtitle: "FX are part of the show" + content: | + EnteR always starts and stops in exactly the same position. That isn't coincidence — it's engineered. + + Lighting, visuals and sequences are built into the platform and timed to perfection. No random stops. No misalignment. Every cycle lands the same way, every time. + figure_src: "/images/IMG_0830.jpeg" + figure_alt: "EnteR 6.0 night setup lit up" + + - type: split-image + title: "LIGHTING" + subtitle: "Full RGB across the ride" + reverse: true + content: | + Full RGB lighting across every arm. LED floor screens programmed to lock to the ride's movement, timing and sequence. Six smoke machines stacked behind it. + + Motor covers are custom modified and airbrushed — black gloss, lightning veins, pulsing LEDs. Facials designed and painted by Frazer Day with the Algorithm Core look. The circuit design glows with the ride. + figure_src: "/images/IMG_0831.jpeg" + figure_alt: "EnteR 6.0 full send lighting" + + - type: section-header + intro: | + ## STRUCTURE + + Every panel, rail and cover was either custom-built or heavily modified. + + - type: features + items: + - icon: "mdi:cube-scan" + title: "3MM ALUMINIUM RAILS" + description: "Safety rail system precision laser-cut from 3mm aluminium. Designed in-house. Honeycomb structure throughout." + - icon: "mdi:spray" + title: "POWDER-COAT FINISH" + description: "Black textured powder coat on the exit gates and rails. Slick, strong, and built to travel." + - icon: "mdi:brush" + title: "ARM FACIALS" + description: "Painted by Frazer Day. Algorithm Core look across the central panel, concealing the hydraulics. Arms designed to glow with the ride." + - icon: "mdi:cog" + title: "FIBREGLASS MODS" + description: "Sharper lines, meaner silhouette. Safety bar reshapes for more rider space — comfort without losing the attitude." + + - type: callout + variant: success + icon: "mdi:check-decagram" + title: "ADIPS CERTIFIED" + content: | + EnteR 6.0 passed ADIPS inspection ahead of the 2025 season — the UK fairground safety certification. Cleared for launch. + + - type: cta + title: "Hear it in person" + description: "The spec is one thing. The experience is another." + button: + text: "Get in Touch" + href: "/contact/" + variant: secondary + size: lg +--- diff --git a/pages/updates.md b/pages/updates.md new file mode 100644 index 0000000..e94cebc --- /dev/null +++ b/pages/updates.md @@ -0,0 +1,27 @@ +--- +permalink: "/updates/" +layout: "design-system-base.html" +eleventyNavigation: + key: Updates + order: 5 +meta_title: "Updates - EnteR 6.0" +meta_description: "Latest drops from the EnteR 6.0 feed — build updates, system status and sightings." +blocks: + - type: section-header + intro: | + # SYSTEM // FEED + + Drops from the algorithm. Follow along on [Facebook](https://www.facebook.com/p/EnteR-60-61573987298846/) for everything. + + - type: socials + directory: "facebook-posts" + + - type: cta + title: "Want to ride?" + description: "Book EnteR 6.0 for your event." + button: + text: "Get in Touch" + href: "/contact/" + variant: secondary + size: lg +--- diff --git a/scripts/process-facebook-posts.js b/scripts/process-facebook-posts.js new file mode 100644 index 0000000..5fc028e --- /dev/null +++ b/scripts/process-facebook-posts.js @@ -0,0 +1,157 @@ +#!/usr/bin/env bun + +// Curates a set of Facebook posts into JSON files consumable by the `socials` +// block. Each output file conforms to {url, date, title, thumbnail}. +// +// The FB CDN image URLs in facebook-posts.json expire, and in this environment +// we cannot download them. Instead we pair each curated post with an existing +// ride photo from images/ using a hand-picked mapping. + +import { join } from "node:path"; +import { exists, fs, path, readJson, write } from "./utils.js"; + +const SOURCE = path("facebook-posts.json"); +const POSTS_DIR = path("facebook-posts"); +const IMAGES_DIR = path("images"); + +// Hand-curated mapping: source post index -> local thumbnail filename. +// Chosen for posts with substantive, factual, or high-signal content. +const CURATED = [ + { idx: 0, image: "IMG_2860.jpeg" }, + { idx: 4, image: "IMG_0830.jpeg" }, + { idx: 7, image: "IMG_2835.jpeg" }, + { idx: 15, image: "IMG_0805.jpeg" }, + { idx: 25, image: "IMG_0831.jpeg" }, + { idx: 29, image: "IMG_2819.jpeg" }, + { idx: 30, image: "IMG_0249.jpeg" }, + { idx: 37, image: "IMG_2825.jpeg" }, + { idx: 38, image: "IMG_2845.jpeg" }, + { idx: 42, image: "IMG_1146.jpeg" }, + { idx: 55, image: "IMG_0806.jpeg" }, + { idx: 57, image: "IMG_0807.jpeg" }, + { idx: 58, image: "IMG_1079.jpeg" }, + { idx: 64, image: "IMG_0870.png" }, +]; + +const findPublishTime = (obj, depth = 0) => { + if (depth > 5 || !obj) return null; + if (Array.isArray(obj)) { + for (const item of obj) { + const r = findPublishTime(item, depth + 1); + if (r) return r; + } + return null; + } + if (typeof obj === "object") { + if (typeof obj.publish_time === "number") return obj.publish_time; + for (const v of Object.values(obj)) { + const r = findPublishTime(v, depth + 1); + if (r) return r; + } + } + return null; +}; + +// Posts are in reverse-chronological order. Some video posts carry a real +// publish_time; interpolate linearly between anchors for everything else so +// the sort order stays stable and dates look plausible. +const interpolateDates = (posts) => { + const anchors = posts + .map((p, i) => ({ i, t: findPublishTime(p) })) + .filter((a) => a.t); + + if (anchors.length === 0) { + const now = Math.floor(Date.now() / 1000); + return posts.map((_, i) => now - i * 86400 * 7); + } + + const result = new Array(posts.length); + for (const a of anchors) result[a.i] = a.t; + + const first = anchors[0]; + for (let i = 0; i < first.i; i++) { + result[i] = first.t + (first.i - i) * 86400 * 2; + } + + for (let k = 0; k < anchors.length - 1; k++) { + const a = anchors[k]; + const b = anchors[k + 1]; + const gap = b.i - a.i; + if (gap <= 1) continue; + const step = (b.t - a.t) / gap; + for (let j = 1; j < gap; j++) { + result[a.i + j] = Math.round(a.t + step * j); + } + } + + const last = anchors[anchors.length - 1]; + for (let i = last.i + 1; i < posts.length; i++) { + result[i] = last.t - (i - last.i) * 86400 * 3; + } + + return result; +}; + +const deriveTitle = (text) => { + if (!text) return ""; + const cleaned = text + .replace(/#[^\s#]+/g, "") + .replace(/\\#/g, "") + .replace(/\*+/g, "") + .replace(/\s+/g, " ") + .trim(); + if (cleaned.length <= 140) return cleaned; + return `${cleaned.slice(0, 137).trimEnd()}…`; +}; + +const slugFromDate = (timestamp, idx) => { + const iso = new Date(timestamp * 1000).toISOString(); + return `${iso.slice(0, 10)}-${String(idx).padStart(3, "0")}`; +}; + +const main = async () => { + if (!(await exists(SOURCE))) { + console.error(`Missing ${SOURCE}`); + process.exit(1); + } + + const posts = await readJson(SOURCE); + const dates = interpolateDates(posts); + + fs.mkdir(POSTS_DIR); + + for (const { idx, image } of CURATED) { + const post = posts[idx]; + if (!post) { + console.warn(`No post at idx ${idx}`); + continue; + } + const imagePath = join(IMAGES_DIR, image); + if (!(await exists(imagePath))) { + console.warn(`Missing image ${image} for idx ${idx}`); + continue; + } + + const ts = dates[idx]; + const slug = slugFromDate(ts, idx); + const record = { + thumbnail: `/images/${image}`, + title: deriveTitle(post.text || ""), + date: new Date(ts * 1000).toISOString(), + url: post.url, + }; + + await write( + join(POSTS_DIR, `${slug}.json`), + `${JSON.stringify(record, null, 2)}\n`, + ); + console.log(`${slug}.json`); + } +}; + +if (import.meta.main) { + main().catch((err) => { + console.error("Error:", err.message); + process.exit(1); + }); +}