From eadf3eec1fbf579644aea0a5a6f598457a1aa159 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 12 Oct 2026 20:44:34 +0000 Subject: [PATCH 1/2] Add four themed road trip journal SEO landing pages. Add /route-66-road-trip-journal, /pacific-coast-highway-road-trip-journal, /national-parks-road-trip-journal, and /texas-hill-country-road-trip-journal using the same public route, sitemap, verify-live, campaign, and SEO wiring as the existing journal landings. Co-authored-by: Patrick --- .ai/HANDOFF.md | 19 ++- server/src/app.ts | 4 +- server/tests/api.test.ts | 79 +++++++++++- server/tests/campaign.test.ts | 4 + server/tests/verify-live.test.ts | 4 + tools/verify-live/FEATURE_MAP.md | 6 +- tools/verify-live/expectations.json | 4 + web/apple-music-soundtrack.html | 2 +- web/national-parks-road-trip-journal.html | 109 +++++++++++++++++ ...cific-coast-highway-road-trip-journal.html | 113 +++++++++++++++++ web/private-driving-journal.html | 1 + web/road-trip-journal-app.html | 4 + web/route-66-road-trip-journal.html | 115 ++++++++++++++++++ web/sitemap.xml | 4 + web/texas-hill-country-road-trip-journal.html | 113 +++++++++++++++++ 15 files changed, 565 insertions(+), 16 deletions(-) create mode 100644 web/national-parks-road-trip-journal.html create mode 100644 web/pacific-coast-highway-road-trip-journal.html create mode 100644 web/route-66-road-trip-journal.html create mode 100644 web/texas-hill-country-road-trip-journal.html diff --git a/.ai/HANDOFF.md b/.ai/HANDOFF.md index 3489592d..dd6a5d14 100644 --- a/.ai/HANDOFF.md +++ b/.ai/HANDOFF.md @@ -2,31 +2,30 @@ ## Current objective -Ship responsive LCP hero images on `/apple-music-soundtrack` and `/private-driving-journal`. Do not merge, deploy, or change hosting, DNS, analytics, or CSP. +Ship four themed road-trip SEO landing pages in one draft PR. Do not merge or deploy. ## Checkout -- Branch `cursor/hero-lcp-srcset-952c` off `main`. +- Branch `cursor/road-trip-journal-seo-pages-2843` off `main`. ## Material changes -- Shared LCP art is `web/assets/beta/grand-touring-home.webp` (1536x1024, 315 KB), used as the `.hero` CSS background on both pages. -- Added `grand-touring-home-800.webp` (91 KB) and `grand-touring-home-1600.webp` (258 KB) beside the original, versioned with `?v=1`. -- Both pages now use an absolutely positioned `.hero-photo` with srcset/sizes, preload, and `fetchpriority="high"`. Other public pages keep the CSS background. -- `server/tests/api.test.ts` asserts 200 + immutable cache on the resized files and preload markup on both pages. +- New public pages: `/route-66-road-trip-journal`, `/pacific-coast-highway-road-trip-journal`, `/national-parks-road-trip-journal`, `/texas-hill-country-road-trip-journal`. +- Wired like #268/#270/#273/#276: `publicPaths`, `app.get` sendFile, sitemap, server tests, verify-live expectations, feature map, canonical/meta/OG/JSON-LD/Umami, plain App Store CTA plus `campaign.js`. +- Copy from the draft, minus unconfirmed personal lines (kids anecdote, kolaches, George Strait, PCH "what was playing"). No em/en dashes. Journeys start only when the user taps Start Journey. +- Cross-links from `/road-trip-journal-app`, `/private-driving-journal`, and the Apple Music soundtrack footer. ## Verification - `node --test --import tsx server/tests/api.test.ts` - `node --test --import tsx server/tests/campaign.test.ts server/tests/verify-live.test.ts` -- Playwright screenshots at 390x844 and 1280x800 (before and after). Mobile selects 800w; desktop selects 1600w. +- Desktop 1280 and mobile 390 screenshots of each page in the PR body. ## Unresolved / owner decisions -- Lab Lighthouse after-numbers still need to be recorded in the PR if the environment can run Lighthouse. -- PR 262 (verify:live) remains a separate review. Do not merge or deploy from this session. +- Keep the PR as a draft. Do not merge or deploy from this session. ## Next steps -1. Keep this hero LCP PR open for review. Do not merge or deploy. +1. Keep the four-page SEO PR open for review. Do not merge or deploy. 2. Confirm JourneyDeck CI is green. diff --git a/server/src/app.ts b/server/src/app.ts index 5e3b29f3..09f73655 100644 --- a/server/src/app.ts +++ b/server/src/app.ts @@ -22,7 +22,7 @@ import { loadTessieRouteCoordinates } from "./tessie-route.js"; declare module "fastify" { interface FastifyRequest { principal: Principal | null } } const googleSiteVerificationPath = "/google8e611381b21882a8.html"; -const publicPaths = new Set(["/healthz", "/readyz", "/login", "/login.html", "/privacy", "/privacy.html", "/apple-music-soundtrack", "/private-driving-journal", "/driving-journal", "/road-trip-journal-app", "/road-trip-tracker-app", "/travel-journal-app-with-photos", "/driving-history-app", "/support", "/support.html", "/terms", "/terms.html", "/robots.txt", "/.well-known/api-catalog", "/openapi.json", "/api-docs", "/auth.md", "/sitemap.xml", "/manifest.webmanifest", "/favicon.ico", googleSiteVerificationPath]); +const publicPaths = new Set(["/healthz", "/readyz", "/login", "/login.html", "/privacy", "/privacy.html", "/apple-music-soundtrack", "/private-driving-journal", "/driving-journal", "/road-trip-journal-app", "/road-trip-tracker-app", "/travel-journal-app-with-photos", "/driving-history-app", "/route-66-road-trip-journal", "/pacific-coast-highway-road-trip-journal", "/national-parks-road-trip-journal", "/texas-hill-country-road-trip-journal", "/support", "/support.html", "/terms", "/terms.html", "/robots.txt", "/.well-known/api-catalog", "/openapi.json", "/api-docs", "/auth.md", "/sitemap.xml", "/manifest.webmanifest", "/favicon.ico", googleSiteVerificationPath]); const publicAuthPaths = new Set(["/api/auth/login", "/api/auth/passkey/options", "/api/auth/passkey/verify"]); const scheduledSyncPath = "/api/spotify/sync"; const securityHeaders = { @@ -324,7 +324,7 @@ export async function createApp(overrides: CreateAppOverrides = {}) { app.get(retiredLandingPath, async (_req, reply) => reply.code(404).header("x-robots-tag", "noindex, nofollow").sendFile("404.html")); } } - app.get("/", async (_req, reply) => reply.sendFile(cfg.mode === "web" ? "beta.html" : "index.html")); app.get("/app", async (_req, reply) => reply.sendFile("index.html")); app.get("/spotify-callback", async (_req, reply) => reply.sendFile("index.html")); app.get("/login", async (_req, reply) => reply.sendFile("login.html")); app.get("/.well-known/api-catalog", async (_req, reply) => reply.type("application/linkset+json").send(await readFile(join(cfg.webRoot, "api-catalog.json")))); app.get("/api-docs", async (_req, reply) => reply.sendFile("api-docs.html")); app.get("/privacy", async (_req, reply) => reply.sendFile("privacy.html")); app.get("/apple-music-soundtrack", async (_req, reply) => reply.sendFile("apple-music-soundtrack.html")); app.get("/private-driving-journal", async (_req, reply) => reply.sendFile("private-driving-journal.html")); app.get("/road-trip-journal-app", async (_req, reply) => reply.sendFile("road-trip-journal-app.html")); app.get("/road-trip-tracker-app", async (_req, reply) => reply.sendFile("road-trip-tracker-app.html")); app.get("/travel-journal-app-with-photos", async (_req, reply) => reply.sendFile("travel-journal-app-with-photos.html")); app.get("/driving-history-app", async (_req, reply) => reply.sendFile("driving-history-app.html")); app.get("/driving-journal", async (_req, reply) => reply.code(301).redirect("/private-driving-journal")); app.get("/support", async (_req, reply) => reply.sendFile("support.html")); app.get("/terms", async (_req, reply) => reply.sendFile("terms.html")); app.get("/wife", async (_req, reply) => reply.sendFile("wife.html")); + app.get("/", async (_req, reply) => reply.sendFile(cfg.mode === "web" ? "beta.html" : "index.html")); app.get("/app", async (_req, reply) => reply.sendFile("index.html")); app.get("/spotify-callback", async (_req, reply) => reply.sendFile("index.html")); app.get("/login", async (_req, reply) => reply.sendFile("login.html")); app.get("/.well-known/api-catalog", async (_req, reply) => reply.type("application/linkset+json").send(await readFile(join(cfg.webRoot, "api-catalog.json")))); app.get("/api-docs", async (_req, reply) => reply.sendFile("api-docs.html")); app.get("/privacy", async (_req, reply) => reply.sendFile("privacy.html")); app.get("/apple-music-soundtrack", async (_req, reply) => reply.sendFile("apple-music-soundtrack.html")); app.get("/private-driving-journal", async (_req, reply) => reply.sendFile("private-driving-journal.html")); app.get("/road-trip-journal-app", async (_req, reply) => reply.sendFile("road-trip-journal-app.html")); app.get("/road-trip-tracker-app", async (_req, reply) => reply.sendFile("road-trip-tracker-app.html")); app.get("/travel-journal-app-with-photos", async (_req, reply) => reply.sendFile("travel-journal-app-with-photos.html")); app.get("/driving-history-app", async (_req, reply) => reply.sendFile("driving-history-app.html")); app.get("/route-66-road-trip-journal", async (_req, reply) => reply.sendFile("route-66-road-trip-journal.html")); app.get("/pacific-coast-highway-road-trip-journal", async (_req, reply) => reply.sendFile("pacific-coast-highway-road-trip-journal.html")); app.get("/national-parks-road-trip-journal", async (_req, reply) => reply.sendFile("national-parks-road-trip-journal.html")); app.get("/texas-hill-country-road-trip-journal", async (_req, reply) => reply.sendFile("texas-hill-country-road-trip-journal.html")); app.get("/driving-journal", async (_req, reply) => reply.code(301).redirect("/private-driving-journal")); app.get("/support", async (_req, reply) => reply.sendFile("support.html")); app.get("/terms", async (_req, reply) => reply.sendFile("terms.html")); app.get("/wife", async (_req, reply) => reply.sendFile("wife.html")); app.get(googleSiteVerificationPath, async (_req, reply) => reply.type("text/html; charset=utf-8").send(await readFile(join(cfg.webRoot, "google8e611381b21882a8.html"), "utf8"))); app.setNotFoundHandler(async (req, reply) => { const requestPath = req.url.split("?")[0]; diff --git a/server/tests/api.test.ts b/server/tests/api.test.ts index 76edd3da..e79738c6 100644 --- a/server/tests/api.test.ts +++ b/server/tests/api.test.ts @@ -135,6 +135,10 @@ test("public information and discovery pages are accessible without an authentic assert.match(roadTripJournal.body, /href="\/apple-music-soundtrack"/); assert.match(roadTripJournal.body, /https:\/\/apps\.apple\.com\/us\/app\/journeydeck\/id6806502526/); assert.match(roadTripJournal.body, /rel="canonical" href="https:\/\/journeydeck\.me\/road-trip-journal-app"/); + assert.match(roadTripJournal.body, /href="\/route-66-road-trip-journal"/); + assert.match(roadTripJournal.body, /href="\/pacific-coast-highway-road-trip-journal"/); + assert.match(roadTripJournal.body, /href="\/national-parks-road-trip-journal"/); + assert.match(roadTripJournal.body, /href="\/texas-hill-country-road-trip-journal"/); assert.doesNotMatch(roadTripJournal.body, /[\u2013\u2014]/); const roadTripTracker = await runtime.app.inject({ method: "GET", url: "/road-trip-tracker-app" }); assert.equal(roadTripTracker.statusCode, 200, roadTripTracker.body); @@ -176,13 +180,72 @@ test("public information and discovery pages are accessible without an authentic assert.match(drivingHistory.body, /https:\/\/apps\.apple\.com\/us\/app\/journeydeck\/id6806502526/); assert.match(drivingHistory.body, /rel="canonical" href="https:\/\/journeydeck\.me\/driving-history-app"/); assert.doesNotMatch(drivingHistory.body, /[\u2013\u2014]/); + const route66 = await runtime.app.inject({ method: "GET", url: "/route-66-road-trip-journal" }); + assert.equal(route66.statusCode, 200, route66.body); + assert.match(String(route66.headers["content-type"]), /text\/html/); + assert.match(route66.body, /

A Route 66 road trip journal that stays on your phone<\/h1>/); + assert.match(route66.body, /

Keep your Route 66 drive in a private iPhone journal\. Your route, miles, music and photos, saved on your phone\. No account needed\.<\/p>/); + assert.match(route66.body, /Route 66 turns 100 this year/); + assert.match(route66.body, /Before you pull out of Chicago \(or Santa Monica, I'm not judging\), tap Start Journey/); + assert.match(route66.body, /

Frequently asked questions<\/h2>/); + assert.match(route66.body, /Does it track my Route 66 trip automatically\?/); + assert.match(route66.body, /href="\/privacy"/); + assert.match(route66.body, /href="\/apple-music-soundtrack"/); + assert.match(route66.body, /https:\/\/apps\.apple\.com\/us\/app\/journeydeck\/id6806502526/); + assert.match(route66.body, /rel="canonical" href="https:\/\/journeydeck\.me\/route-66-road-trip-journal"/); + assert.doesNotMatch(route66.body, /[\u2013\u2014]/); + const pacificCoast = await runtime.app.inject({ method: "GET", url: "/pacific-coast-highway-road-trip-journal" }); + assert.equal(pacificCoast.statusCode, 200, pacificCoast.body); + assert.match(String(pacificCoast.headers["content-type"]), /text\/html/); + assert.match(pacificCoast.body, /

Keep your Pacific Coast Highway drive<\/h1>/); + assert.match(pacificCoast.body, /Tap Start Journey before Big Sur, put the phone down and drive/); + assert.match(pacificCoast.body, /Connect Apple Music if you want the playlist kept with the drive\./); + assert.doesNotMatch(pacificCoast.body, /I always want to know what was playing/); + assert.match(pacificCoast.body, /

Frequently asked questions<\/h2>/); + assert.match(pacificCoast.body, /Does it track my Pacific Coast Highway trip automatically\?/); + assert.match(pacificCoast.body, /href="\/privacy"/); + assert.match(pacificCoast.body, /href="\/apple-music-soundtrack"/); + assert.match(pacificCoast.body, /https:\/\/apps\.apple\.com\/us\/app\/journeydeck\/id6806502526/); + assert.match(pacificCoast.body, /rel="canonical" href="https:\/\/journeydeck\.me\/pacific-coast-highway-road-trip-journal"/); + assert.doesNotMatch(pacificCoast.body, /[\u2013\u2014]/); + const nationalParks = await runtime.app.inject({ method: "GET", url: "/national-parks-road-trip-journal" }); + assert.equal(nationalParks.statusCode, 200, nationalParks.body); + assert.match(String(nationalParks.headers["content-type"]), /text\/html/); + assert.match(nationalParks.body, /

A road trip journal for your national parks trip<\/h1>/); + assert.match(nationalParks.body, /National park trips are long days of driving between short moments you really want to keep/); + assert.match(nationalParks.body, /You start it\. You stop it\./); + assert.doesNotMatch(nationalParks.body, /Three kids\. Count again/); + assert.match(nationalParks.body, /

Frequently asked questions<\/h2>/); + assert.match(nationalParks.body, /Does it track my national parks trip automatically\?/); + assert.match(nationalParks.body, /href="\/privacy"/); + assert.match(nationalParks.body, /href="\/apple-music-soundtrack"/); + assert.match(nationalParks.body, /https:\/\/apps\.apple\.com\/us\/app\/journeydeck\/id6806502526/); + assert.match(nationalParks.body, /rel="canonical" href="https:\/\/journeydeck\.me\/national-parks-road-trip-journal"/); + assert.doesNotMatch(nationalParks.body, /[\u2013\u2014]/); + const hillCountry = await runtime.app.inject({ method: "GET", url: "/texas-hill-country-road-trip-journal" }); + assert.equal(hillCountry.statusCode, 200, hillCountry.body); + assert.match(String(hillCountry.headers["content-type"]), /text\/html/); + assert.match(hillCountry.body, /

A Texas Hill Country road trip, kept<\/h1>/); + assert.match(hillCountry.body, /I live in DFW, so the Hill Country is our "close" road trip/); + assert.match(hillCountry.body, /Close in Texas means about four hours\./); + assert.match(hillCountry.body, /Tap Start Journey when you leave the house/); + assert.match(hillCountry.body, /Keep the Apple Music soundtrack too\./); + assert.doesNotMatch(hillCountry.body, /kolaches/); + assert.doesNotMatch(hillCountry.body, /George Strait/); + assert.match(hillCountry.body, /

Frequently asked questions<\/h2>/); + assert.match(hillCountry.body, /Does it track my Hill Country trip automatically\?/); + assert.match(hillCountry.body, /href="\/privacy"/); + assert.match(hillCountry.body, /href="\/apple-music-soundtrack"/); + assert.match(hillCountry.body, /https:\/\/apps\.apple\.com\/us\/app\/journeydeck\/id6806502526/); + assert.match(hillCountry.body, /rel="canonical" href="https:\/\/journeydeck\.me\/texas-hill-country-road-trip-journal"/); + assert.doesNotMatch(hillCountry.body, /[\u2013\u2014]/); const journalAlias = await runtime.app.inject({ method: "GET", url: "/driving-journal" }); assert.equal(journalAlias.statusCode, 301); assert.equal(journalAlias.headers.location, "/private-driving-journal"); const terms = await runtime.app.inject({ method: "GET", url: "/terms" }); assert.equal(terms.statusCode, 200, terms.body); assert.match(terms.body, /JourneyDeck Terms of Use/i); - for (const page of [privacy, support, soundtrack, journal, roadTripJournal, roadTripTracker, travelPhotos, drivingHistory, terms]) { + for (const page of [privacy, support, soundtrack, journal, roadTripJournal, roadTripTracker, travelPhotos, drivingHistory, route66, pacificCoast, nationalParks, hillCountry, terms]) { assert.match(page.body, /class="site-header"/); assert.match(page.body, /class="desktop-nav" aria-label="Main navigation"/); assert.match(page.body, /href="\/apple-music-soundtrack"/); @@ -205,6 +268,10 @@ test("public information and discovery pages are accessible without an authentic assert.equal(googleRobotsAllowed(robots.body, "/road-trip-tracker-app"), true); assert.equal(googleRobotsAllowed(robots.body, "/travel-journal-app-with-photos"), true); assert.equal(googleRobotsAllowed(robots.body, "/driving-history-app"), true); + assert.equal(googleRobotsAllowed(robots.body, "/route-66-road-trip-journal"), true); + assert.equal(googleRobotsAllowed(robots.body, "/pacific-coast-highway-road-trip-journal"), true); + assert.equal(googleRobotsAllowed(robots.body, "/national-parks-road-trip-journal"), true); + assert.equal(googleRobotsAllowed(robots.body, "/texas-hill-country-road-trip-journal"), true); assert.equal(googleRobotsAllowed(robots.body, "/google8e611381b21882a8.html"), true); assert.equal(googleRobotsAllowed(robots.body, "/login"), true); assert.equal(googleRobotsAllowed(robots.body, "/app"), false); @@ -231,6 +298,10 @@ test("public information and discovery pages are accessible without an authentic assert.match(sitemap.body, /https:\/\/journeydeck\.me\/road-trip-tracker-app<\/loc>/i); assert.match(sitemap.body, /https:\/\/journeydeck\.me\/travel-journal-app-with-photos<\/loc>/i); assert.match(sitemap.body, /https:\/\/journeydeck\.me\/driving-history-app<\/loc>/i); + assert.match(sitemap.body, /https:\/\/journeydeck\.me\/route-66-road-trip-journal<\/loc>/i); + assert.match(sitemap.body, /https:\/\/journeydeck\.me\/pacific-coast-highway-road-trip-journal<\/loc>/i); + assert.match(sitemap.body, /https:\/\/journeydeck\.me\/national-parks-road-trip-journal<\/loc>/i); + assert.match(sitemap.body, /https:\/\/journeydeck\.me\/texas-hill-country-road-trip-journal<\/loc>/i); assert.doesNotMatch(sitemap.body, /https:\/\/journeydeck\.me\/(?:beta|app|login)(?:\/|<)/i); assert.doesNotMatch(sitemap.body, /google8e611381b21882a8/i); const googleVerification = await runtime.app.inject({ method: "GET", url: "/google8e611381b21882a8.html" }); @@ -395,11 +466,15 @@ test("public marketing pages expose one title, description, canonical, Open Grap { url: "/road-trip-tracker-app", canonical: "https://journeydeck.me/road-trip-tracker-app" }, { url: "/travel-journal-app-with-photos", canonical: "https://journeydeck.me/travel-journal-app-with-photos" }, { url: "/driving-history-app", canonical: "https://journeydeck.me/driving-history-app" }, + { url: "/route-66-road-trip-journal", canonical: "https://journeydeck.me/route-66-road-trip-journal" }, + { url: "/pacific-coast-highway-road-trip-journal", canonical: "https://journeydeck.me/pacific-coast-highway-road-trip-journal" }, + { url: "/national-parks-road-trip-journal", canonical: "https://journeydeck.me/national-parks-road-trip-journal" }, + { url: "/texas-hill-country-road-trip-journal", canonical: "https://journeydeck.me/texas-hill-country-road-trip-journal" }, { url: "/support", canonical: "https://journeydeck.me/support" }, { url: "/privacy", canonical: "https://journeydeck.me/privacy" }, { url: "/terms", canonical: "https://journeydeck.me/terms" } ] as const; - const rewrittenDescriptions = new Set(["/support", "/privacy", "/private-driving-journal", "/road-trip-journal-app", "/road-trip-tracker-app", "/travel-journal-app-with-photos", "/driving-history-app"]); + const rewrittenDescriptions = new Set(["/support", "/privacy", "/private-driving-journal", "/road-trip-journal-app", "/road-trip-tracker-app", "/travel-journal-app-with-photos", "/driving-history-app", "/route-66-road-trip-journal", "/pacific-coast-highway-road-trip-journal", "/national-parks-road-trip-journal", "/texas-hill-country-road-trip-journal"]); try { for (const page of pages) { const response = await runtime.app.inject({ method: "GET", url: page.url }); diff --git a/server/tests/campaign.test.ts b/server/tests/campaign.test.ts index bff49b74..f8a3006d 100644 --- a/server/tests/campaign.test.ts +++ b/server/tests/campaign.test.ts @@ -32,6 +32,10 @@ const publicPages = [ "/road-trip-tracker-app", "/travel-journal-app-with-photos", "/driving-history-app", + "/route-66-road-trip-journal", + "/pacific-coast-highway-road-trip-journal", + "/national-parks-road-trip-journal", + "/texas-hill-country-road-trip-journal", "/support", "/privacy", "/terms" diff --git a/server/tests/verify-live.test.ts b/server/tests/verify-live.test.ts index ffb26b01..c3ec3a64 100644 --- a/server/tests/verify-live.test.ts +++ b/server/tests/verify-live.test.ts @@ -60,6 +60,10 @@ test("expectations loader reads the checked-in file and rejects incomplete objec "/road-trip-tracker-app", "/travel-journal-app-with-photos", "/driving-history-app", + "/route-66-road-trip-journal", + "/pacific-coast-highway-road-trip-journal", + "/national-parks-road-trip-journal", + "/texas-hill-country-road-trip-journal", "/support", "/privacy", "/terms" diff --git a/tools/verify-live/FEATURE_MAP.md b/tools/verify-live/FEATURE_MAP.md index 9ccd290e..07ebdc4c 100644 --- a/tools/verify-live/FEATURE_MAP.md +++ b/tools/verify-live/FEATURE_MAP.md @@ -27,12 +27,16 @@ Public HTML is served by `server/src/app.ts` in web mode. The public route allow | `/road-trip-tracker-app` | `web/road-trip-tracker-app.html` | `page:/road-trip-tracker-app status`, `page:/road-trip-tracker-app title`, `page:/road-trip-tracker-app meta-description`, `page:/road-trip-tracker-app canonical`, `page:/road-trip-tracker-app og:title`, `page:/road-trip-tracker-app og:description`, `page:/road-trip-tracker-app og:url`, `page:/road-trip-tracker-app og:image`, `page:/road-trip-tracker-app json-ld`, `page:/road-trip-tracker-app umami`, `page:/road-trip-tracker-app trial-wording` | | `/travel-journal-app-with-photos` | `web/travel-journal-app-with-photos.html` | `page:/travel-journal-app-with-photos status`, `page:/travel-journal-app-with-photos title`, `page:/travel-journal-app-with-photos meta-description`, `page:/travel-journal-app-with-photos canonical`, `page:/travel-journal-app-with-photos og:title`, `page:/travel-journal-app-with-photos og:description`, `page:/travel-journal-app-with-photos og:url`, `page:/travel-journal-app-with-photos og:image`, `page:/travel-journal-app-with-photos json-ld`, `page:/travel-journal-app-with-photos umami`, `page:/travel-journal-app-with-photos trial-wording` | | `/driving-history-app` | `web/driving-history-app.html` | `page:/driving-history-app status`, `page:/driving-history-app title`, `page:/driving-history-app meta-description`, `page:/driving-history-app canonical`, `page:/driving-history-app og:title`, `page:/driving-history-app og:description`, `page:/driving-history-app og:url`, `page:/driving-history-app og:image`, `page:/driving-history-app json-ld`, `page:/driving-history-app umami`, `page:/driving-history-app trial-wording` | +| `/route-66-road-trip-journal` | `web/route-66-road-trip-journal.html` | `page:/route-66-road-trip-journal status`, `page:/route-66-road-trip-journal title`, `page:/route-66-road-trip-journal meta-description`, `page:/route-66-road-trip-journal canonical`, `page:/route-66-road-trip-journal og:title`, `page:/route-66-road-trip-journal og:description`, `page:/route-66-road-trip-journal og:url`, `page:/route-66-road-trip-journal og:image`, `page:/route-66-road-trip-journal json-ld`, `page:/route-66-road-trip-journal umami`, `page:/route-66-road-trip-journal trial-wording` | +| `/pacific-coast-highway-road-trip-journal` | `web/pacific-coast-highway-road-trip-journal.html` | `page:/pacific-coast-highway-road-trip-journal status`, `page:/pacific-coast-highway-road-trip-journal title`, `page:/pacific-coast-highway-road-trip-journal meta-description`, `page:/pacific-coast-highway-road-trip-journal canonical`, `page:/pacific-coast-highway-road-trip-journal og:title`, `page:/pacific-coast-highway-road-trip-journal og:description`, `page:/pacific-coast-highway-road-trip-journal og:url`, `page:/pacific-coast-highway-road-trip-journal og:image`, `page:/pacific-coast-highway-road-trip-journal json-ld`, `page:/pacific-coast-highway-road-trip-journal umami`, `page:/pacific-coast-highway-road-trip-journal trial-wording` | +| `/national-parks-road-trip-journal` | `web/national-parks-road-trip-journal.html` | `page:/national-parks-road-trip-journal status`, `page:/national-parks-road-trip-journal title`, `page:/national-parks-road-trip-journal meta-description`, `page:/national-parks-road-trip-journal canonical`, `page:/national-parks-road-trip-journal og:title`, `page:/national-parks-road-trip-journal og:description`, `page:/national-parks-road-trip-journal og:url`, `page:/national-parks-road-trip-journal og:image`, `page:/national-parks-road-trip-journal json-ld`, `page:/national-parks-road-trip-journal umami`, `page:/national-parks-road-trip-journal trial-wording` | +| `/texas-hill-country-road-trip-journal` | `web/texas-hill-country-road-trip-journal.html` | `page:/texas-hill-country-road-trip-journal status`, `page:/texas-hill-country-road-trip-journal title`, `page:/texas-hill-country-road-trip-journal meta-description`, `page:/texas-hill-country-road-trip-journal canonical`, `page:/texas-hill-country-road-trip-journal og:title`, `page:/texas-hill-country-road-trip-journal og:description`, `page:/texas-hill-country-road-trip-journal og:url`, `page:/texas-hill-country-road-trip-journal og:image`, `page:/texas-hill-country-road-trip-journal json-ld`, `page:/texas-hill-country-road-trip-journal umami`, `page:/texas-hill-country-road-trip-journal trial-wording` | | `/support` | `web/support.html` | `page:/support status`, `page:/support title`, `page:/support meta-description`, `page:/support canonical`, `page:/support og:title`, `page:/support og:description`, `page:/support og:url`, `page:/support og:image`, `page:/support json-ld`, `page:/support umami`, `page:/support trial-wording` | | `/privacy` | `web/privacy.html` | `page:/privacy status`, `page:/privacy title`, `page:/privacy meta-description`, `page:/privacy canonical`, `page:/privacy og:title`, `page:/privacy og:description`, `page:/privacy og:url`, `page:/privacy og:image`, `page:/privacy json-ld`, `page:/privacy umami`, `page:/privacy trial-wording` | | `/terms` | `web/terms.html` | `page:/terms status`, `page:/terms title`, `page:/terms meta-description`, `page:/terms canonical`, `page:/terms og:title`, `page:/terms og:description`, `page:/terms og:url`, `page:/terms og:image`, `page:/terms json-ld`, `page:/terms umami`, `page:/terms trial-wording` | | `/login` | `web/login.html` | `page:/login status`, `page:/login umami` | -JSON-LD blocks live in `web/beta.html`, `web/apple-music-soundtrack.html`, `web/private-driving-journal.html`, `web/road-trip-journal-app.html`, `web/road-trip-tracker-app.html`, `web/travel-journal-app-with-photos.html`, `web/driving-history-app.html`, and `web/support.html`. Privacy and terms have none today. Every `application/ld+json` block that is present must parse. +JSON-LD blocks live in `web/beta.html`, `web/apple-music-soundtrack.html`, `web/private-driving-journal.html`, `web/road-trip-journal-app.html`, `web/road-trip-tracker-app.html`, `web/travel-journal-app-with-photos.html`, `web/driving-history-app.html`, `web/route-66-road-trip-journal.html`, `web/pacific-coast-highway-road-trip-journal.html`, `web/national-parks-road-trip-journal.html`, `web/texas-hill-country-road-trip-journal.html`, and `web/support.html`. Privacy and terms have none today. Every `application/ld+json` block that is present must parse. ## Umami tag diff --git a/tools/verify-live/expectations.json b/tools/verify-live/expectations.json index 45e39103..cf087b80 100644 --- a/tools/verify-live/expectations.json +++ b/tools/verify-live/expectations.json @@ -7,6 +7,10 @@ "/road-trip-tracker-app", "/travel-journal-app-with-photos", "/driving-history-app", + "/route-66-road-trip-journal", + "/pacific-coast-highway-road-trip-journal", + "/national-parks-road-trip-journal", + "/texas-hill-country-road-trip-journal", "/support", "/privacy", "/terms" diff --git a/web/apple-music-soundtrack.html b/web/apple-music-soundtrack.html index 0c90a366..fc0357d8 100644 --- a/web/apple-music-soundtrack.html +++ b/web/apple-music-soundtrack.html @@ -110,7 +110,7 @@

Is JourneyDeck a navigation app?

No. Set up recording before driving and do not interact with the app while operating a vehicle.

- + diff --git a/web/national-parks-road-trip-journal.html b/web/national-parks-road-trip-journal.html new file mode 100644 index 00000000..151e62b1 --- /dev/null +++ b/web/national-parks-road-trip-journal.html @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + National parks road trip journal for iPhone | JourneyDeck + + + + + + +
+
+

NATIONAL PARKS / YOUR ARCHIVE

+

A road trip journal for your national parks trip

+

A private iPhone journal for national parks road trips. Route, miles and photos, saved on your phone. Works offline. No account needed.

+ +
+
+

MEMORIES / THE PARKS

Keep the days between the parks.

Start a journey for each leg, then group them into one Memory with photos and notes. Core recording works offline.

+
JourneyDeck 4.0 screenshot showing a Memory with photos, notes, and saved journeys
JourneyDeck 4.0 Memories on iPhone
+
+
+
+

Long days, short moments

+

National park trips are long days of driving between short moments you really want to keep. Start a journey for each leg, and JourneyDeck saves the route, miles and drive time. Group the legs into one Memory with photos and notes, so Zion, Bryce and the gas station with the good jerky all live together.

+
+ + +
+

Frequently asked questions

+

Does it track my national parks trip automatically?

+

No account, no tracker running in the background. You start it. You stop it.

+

Does it need cell service?

+

Lots of parks have little or no signal. Core recording works offline and stays on your iPhone.

+

Can I keep several park days together?

+

Start a journey for each leg, and JourneyDeck saves the route, miles and drive time. Group the legs into one Memory with photos and notes.

+
+
+ +
+ + diff --git a/web/pacific-coast-highway-road-trip-journal.html b/web/pacific-coast-highway-road-trip-journal.html new file mode 100644 index 00000000..18c5dcf2 --- /dev/null +++ b/web/pacific-coast-highway-road-trip-journal.html @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pacific Coast Highway road trip journal for iPhone | JourneyDeck + + + + + + +
+
+

HIGHWAY 1 / YOUR ARCHIVE

+

Keep your Pacific Coast Highway drive

+

Keep your Pacific Coast Highway drive in a private iPhone journal. Route, miles and photos, saved on your phone. Works offline.

+ +
+
+

THE ROAD / HIGHWAY 1

Keep the coast.

Tap Start Journey before Big Sur, put the phone down and drive. JourneyDeck saves the route, distance and drive time on your iPhone.

+
JourneyDeck 4.0 screenshot showing a saved journey, route map, soundtrack, and replay control
A saved journey in JourneyDeck 4.0
+
+
+
+

The view, then the roll

+

Highway 1 is the kind of drive where you pull over every ten minutes because the view got even better. Then you get home and can't remember which cove was which.

+
+
+

How to keep the drive

+

Tap Start Journey before Big Sur, put the phone down and drive. JourneyDeck saves the route, distance and drive time on your iPhone. Cell signal disappears for long stretches along that coast, and core recording still works offline.

+

Add your Bixby Bridge photos and a note to a Memory. Connect Apple Music if you want the playlist kept with the drive.

+
+ + +
+

Frequently asked questions

+

Does it track my Pacific Coast Highway trip automatically?

+

No. Tap Start Journey before Big Sur, put the phone down and drive.

+

Does it need cell service?

+

Cell signal disappears for long stretches along that coast, and core recording still works offline.

+

Is it a navigation app?

+

It's not navigation and it won't plan your stops. It just keeps the trip.

+
+
+ +
+ + diff --git a/web/private-driving-journal.html b/web/private-driving-journal.html index dbbc6ea1..ecb2c219 100644 --- a/web/private-driving-journal.html +++ b/web/private-driving-journal.html @@ -92,6 +92,7 @@

Who it’s for

Drivers who want a private archive of the roads they take, everyday drives and longer trips, without signing up for a cloud tracker or handing over a continuous trip history account.

Looking for a road trip journal app, car trip log, or trip journal on iPhone? That overview stays with the same private, local-first recorder.

If you need a personal driving history app or drive log, that page explains the journal, and that it is not a DMV record or mileage tax log.

+

Planning a specific drive? There are journals for Route 66, the Pacific Coast Highway, national parks, and Texas Hill Country.

How it works

diff --git a/web/road-trip-journal-app.html b/web/road-trip-journal-app.html index 055b1f6f..153debc3 100644 --- a/web/road-trip-journal-app.html +++ b/web/road-trip-journal-app.html @@ -127,6 +127,10 @@

What private and local-first mean

Read the JourneyDeck privacy policy and the private driving journal overview for more.

+

Frequently asked questions

What is a road trip journal app?

diff --git a/web/route-66-road-trip-journal.html b/web/route-66-road-trip-journal.html new file mode 100644 index 00000000..026b822b --- /dev/null +++ b/web/route-66-road-trip-journal.html @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Route 66 road trip journal for iPhone | JourneyDeck + + + + + + +
+
+

ROUTE 66 / YOUR ARCHIVE

+

A Route 66 road trip journal that stays on your phone

+

Keep your Route 66 drive in a private iPhone journal. Your route, miles, music and photos, saved on your phone. No account needed.

+ +
+
+

THE ROAD / ROUTE 66

Keep the Mother Road.

Tap Start Journey, put the phone away, and JourneyDeck keeps the route, the miles and the drive time, even while the phone is locked.

+
JourneyDeck 4.0 screenshot showing a saved journey, route map, soundtrack, and replay control
A saved journey in JourneyDeck 4.0
+
+
+
+

A journal for the Mother Road

+

Route 66 turns 100 this year. That's a lot of people driving a lot of old road, and taking a LOT of photos that end up buried in a camera roll next to receipts and screenshots.

+

I built JourneyDeck because I wanted my drives kept somewhere that was mine. Not a social feed. Just the road.

+
+
+

How to keep the drive

+

Before you pull out of Chicago (or Santa Monica, I'm not judging), tap Start Journey. Put the phone away. JourneyDeck keeps the route, the miles and the drive time, even while the phone is locked. When you park for the night, end the journey.

+

Want the soundtrack too? Connect Apple Music and the songs you played sit with that stretch of road. Add photos and notes to a Memory, or drop a Journey Marker at the Blue Whale or whatever diner talked you into pie.

+
+
+

Offline, private, not a guide

+

It works offline, which matters out in the Mojave. No account. No subscription for the core recording.

+

One honest note: JourneyDeck isn't a Route 66 guide or a navigation app. It won't tell you where the next neon sign is. Use your guide for that. Use JourneyDeck to remember you were there.

+

Read the road trip journal app overview, how Apple Music soundtracks work, and the privacy policy.

+
+ +
+

Frequently asked questions

+

Does it track my Route 66 trip automatically?

+

No, you start and end each journey yourself.

+

Does it need cell service?

+

Core recording works offline.

+

Is it a guide?

+

No.

+
+
+ +
+ + diff --git a/web/sitemap.xml b/web/sitemap.xml index 4b48953d..f78e66ff 100644 --- a/web/sitemap.xml +++ b/web/sitemap.xml @@ -7,6 +7,10 @@ https://journeydeck.me/road-trip-tracker-app2026-10-12 https://journeydeck.me/travel-journal-app-with-photos2026-10-12 https://journeydeck.me/driving-history-app2026-10-12 + https://journeydeck.me/route-66-road-trip-journal2026-10-12 + https://journeydeck.me/pacific-coast-highway-road-trip-journal2026-10-12 + https://journeydeck.me/national-parks-road-trip-journal2026-10-12 + https://journeydeck.me/texas-hill-country-road-trip-journal2026-10-12 https://journeydeck.me/privacy2026-09-13 https://journeydeck.me/support2026-09-13 https://journeydeck.me/terms2026-09-13 diff --git a/web/texas-hill-country-road-trip-journal.html b/web/texas-hill-country-road-trip-journal.html new file mode 100644 index 00000000..a564654c --- /dev/null +++ b/web/texas-hill-country-road-trip-journal.html @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Texas Hill Country road trip journal for iPhone | JourneyDeck + + + + + + +
+
+

HILL COUNTRY / YOUR ARCHIVE

+

A Texas Hill Country road trip, kept

+

Keep your Texas Hill Country drive in a private iPhone journal. Route, miles, music and photos, saved on your phone. No account needed.

+ +
+
+

THE ROAD / HILL COUNTRY

Keep the drive.

Tap Start Journey when you leave the house and JourneyDeck keeps the route, the miles and the drive time on your iPhone.

+
JourneyDeck 4.0 screenshot showing a saved journey, route map, soundtrack, and replay control
A saved journey in JourneyDeck 4.0
+
+
+
+

Close, for Texas

+

I live in DFW, so the Hill Country is our "close" road trip. Close in Texas means about four hours.

+
+
+

How to keep the drive

+

Fredericksburg, Enchanted Rock, the bluebonnets if you time it right in spring. Tap Start Journey when you leave the house and JourneyDeck keeps the route, the miles and the drive time on your iPhone. Add photos and a note to a Memory. Keep the Apple Music soundtrack too.

+
+
+

Private and local first

+

It's private and local first. No account, no subscription for core recording, and nothing records unless you start it.

+

Would you use something like this for your next trip? I'd love to know.

+

Read the road trip journal app overview, how Apple Music soundtracks work, and the privacy policy.

+
+ +
+

Frequently asked questions

+

Does it track my Hill Country trip automatically?

+

Nothing records unless you start it. Tap Start Journey when you leave the house.

+

Do I need an account?

+

No. It's private and local first. No account, no subscription for core recording.

+

Is it a guide?

+

No. JourneyDeck keeps the route, the miles and the drive time on your iPhone.

+
+
+ +
+ + From df6288c0ca50c5ea78f2799f1232033b7e831b01 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 12 Oct 2026 20:57:44 +0000 Subject: [PATCH 2/2] Apply design-review copy fixes on the four road trip journal pages. Keep visible FAQ answers and JSON-LD FAQ text identical. Replace the PCH intro that repeated the H1, date Route 66 to 2026, and turn the Hill Country closer into a /support link. Co-authored-by: Patrick --- .ai/HANDOFF.md | 2 +- server/tests/api.test.ts | 14 +++++++++++++- web/national-parks-road-trip-journal.html | 8 ++++---- ...acific-coast-highway-road-trip-journal.html | 18 +++++++++--------- web/route-66-road-trip-journal.html | 10 +++++----- web/texas-hill-country-road-trip-journal.html | 8 ++++---- 6 files changed, 36 insertions(+), 24 deletions(-) diff --git a/.ai/HANDOFF.md b/.ai/HANDOFF.md index dd6a5d14..6d1f218b 100644 --- a/.ai/HANDOFF.md +++ b/.ai/HANDOFF.md @@ -12,7 +12,7 @@ Ship four themed road-trip SEO landing pages in one draft PR. Do not merge or de - New public pages: `/route-66-road-trip-journal`, `/pacific-coast-highway-road-trip-journal`, `/national-parks-road-trip-journal`, `/texas-hill-country-road-trip-journal`. - Wired like #268/#270/#273/#276: `publicPaths`, `app.get` sendFile, sitemap, server tests, verify-live expectations, feature map, canonical/meta/OG/JSON-LD/Umami, plain App Store CTA plus `campaign.js`. -- Copy from the draft, minus unconfirmed personal lines (kids anecdote, kolaches, George Strait, PCH "what was playing"). No em/en dashes. Journeys start only when the user taps Start Journey. +- Copy from the draft, minus unconfirmed personal lines, plus design-review FAQ and intro fixes. JSON-LD FAQ text matches the visible FAQ. No em/en dashes. Journeys start only when the user taps Start Journey. - Cross-links from `/road-trip-journal-app`, `/private-driving-journal`, and the Apple Music soundtrack footer. ## Verification diff --git a/server/tests/api.test.ts b/server/tests/api.test.ts index e79738c6..c756e538 100644 --- a/server/tests/api.test.ts +++ b/server/tests/api.test.ts @@ -185,10 +185,13 @@ test("public information and discovery pages are accessible without an authentic assert.match(String(route66.headers["content-type"]), /text\/html/); assert.match(route66.body, /

A Route 66 road trip journal that stays on your phone<\/h1>/); assert.match(route66.body, /

Keep your Route 66 drive in a private iPhone journal\. Your route, miles, music and photos, saved on your phone\. No account needed\.<\/p>/); - assert.match(route66.body, /Route 66 turns 100 this year/); + assert.match(route66.body, /Route 66 turned 100 in 2026/); + assert.doesNotMatch(route66.body, /Route 66 turns 100 this year/); assert.match(route66.body, /Before you pull out of Chicago \(or Santa Monica, I'm not judging\), tap Start Journey/); assert.match(route66.body, /

Frequently asked questions<\/h2>/); assert.match(route66.body, /Does it track my Route 66 trip automatically\?/); + assert.match(route66.body, /No\. Core recording works offline, which matters out in the Mojave\./); + assert.match(route66.body, /No\. It won't tell you where the next neon sign is\. Use your guide for that\./); assert.match(route66.body, /href="\/privacy"/); assert.match(route66.body, /href="\/apple-music-soundtrack"/); assert.match(route66.body, /https:\/\/apps\.apple\.com\/us\/app\/journeydeck\/id6806502526/); @@ -198,11 +201,15 @@ test("public information and discovery pages are accessible without an authentic assert.equal(pacificCoast.statusCode, 200, pacificCoast.body); assert.match(String(pacificCoast.headers["content-type"]), /text\/html/); assert.match(pacificCoast.body, /

Keep your Pacific Coast Highway drive<\/h1>/); + assert.match(pacificCoast.body, /

A private iPhone journal for Highway 1\. Route, miles and photos, saved on your phone\. Works offline, even where the signal doesn't\.<\/p>/); assert.match(pacificCoast.body, /Tap Start Journey before Big Sur, put the phone down and drive/); assert.match(pacificCoast.body, /Connect Apple Music if you want the playlist kept with the drive\./); assert.doesNotMatch(pacificCoast.body, /I always want to know what was playing/); assert.match(pacificCoast.body, /

Frequently asked questions<\/h2>/); assert.match(pacificCoast.body, /Does it track my Pacific Coast Highway trip automatically\?/); + assert.match(pacificCoast.body, /No\. You tap Start Journey when you set off and end it when you park\./); + assert.match(pacificCoast.body, /No\. Signal disappears for long stretches along the coast, and core recording still works offline\./); + assert.match(pacificCoast.body, /No\. It won't plan your stops\. It just keeps the trip\./); assert.match(pacificCoast.body, /href="\/privacy"/); assert.match(pacificCoast.body, /href="\/apple-music-soundtrack"/); assert.match(pacificCoast.body, /https:\/\/apps\.apple\.com\/us\/app\/journeydeck\/id6806502526/); @@ -217,6 +224,8 @@ test("public information and discovery pages are accessible without an authentic assert.doesNotMatch(nationalParks.body, /Three kids\. Count again/); assert.match(nationalParks.body, /

Frequently asked questions<\/h2>/); assert.match(nationalParks.body, /Does it track my national parks trip automatically\?/); + assert.match(nationalParks.body, /No\. Nothing runs in the background\. You start it\. You stop it\./); + assert.match(nationalParks.body, /No\. Lots of parks have little or no signal, and core recording works offline on your iPhone\./); assert.match(nationalParks.body, /href="\/privacy"/); assert.match(nationalParks.body, /href="\/apple-music-soundtrack"/); assert.match(nationalParks.body, /https:\/\/apps\.apple\.com\/us\/app\/journeydeck\/id6806502526/); @@ -229,11 +238,14 @@ test("public information and discovery pages are accessible without an authentic assert.match(hillCountry.body, /I live in DFW, so the Hill Country is our "close" road trip/); assert.match(hillCountry.body, /Close in Texas means about four hours\./); assert.match(hillCountry.body, /Tap Start Journey when you leave the house/); + assert.match(hillCountry.body, /Start a journey when you back out of the driveway and forget about it until you're eating brisket/); assert.match(hillCountry.body, /Keep the Apple Music soundtrack too\./); + assert.match(hillCountry.body, /Would you use something like this for your next trip\? I'd love to know\.<\/a>/); assert.doesNotMatch(hillCountry.body, /kolaches/); assert.doesNotMatch(hillCountry.body, /George Strait/); assert.match(hillCountry.body, /

Frequently asked questions<\/h2>/); assert.match(hillCountry.body, /Does it track my Hill Country trip automatically\?/); + assert.match(hillCountry.body, /No\. It won't plan your stops or find the best peach stand\. It just keeps the drive\./); assert.match(hillCountry.body, /href="\/privacy"/); assert.match(hillCountry.body, /href="\/apple-music-soundtrack"/); assert.match(hillCountry.body, /https:\/\/apps\.apple\.com\/us\/app\/journeydeck\/id6806502526/); diff --git a/web/national-parks-road-trip-journal.html b/web/national-parks-road-trip-journal.html index 151e62b1..08b6f640 100644 --- a/web/national-parks-road-trip-journal.html +++ b/web/national-parks-road-trip-journal.html @@ -36,7 +36,7 @@ "name": "Does it track my national parks trip automatically?", "acceptedAnswer": { "@type": "Answer", - "text": "No account, no tracker running in the background. You start it. You stop it." + "text": "No. Nothing runs in the background. You start it. You stop it." } }, { @@ -44,7 +44,7 @@ "name": "Does it need cell service?", "acceptedAnswer": { "@type": "Answer", - "text": "Lots of parks have little or no signal. Core recording works offline and stays on your iPhone." + "text": "No. Lots of parks have little or no signal, and core recording works offline on your iPhone." } }, { @@ -96,9 +96,9 @@

More road trip journals

Frequently asked questions

Does it track my national parks trip automatically?

-

No account, no tracker running in the background. You start it. You stop it.

+

No. Nothing runs in the background. You start it. You stop it.

Does it need cell service?

-

Lots of parks have little or no signal. Core recording works offline and stays on your iPhone.

+

No. Lots of parks have little or no signal, and core recording works offline on your iPhone.

Can I keep several park days together?

Start a journey for each leg, and JourneyDeck saves the route, miles and drive time. Group the legs into one Memory with photos and notes.

diff --git a/web/pacific-coast-highway-road-trip-journal.html b/web/pacific-coast-highway-road-trip-journal.html index 18c5dcf2..382780f9 100644 --- a/web/pacific-coast-highway-road-trip-journal.html +++ b/web/pacific-coast-highway-road-trip-journal.html @@ -4,12 +4,12 @@ - + - + @@ -36,7 +36,7 @@ "name": "Does it track my Pacific Coast Highway trip automatically?", "acceptedAnswer": { "@type": "Answer", - "text": "No. Tap Start Journey before Big Sur, put the phone down and drive." + "text": "No. You tap Start Journey when you set off and end it when you park." } }, { @@ -44,7 +44,7 @@ "name": "Does it need cell service?", "acceptedAnswer": { "@type": "Answer", - "text": "Cell signal disappears for long stretches along that coast, and core recording still works offline." + "text": "No. Signal disappears for long stretches along the coast, and core recording still works offline." } }, { @@ -52,7 +52,7 @@ "name": "Is it a navigation app?", "acceptedAnswer": { "@type": "Answer", - "text": "It's not navigation and it won't plan your stops. It just keeps the trip." + "text": "No. It won't plan your stops. It just keeps the trip." } } ] @@ -71,7 +71,7 @@

HIGHWAY 1 / YOUR ARCHIVE

Keep your Pacific Coast Highway drive

-

Keep your Pacific Coast Highway drive in a private iPhone journal. Route, miles and photos, saved on your phone. Works offline.

+

A private iPhone journal for Highway 1. Route, miles and photos, saved on your phone. Works offline, even where the signal doesn't.

@@ -100,11 +100,11 @@

More road trip journals

Frequently asked questions

Does it track my Pacific Coast Highway trip automatically?

-

No. Tap Start Journey before Big Sur, put the phone down and drive.

+

No. You tap Start Journey when you set off and end it when you park.

Does it need cell service?

-

Cell signal disappears for long stretches along that coast, and core recording still works offline.

+

No. Signal disappears for long stretches along the coast, and core recording still works offline.

Is it a navigation app?

-

It's not navigation and it won't plan your stops. It just keeps the trip.

+

No. It won't plan your stops. It just keeps the trip.

diff --git a/web/route-66-road-trip-journal.html b/web/route-66-road-trip-journal.html index 026b822b..ebf4a147 100644 --- a/web/route-66-road-trip-journal.html +++ b/web/route-66-road-trip-journal.html @@ -44,7 +44,7 @@ "name": "Does it need cell service?", "acceptedAnswer": { "@type": "Answer", - "text": "Core recording works offline." + "text": "No. Core recording works offline, which matters out in the Mojave." } }, { @@ -52,7 +52,7 @@ "name": "Is it a guide?", "acceptedAnswer": { "@type": "Answer", - "text": "No." + "text": "No. It won't tell you where the next neon sign is. Use your guide for that." } } ] @@ -81,7 +81,7 @@

A Route 66 road trip journal that stays on your phone

A journal for the Mother Road

-

Route 66 turns 100 this year. That's a lot of people driving a lot of old road, and taking a LOT of photos that end up buried in a camera roll next to receipts and screenshots.

+

Route 66 turned 100 in 2026. That's a lot of people driving a lot of old road, and taking a LOT of photos that end up buried in a camera roll next to receipts and screenshots.

I built JourneyDeck because I wanted my drives kept somewhere that was mine. Not a social feed. Just the road.

@@ -104,9 +104,9 @@

Frequently asked questions

Does it track my Route 66 trip automatically?

No, you start and end each journey yourself.

Does it need cell service?

-

Core recording works offline.

+

No. Core recording works offline, which matters out in the Mojave.

Is it a guide?

-

No.

+

No. It won't tell you where the next neon sign is. Use your guide for that.

diff --git a/web/texas-hill-country-road-trip-journal.html b/web/texas-hill-country-road-trip-journal.html index a564654c..caaf7814 100644 --- a/web/texas-hill-country-road-trip-journal.html +++ b/web/texas-hill-country-road-trip-journal.html @@ -52,7 +52,7 @@ "name": "Is it a guide?", "acceptedAnswer": { "@type": "Answer", - "text": "No. JourneyDeck keeps the route, the miles and the drive time on your iPhone." + "text": "No. It won't plan your stops or find the best peach stand. It just keeps the drive." } } ] @@ -85,12 +85,12 @@

Close, for Texas

How to keep the drive

-

Fredericksburg, Enchanted Rock, the bluebonnets if you time it right in spring. Tap Start Journey when you leave the house and JourneyDeck keeps the route, the miles and the drive time on your iPhone. Add photos and a note to a Memory. Keep the Apple Music soundtrack too.

+

Fredericksburg, Enchanted Rock, the bluebonnets if you time it right in spring. Start a journey when you back out of the driveway and forget about it until you're eating brisket. Add photos and a note to a Memory. Keep the Apple Music soundtrack too.

@@ -104,7 +104,7 @@

Does it track my Hill Country trip automatically?

Do I need an account?

No. It's private and local first. No account, no subscription for core recording.

Is it a guide?

-

No. JourneyDeck keeps the route, the miles and the drive time on your iPhone.

+

No. It won't plan your stops or find the best peach stand. It just keeps the drive.