diff --git a/README.md b/README.md index e63a366c..1f3ffd1d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [](#tech-stack) [](#tech-stack) -iso.me is a location tracking app for iOS and watchOS. It automatically records the places you visit throughout the day, tracks routes with continuous GPS logging, and **keeps every byte of your data on-device**. No accounts. No cloud sync. No third-party dependencies. No analytics. Just you, your phone, and your history. +iso.me is a location tracking app for iOS and watchOS. It automatically records the places you visit throughout the day, tracks routes with continuous GPS logging, and **stores your working location journal on-device**. No iso.me account or server-side location archive. Apple geocoding and Maps services, default-on first-party onboarding telemetry, and optional exports/webhooks have specific network behavior explained in the [privacy policy](https://isome.isolated.tech/privacy). **[🌐 isome.isolated.tech](https://isome.isolated.tech)** · **[📲 Download on the App Store](https://apps.apple.com/app/id6761960794)** · **[🛠 Contribute](CONTRIBUTING.md)** · **[💬 Discussions](https://github.com/CodyBontecou/isome/discussions)** · **[👥 Discord](https://discord.gg/jNRWSSSz4N)** · **[⭐ Star this repo](https://github.com/CodyBontecou/isome)** @@ -60,11 +60,11 @@ iOS lock screen widget via Live Activities and watchOS complications for quick t Tracking is free and unlimited — visits, continuous routes, watch app, Live Activities, widgets. No subscription, no ads, no usage caps. -The one paid feature is **export**, offered as lifetime purchases with no recurring charge: +The one paid feature is **export**, offered as lifetime purchases with no recurring charge. US prices verified in App Store Connect on October 26, 2026; other storefronts vary: -- **Individual Lifetime — $10** for one Apple ID -- **Family Lifetime — $20** with Apple Family Sharing for up to five family members -- **Family Upgrade — $10** for Individual Lifetime owners who later want Family Sharing +- **Individual Lifetime — $19.99** for one Apple ID +- **Family Lifetime — $39.99** with Apple Family Sharing for up to five family members +- **Family Upgrade — $19.99** for Individual Lifetime owners who later want Family Sharing Everyone who bought the original `com.bontecou.isome.lifetime` unlock is grandfathered into Family Lifetime automatically. The split is on purpose: tracking is the commodity, but a clean, lossless export of your full history is the part that's worth paying for once. It also keeps the privacy promise free at the door — you never have to pay to keep your data on your device. @@ -75,7 +75,7 @@ Everyone who bought the original `com.bontecou.isome.lifetime` unlock is grandfa - **Data:** SwiftData - **Minimum iOS:** 17.0 - **Minimum watchOS:** 10.0 -- **Dependencies:** None (all native Apple frameworks) +- **Dependencies:** ExportKit, ExportAutomationKit, and Notelet, alongside native Apple frameworks. ### Frameworks Used diff --git a/docs/isome-seo-plan-2026-10-26.md b/docs/isome-seo-plan-2026-10-26.md index 2bb5bab8..e9dbfffc 100644 --- a/docs/isome-seo-plan-2026-10-26.md +++ b/docs/isome-seo-plan-2026-10-26.md @@ -1,5 +1,7 @@ # iso.me SEO audit and execution plan +> **Historical implementation plan.** For the current live-site audit and next priorities, use [the refreshed SEO priorities](isome-seo-priorities-2026-10-26.md). A fresh October 26 HTTP audit confirms 27 sitemap URLs are now live. The older local-only/deployment statements and no-Google-import assumptions below are historical: current app source includes a Google importer, while public App Store availability must be verified before advertising it. Do not reuse the old page-creation backlog as outstanding work. + Prepared October 26, 2026. The original audit below describes the pre-implementation site. Implementation has now started locally; no deployment, analytics changes, or scheduled jobs have been performed. ## Implementation progress — October 26, 2026 diff --git a/docs/isome-seo-priorities-2026-10-26.md b/docs/isome-seo-priorities-2026-10-26.md new file mode 100644 index 00000000..8d3fe801 --- /dev/null +++ b/docs/isome-seo-priorities-2026-10-26.md @@ -0,0 +1,153 @@ +# iso.me SEO priorities after the first guide release + +Reviewed October 26, 2026. This supersedes the outstanding-work list in [the original plan](isome-seo-plan-2026-10-26.md). The audit below is the pre-implementation assessment. See [implementation and release results](seo-implementation-2026-10-26.md) for deployed changes, verified release facts, and the remaining gates. + +## Decision + +Build on the live English cluster. First reconcile product claims, measure the acquisition path, and strengthen the private-journal, Google comparison, and GPX pages. The first new page should walk through Google Timeline import, once the public app's support is confirmed. Country Days is the next distinct scenario candidate after its release and workflow are verified. + +Apply Vaultaire's connection between a specific problem, a useful answer, related pages, and an app download. Reproduce its search-data feedback loop before its multilingual scale. Priorities below are editorial judgments based on product fit, existing evidence, and effort; search volumes and keyword difficulty have not been measured. + +## Current website: what is actually live + +The production website is **https://isome.isolated.tech/**. iso.me is the product name. Keep the existing host and `/blog/` URLs. + +A direct HTTP audit fetched all **27 sitemap URLs** successfully. Each returned 200, one H1, a unique title, an English language declaration, and the expected self-canonical. All sitemap pages were reachable within two internal-link clicks of the homepage. No language alternatives were present. These results establish delivery and basic site structure, not Google indexation or rankings. + +| Live content | Count | +| --- | ---: | +| Homepage | 1 | +| Blog hub and articles | 1 + 7 | +| Comparison hub and Google comparison | 1 + 1 | +| Documentation hub and reference pages | 1 + 11 | +| About, contact, privacy, terms | 4 | +| Total | 27 | + +The local site checker also passes: **28 HTML pages, 873 local targets**, metadata, JSON-LD, IDs, and sitemap coverage. Its 28th page is the 404 template, excluded from the sitemap. Live audit details are in [the inventory](seo-live-inventory-2026-10-26.json). Some web-search extraction still showed the previous one-article blog; the direct live fetch establishes the current inventory. + +Strengths already implemented: task-oriented homepage links and guide hub; separate setup/history/GPX/backup/support intents; crawlable static content; contextual related links; comparison content; author/review dates; screenshots; synthetic downloadable examples; accurate free-recording versus paid-export explanations. No framework migration, duplicate `/guides/` section, or broad redesign is indicated by this audit. Core Web Vitals, live mobile rendering, backlinks, and whole-property indexation were not measured in this review. + +## Priority zero: reconcile the product before expanding claims + +### Google import changes the acquisition opportunity + +The deployed Google comparison says **“No Google Timeline importer.”** The history guide says iso.me does not import Google files. The backup guide says it does not skip duplicates. These statements describe older behavior and conflict with current source: + +- `IsoMe/Utilities/GoogleTimelineImportService.swift` handles classic Location History, legacy Semantic Timeline, and device Timeline JSON. +- `IsoMe/Utilities/TimelineImportService.swift` implements preview, selected record types, and approximate duplicate detection. +- [Existing simulator QA](qa/google-timeline-import.md) records preview, cancellation, persistence, and repeated-import checks. + +Confirm support in the publicly distributed build before changing the website to an availability promise. Apple's public US lookup returned **1.7.16**, released October 26 at 15:37 UTC; the checkout targets **1.7.17**. The importer commit itself targeted 1.7.16, so the version difference does **not** establish that import is unreleased. Check the released build/source mapping or the installed App Store build. Record the verified minimum version on the relevant pages. + +Reconcile `/compare/google-maps-timeline/`, `/blog/view-location-history-iphone/`, `/docs/export-import/`, `/blog/back-up-iphone-location-history/`, and any conflicting linked copy in one content batch. Preserve valid distinctions: an importer cannot recreate unrecorded/deleted history; raw points do not imply inferred visits; GPX import remains unsupported. Separate the older iso.me restore workflow from the new Google migration workflow. + +Also reconcile prices between the website, README, and authoritative regional purchase sheet. The website quotes US $19.99/$39.99; README quotes $10/$20, also surfaced in the sampled App Store extraction. This is a consistency issue to verify, not a basis to declare one source current from cached text. Review the privacy policy/App Store disclosure alongside the actual telemetry behavior. Keep this a factual reconciliation, not a redesign project. + +### Make the acquisition path measurable + +Use the existing [Search Console baseline](search-console-baseline-2026-10-26.md): September 27–October 24 had **5 clicks, 297 impressions, 1.7% CTR**. The original journal article had **60 impressions and zero clicks**; the homepage received all five clicks. These are historical values from a filtered property, not performance of the newly deployed cluster. Query/country/device breakdowns are partial; there is no defensible country ranking or complete branded/nonbranded split. + +First measurement tasks: + +1. Record the deployment/intervention date from the release history. Check sitemap discovery and URL Inspection for the comparison, GPX, history, and original journal pages. The old report's 17 discovered URLs is not a current count. +2. Add explicit outbound `app_store_clicked` collection with page path and CTA placement, preserving the existing analytics exclusion gate. Do not include coordinates, user text, arbitrary query strings, or location files. +3. Generate genuine page-level Apple campaign links using the account's provider token. Start with home, journal, Google comparison, and GPX rather than fragmenting a tiny audience into dozens of campaigns. +4. Report organic landing visits, outbound clicks, attributable first-time downloads, and purchases separately. Apple campaign reporting has minimum thresholds; missing reports are not measured zeros. Do not promise a deterministic click-to-purchase join. + +## Ordered page backlog + +Existing pages are improvements, not pages to recreate. Effort estimates are editorial/engineering person-days, excluding App Store review, waiting for search data, and access-dependent verification. + +| Order | Action / page | Target reader intent | Concrete deliverable | Effort | +| --- | --- | --- | --- | ---: | +| 1 | Improve Google comparison + export reference | “Google Timeline alternative iPhone”; supported imports | Release-accurate migration row, preserved Google strengths, supported-format matrix, preview/deduplication limits, tested screenshot, link to migration guide when live | 1–2 days | +| 2 | Improve existing private-journal article | “private location journal iPhone”; “location history stored locally” | One verified first-recording example, current screenshots, specific privacy boundaries, contextual CTA after the successful example | 1 day | +| 3 | Improve GPX route article | “record route iPhone GPX”; “iPhone GPS logger export GPX” | Real app recording → export → opened in a named compatible viewer, measured point/time details, screenshots of the same route, clear paid-file boundary | 1–2 days | +| 4 | Create `/blog/import-google-timeline-iphone/` | “import Google Timeline iPhone”; “move Google Timeline to another app” | Versioned export-to-import walkthrough with preview, duplicates, supported Google JSON variants, failure paths, and original archive retained | 1–2 days after availability check | +| 5 | Improve history article and backup guide | Find already-recorded history; retain/restoring iso.me records | Current Apple/Google screenshots and migration link; actual clean-destination restore check and corrected duplicate behavior | 1–2 days | +| 6 | Improve `/docs/apple-watch/` | “record GPS route Apple Watch without iPhone” | Watch-only route, reconnect/Sync Now, phone route confirmation, then export; tested device/app/OS labels | 1–2 days | +| 7 | Improve homepage and hubs incrementally | Choose the right next task | Add migration link after publication; surface verified workflow proof near download; add desktop App Store QR; group support pages separately from acquisition entry points | 0.5–1 day | +| 8 | Create `/blog/track-days-in-country-iphone/` | “track days spent in each country iPhone” | Country Days setup, recorded/manual dates, travel-day/timezone example, gaps, CSV export and clear counting rules | 1–2 days after release/workflow check | +| 9 | Improve existing Obsidian article; then verify Dawarich | Use location records in another system | Add only verified plugin/mobile/scheduling behavior; publish Dawarich integration only after actual receiver persistence test | Estimate after checks | + +Order 1 corrects misleading buying information. Order 2 has the strongest existing page-level visibility evidence. Order 3 is closest to the paid export workflow. Order 4 is the first genuinely new acquisition task. If release verification blocks migration, continue the journal/GPX/Watch improvements rather than publish unsupported instructions. + +### New page brief: Google Timeline migration + +**Title:** How to Import Google Timeline into iso.me on iPhone. **URL:** `/blog/import-google-timeline-iphone/`. **Primary action:** download/open the supported app version and preview an import. Import is free in current source; clearly separate paid re-export. + +Cover one complete task: + +1. Identify the app version and supported JSON variants. Link Google's official iPhone export instructions; distinguish current device export from legacy Takeout archives. +2. Save the original archive to Files and keep a separate unchanged copy. Unzip Takeout before selecting individual JSON files. +3. In iso.me, open Settings → Data Import → Import File. Show format, date range, invalid/unsupported counts, new records, duplicates, and selection controls. +4. Demonstrate preview cancellation and a confirmed import. Review a known date on the map/Timeline. Reopen the same synthetic fixture to show the duplicate result. +5. Explain single-file limits: 50 MiB and 250,000 visits plus points; no ZIP/folder import; raw-history points do not create visits; untimed waypoints are not invented. +6. Address unsupported archives, empty results, and approximate duplicate matching. Avoid implying a lossless replica of every Google activity or label. + +Use a clearly synthetic downloadable fixture from the existing test format. Supplement existing simulator QA with the supported public build and sanitize screenshots. Link in from comparison, history article, export reference, homepage task section, and blog hub. Link out to comparison (whether to switch), backup (keeping records), and GPX (using routes). Keep export-only Google questions in this walkthrough initially instead of creating three overlapping migration pages. + +### New page brief: country-day journal + +**Title:** How to Track Days Spent in Each Country on iPhone. **URL:** `/blog/track-days-in-country-iphone/`. **Primary action:** try the free Country Days view once verified as available. + +Current source has `CountryDaysView`, `CountryDayResolver`, `CountryStay`, and `CountryDayTests`. Verify the public version before promotion. Show Timeline → Country Days, period filters, country detail, and adding a manual stay. Demonstrate a synthetic cross-border trip: dates use location timezones; a travel date can count in both countries; repeated evidence for one date is deduplicated; unknown locations and gaps are not filled; open/unverified visits contribute only arrival dates. Show what Analyze saved locations sends through Apple geocoding and how network opt-out changes the result. Country-day CSV writing uses the export purchase. + +This is a personal travel record page. Describe its actual counting rules and avoid presenting its totals as an official immigration, tax-residency, or visa calculation. Link to the history/setup guide, privacy reference, and export reference. Add deeper calculation pages only if distinct supported tasks and query demand appear. + +### Improve existing pages without creating duplicates + +- **Journal:** preserve the URL and answer immediately. The page already has setup, privacy and backup sections; replace illustrative evidence with a checked outing instead of adding more generic introduction. Keep the free-download CTA after demonstrated value and at the end. +- **Google comparison:** owns choosing a recorder, not the entire import tutorial. Acknowledge Google's device history and encrypted backup. Use its official docs and test dates. A Google account reset or export format alone proves nothing about competing security designs. +- **GPX:** owns recording/exporting a route. Name the viewer only after opening the actual exported track. Use a public route or a sanitized isolated recording, not private home coordinates. The current synthetic XML fixture is useful, but it is not evidence of a full app workflow. +- **History:** owns finding existing records; answer Apple and Google questions before offering future recording or import. Do not redirect every problem to a purchase. +- **Backup:** owns preservation and restoration; demonstrate saved records on a clean destination and distinguish GPX map files from importable records. New duplicate handling needs a release/version note. +- **Watch:** keep the existing reference URL as the intent owner. Add evidence to it before creating a separate competing Watch article. +- **Obsidian:** the existing page owns manual Markdown handoff. README links an iso.me Maps plugin, but plugin existence alone does not verify its current compatibility or mobile/scheduled delivery. Extend this page after testing before adding `/integrations/obsidian/`. +- **Shortcuts and places:** current source includes new manual-visit actions while docs still advertise nine actions. Reconcile the existing references with the released action set. Later add one real check-in/check-out recipe if supported queries justify it. + +## Practical rollout + +| Period from kickoff | Work | Completion evidence | +| --- | --- | --- | +| Days 1–2 | Public-version and pricing reconciliation; correct relevant pages; acquire baseline/indexing snapshot; specify outbound events and Apple campaigns | Release/version ledger, consistent copy, recorded measurement contract | +| Days 3–7 | Journal and GPX proof improvements; migration walkthrough if supported | Reviewed screenshots and sample, working import/export path, internal links, page-level download tracking | +| Week 2 | Backup and Watch validation; tune homepage/hub discovery; refresh history instructions | Checked restoration/transfer results, live link checks and sitemap, original pre-release baseline preserved | +| Weeks 3–4 | Review actual queries and indexation; publish country-day guide if verified and still the best product-fit next task | Source/build availability, counting example, distinct intent, no duplicate title/topic pages | +| Days 31–60 | Improve pages earning relevant impressions; select one integration or locale experiment | Evidence-based selection, explicit hypothesis and equal-window results | + +This is a focused backlog, not a commitment to publish daily. New pages should add a distinct task and first-hand proof. Google recommends useful, original content; page count and publishing cadence do not establish quality. + +## Weekly decision rules and expansion gates + +Use Search Console at the **query + page** level. Check whether an intended URL earns relevant impressions; fix indexing or answer mismatch before multiplying articles. At the present scale, one zero-click query or one high position does not establish a winner. Compare equal scoped windows after allowing for reporting lag, and retain the pre-release baseline. + +- Relevant impressions but weak positions: improve the actual answer, supporting evidence and related links first; create a URL only for a materially different task. +- Visible relevant queries but few clicks: review title/snippet and intent. Do not conclude the title caused low CTR from a handful of impressions. +- Organic visits without outbound clicks: inspect task completion, product fit, CTA timing and free/paid clarity. +- Outbound clicks without visible installs: check campaign validity, reporting thresholds, and App Store message match before concluding the page fails. + +At day 30, success first means key pages are discoverable/indexable, workflows match the app, and acquisition can be measured. At day 60, assess relevant nonbrand exposure, clicks and attributable installs, with sample sizes stated. Set business targets after usable conversion data exists instead of promising Vaultaire's reported conversion rate. + +**Localization:** the current website is English-only. Select one language using reliable App Store demand, meaningful Search Console evidence, and available language QA. There is not enough country data in the baseline to choose Spanish, Polish, or another language on SEO evidence alone. Translate a small coherent cluster: homepage, journal, best-performing acquisition page, and relevant help/navigation. Use separate localized URLs, reciprocal `hreflang`, self-canonicals, and a language selector. Do not launch 32 languages at once. + +**Tools:** defer a browser GPX/GeoJSON viewer until file-viewing queries or support needs justify it. If built later, process files locally and make its link to the recorder useful. Generic QR/image converters are a weak fit here. + +**Integrations:** keep [Dawarich](dawarich-guide-verification-2026-10-26.md) on hold until protocol, authentication and destination persistence are tested. A successful connection response does not demonstrate stored route data. Avoid speculative best-app roundups or competing scenario pages until actual product tests and demand justify them. + +**Authority:** make the verified examples and synthetic fixtures useful enough to cite. Link the documentation from the public repository and related product documentation where helpful. Outreach or community messages are a separate action; none were sent or scheduled. No backlink count or authority score was measured. + +## Execution locations and acceptance criteria + +New articles: edit `marketing/content/` and metadata/related links in `marketing/scripts/build_seo_pages.py`. Docs: edit `marketing/scripts/build_docs.py`. Homepage, blog hub and original journal: direct HTML. Rebuild with `python3 marketing/scripts/build_site.py`; run `python3 marketing/scripts/check_site.py`. Follow [the website README](../marketing/README.md). + +For each material page change: immediate useful answer, distinct intent, current supported version, checked screenshots/steps, relevant sources, truthful free/paid boundary, contextual next steps, working App Store CTA, mobile-readable tables/images, title/description/canonical consistency, appropriate structured data, and sitemap inclusion. Check deployed status separately from build success. Preserve existing URLs and only update review dates for actual reviews/changes. + +## Sources and limits + +- Live [homepage](https://isome.isolated.tech/), [blog](https://isome.isolated.tech/blog/), [comparison](https://isome.isolated.tech/compare/google-maps-timeline/), [export reference](https://isome.isolated.tech/docs/export-import/), and [sitemap](https://isome.isolated.tech/sitemap.xml). Direct crawl, October 26, 2026; basic delivery/link audit only. +- [Public App Store listing](https://apps.apple.com/us/app/iso-me/id6761960794) and [US public lookup](https://itunes.apple.com/lookup?id=6761960794&country=us). Lookup version differs from cached search extraction; neither maps every feature to a released binary. +- Existing [Search Console baseline](search-console-baseline-2026-10-26.md), [Vaultaire analysis](vaultaire-seo-analysis-2026-10-26.md), [import QA](qa/google-timeline-import.md), and current app source. Saved QA is prior evidence; no new device test was run for this planning request. +- [Google Timeline iPhone help](https://support.google.com/maps/answer/6258979?co=GENIE.Platform%3DiOS&hl=en), [Apple campaign links](https://developer.apple.com/help/app-store-connect-analytics/acquisition/campaign-links), [Google helpful-content guidance](https://developers.google.com/search/docs/fundamentals/creating-helpful-content), [localized-page guidance](https://developers.google.com/search/docs/specialty/international/localized-versions). + +No new private Search Console report, backlink dataset, keyword-volume study, conversion dataset, or performance benchmark was collected in this review. The saved baseline is clearly historical; the live audit is current to the check date. diff --git a/docs/seo-content-inventory-2026-10-26.md b/docs/seo-content-inventory-2026-10-26.md index d513289f..b1e3ab79 100644 --- a/docs/seo-content-inventory-2026-10-26.md +++ b/docs/seo-content-inventory-2026-10-26.md @@ -1,6 +1,8 @@ # iso.me article cluster inventory -Reviewed October 26, 2026. All paths below are implemented locally. They are not evidence of production deployment or measured search demand. The Search Console baseline remains the pre-deployment baseline. +Reviewed October 26, 2026. The initial direct HTTP audit confirmed the then-existing 27 sitemap URLs live. The implementation below adds the Country Days guide, bringing the live sitemap to 28 URLs. The Search Console baseline remains the pre-deployment baseline and does not measure the new cluster's results. See [the refreshed SEO priorities](isome-seo-priorities-2026-10-26.md) for the live audit and next work. + +**Release reconciliation completed:** The verified public build is 1.7.16 (46), from source preceding the importer. Public pages now state those version-specific limits; the Google migration walkthrough remains a non-public draft. Country Days is in that public build and now has a guide. See [implementation results](seo-implementation-2026-10-26.md). The following was the earlier source-drift finding: current source adds Google Timeline JSON import, preview, and duplicate detection; the live comparison, history guide, backup guide, and export reference still describe the older behavior. Align claims with confirmed public app versions. Country Days and expanded manual-visit Shortcuts also need a release-aware content review. The rows below record the original article scopes, not proof that their product claims remain current. | Page | Reader task | Distinct scope | Evidence and remaining limits | | --- | --- | --- | --- | @@ -14,6 +16,8 @@ Reviewed October 26, 2026. All paths below are implemented locally. They are not | `/blog/iphone-location-journal-obsidian/` | Read visit records in a desktop vault | Manual Markdown handoff and generated-file boundaries | Hand-authored synthetic note rendered in Obsidian 1.14.4; mobile and scheduled delivery untested | | `/docs/apple-watch/` | Record away from iPhone and check transfer | Existing feature reference, controls and status meanings | Current source and existing replay context; no new physical Watch walk claimed | +| `/blog/track-days-in-country-iphone/` | Review country dates | Counting rules, timezones, manual stays and optional CSV | Verified released source; current simulator interface capture; synthetic counting examples | + ## Reader paths The blog hub groups tasks into **find and check history**, **record and review routes**, and **keep and use records**. Each generated article offers two task-specific next steps. The original journal remains the introductory article and links to deeper workflows in context. diff --git a/docs/seo-implementation-2026-10-26.md b/docs/seo-implementation-2026-10-26.md new file mode 100644 index 00000000..f27860a9 --- /dev/null +++ b/docs/seo-implementation-2026-10-26.md @@ -0,0 +1,70 @@ +# SEO implementation and release results + +October 26, 2026. Implements the available first release of [the prioritized plan](isome-seo-priorities-2026-10-26.md). Later product releases, physical workflow checks, and traffic observation remain separate gates; this does not claim the full 60-day plan is finished. + +## Deployed + +Production: **https://isome.isolated.tech/**. Cloudflare Pages project: `spotted`. Final deployment: `9b4b2698` ([snapshot](https://9b4b2698.spotted-8ez.pages.dev)). Prior production before this batch: `9770175a`. The site now has 28 sitemap pages plus its excluded 404 template. + +- Published [Track days spent in each country on iPhone](https://isome.isolated.tech/blog/track-days-in-country-iphone/), with counting rules, travel-day and timezone examples, manual stays, geocoding boundaries, CSV limitations, current app UI, and links to setup/backup help. +- Linked the guide from the homepage, guide hub, original journal article, and Timeline reference. Added a download CTA after the journal setup steps and clarified background-permission wording. +- Added a locally generated App Store QR image and a desktop-to-phone download path. It uses the existing official app URL. +- Added explicit public-build scope to Google comparison, history, export, and backup instructions. The published limitations were accurate for the released binary even though development source had advanced. +- Reconciled README US prices and removed blanket no-analytics/no-dependencies wording that conflicted with the actual product. The website's existing prices were confirmed, not changed in App Store Connect. +- Added gated first-party acquisition counters, strict server validation, a separate aggregate D1 table, reporting SQL, privacy disclosure, public API contract, deployment migration step, and regression checks. +- Prepared the Google import article in `marketing/content/import-google-timeline-iphone.html`, with release-preview metadata and an outside-public preview command. The normal build rejects an accidentally deployed draft file. The live migration URL intentionally returns 404. + +## Release findings + +App Store Connect confirms **1.7.16 build 46** as publicly distributed. The archive source checkout was clean at `6ae78e622c72ee051e6f14113082556c398d926a`. That revision contains Country Days and predates Google Timeline import commit `0b7d5c6`. The current checkout targets 1.7.17; it was not released as part of this website task. + +Current US lifetime prices: Individual $19.99, Family $39.99, Family Upgrade $19.99. Other storefronts vary. Machine-readable, non-secret facts are saved in [the release snapshot](seo-release-facts-2026-10-26.json). + +Country Days UI was opened in the existing test simulator. Its captured development build is 1.7.17 (47), iOS 26.5; the public guide labels that fact. It shows zero resolved country dates. The counting example is invented, not a newly recorded cross-border trip. Its WebP image is approximately 53 KB. + +## Measurement contract + +`POST /api/v1/acquisition` accepts only `page_view` or `app_store_clicked`, an exact known public page path, a fixed placement, and a coarse referrer category. It rejects cross-origin/form requests, unknown fields/pages, and bodies over 512 bytes. The browser waits for the existing analytics exclusion gate, fails closed, and honors GPC/DNT. Requests omit credentials and referrer headers. + +The `website_acquisition_daily` table stores UTC day, event, public page, placement, source category, and count. No event-level log, user ID, cookies, browser storage, location file, coordinates, free text, full referrer, or query string is stored by this collector. It shares the existing D1 database but uses a separate table and never writes onboarding records. + +Page loads and activations are not unique visitors, installs, purchases, or an organic session conversion rate. The source category is per-page referrer context; the code does not preserve the original acquisition source through internal navigation. Excluded browsers, early exits, network failures, and automated requests limit interpretation. No synthetic valid event was inserted into production to inflate counts. + +Apple campaign links are now configured after explicit owner approval. An existing +signed-in App Store Connect browser session was used to generate `seo-home`, +`seo-private-journal`, `seo-google-timeline`, and `seo-gpx`. Each returned the +genuine public developer provider token `126424970`. The approved links are +applied to all download anchors on their four respective pages, including +header/footer anchors. The homepage QR was regenerated for `seo-home` and its +URL consistency is enforced by the build. Unmeasured pages and product metadata +keep the canonical App Store URL. + +Automatic review initially blocked opening campaign generation, after which the +owner explicitly authorized creating and applying the four links. That blocker +is resolved. No credentials or session tokens were copied into the repository. +Apple still reports insufficient campaign data; generation is not evidence of +installs, and its reporting thresholds/delays still apply. + +Report with the SQL command in [the website README](../marketing/README.md). No recurring automation was created. + +## Verification + +- Build: 29 HTML pages, 950 local targets, metadata, JSON-LD, canonical URLs, IDs, and sitemap coverage pass. Consecutive builds produce identical public assets. +- Acquisition regression tests: five tests covering valid counts, invalid/private dimensions, methods/origins/body bounds, unavailable binding, GPC/DNT, exclusions/gate failures, preview suppression, and no-referrer requests pass. +- Local Pages + real local D1: one page view and two activations produce two daily rows with counts one and two. These are local test data only. +- All 28 production HTML/Markdown pairs, cache separation, API representation/method behavior, missing-page responses, and asset integrity passed the HTTP checker. +- Production guide, listener, and QR returned 200 with the verification user agent; held migration URL returned 404. The live collector returned 400 for an intentionally invalid path without storing it. Generic Python requests sometimes received edge 403s; the verifier and actual Chrome loads succeeded. +- Mobile browser: homepage, journal, and new guide fit a 390-pixel viewport with no page-level horizontal overflow or broken images. The new guide's mobile Lighthouse accessibility, best-practices, SEO, and agentic-browsing scores were 100. That audit excludes performance; no new production Core Web Vitals claim is made. +- Existing public JSON samples still pass the actual Swift importer: two visits, three points, expected values, and rejection of an incomplete visit. This is parser compatibility, not a new device restore test. +- Google Search Console's live URL test reports **URL is available to Google / Page can be indexed**, with one valid Breadcrumbs item. A subsequent request confirmed **Indexing requested / URL was added to a priority crawl queue**. Google completed its verification automatically; no CAPTCHA was solved. Indexing or ranking is not yet established. + +Screenshot of the live mobile guide is retained locally at `build/seo-evidence/country-guide-mobile.png` (ignored build output). Search performance still uses the preserved September 27–October 24 baseline; it has not been recast as results of this deployment. + +## Remaining work and publication gates + +1. Confirm a public app build containing Google import, repeat preview/import/duplicate checks against it, then promote the prepared article and update linked product claims together. Do not publish it merely because source exists. +2. Capture a real recording-to-GPX-to-viewer workflow, clean-destination restore, and physical Watch-only walk/transfer before claiming those specific workflows newly verified. Existing guides remain explicit about evidence limits. +3. Verify Obsidian plugin/mobile/scheduled delivery and Dawarich receiver persistence before extending integration promises. No receiver or user data was sent to a third party in this batch. +4. Review relevant queries/indexation and acquisition counters after reporting lag. Choose further articles or a small localization pilot from meaningful demand evidence, not today's sparse sample. + +No app binary, pricing, account permissions, or scheduled automation was changed. The external changes in this batch are the website deployments, separate aggregate table, approved Apple campaign-link generation, and Google indexing request. diff --git a/docs/seo-live-inventory-2026-10-26.json b/docs/seo-live-inventory-2026-10-26.json new file mode 100644 index 00000000..3ea2aace --- /dev/null +++ b/docs/seo-live-inventory-2026-10-26.json @@ -0,0 +1,413 @@ +{ + "review_date": "2026-10-26", + "scope": "Direct HTTP fetches of the live sitemap URLs; not a Google indexation or performance audit", + "sitemap_url": "https://isome.isolated.tech/sitemap.xml", + "page_count": 27, + "pages": [ + { + "path": "/", + "status": 200, + "final": "https://isome.isolated.tech/", + "title": "Private iPhone Location History & Route Journal \u2014 iso.me", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/" + ], + "description": [ + "iso.me is a private location journal for iPhone and Apple Watch. Automatically record visits and routes on-device, with no account, no iso.me location servers, and optional export in eight formats when you need your history." + ], + "hreflang": 0 + }, + { + "path": "/about", + "status": 200, + "final": "https://isome.isolated.tech/about", + "title": "About iso.me \u2014 Private iPhone Location Journal", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/about" + ], + "description": [ + "Meet iso.me, the open source iPhone and Apple Watch location journal built by Cody Bontecou at isolated.tech." + ], + "hreflang": 0 + }, + { + "path": "/blog/", + "status": 200, + "final": "https://isome.isolated.tech/blog/", + "title": "iPhone Location History Guides \u2014 iso.me", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/blog/" + ], + "description": [ + "Practical iPhone location history guides: record a private journal, compare Google Timeline, choose export formats, and understand tracking controls." + ], + "hreflang": 0 + }, + { + "path": "/blog/back-up-iphone-location-history/", + "status": 200, + "final": "https://isome.isolated.tech/blog/back-up-iphone-location-history/", + "title": "Back Up and Restore iPhone Location History \u2014 iso.me", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/blog/back-up-iphone-location-history/" + ], + "description": [ + "Export iso.me visits and GPS points as separate JSON files, verify your copies, and restore supported records. Learn what scheduled exports do and do not keep." + ], + "hreflang": 0 + }, + { + "path": "/blog/iphone-location-journal-obsidian/", + "status": 200, + "final": "https://isome.isolated.tech/blog/iphone-location-journal-obsidian/", + "title": "Export an iPhone Location Journal to Obsidian \u2014 iso.me", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/blog/iphone-location-journal-obsidian/" + ], + "description": [ + "Export iso.me visits as Markdown, copy the note into an Obsidian desktop vault, and keep your writing separate. Includes a synthetic sample and sync limits." + ], + "hreflang": 0 + }, + { + "path": "/blog/iphone-location-tracking-battery/", + "status": 200, + "final": "https://isome.isolated.tech/blog/iphone-location-tracking-battery/", + "title": "iPhone GPS Tracking and Battery Use: iso.me Settings", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/blog/iphone-location-tracking-battery/" + ], + "description": [ + "Check iPhone battery activity, choose iso.me distance filters and auto-stop settings, and compare route detail without assuming a guaranteed battery saving." + ], + "hreflang": 0 + }, + { + "path": "/blog/missing-location-history-iphone/", + "status": 200, + "final": "https://isome.isolated.tech/blog/missing-location-history-iphone/", + "title": "Missing Visits or GPS Points in iso.me? iPhone Checks", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/blog/missing-location-history-iphone/" + ], + "description": [ + "Diagnose an empty iso.me day, incomplete GPS route, missing visit, pending Watch sync, or filtered export. Preserve existing records before retrying." + ], + "hreflang": 0 + }, + { + "path": "/blog/private-location-journal-iphone/", + "status": 200, + "final": "https://isome.isolated.tech/blog/private-location-journal-iphone/", + "title": "How to Keep a Private Location Journal on iPhone \u2014 iso.me", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/blog/private-location-journal-iphone/" + ], + "description": [ + "A practical guide to keeping a private iPhone location journal with on-device history, local review, open-format exports, and carefully optional webhooks." + ], + "hreflang": 0 + }, + { + "path": "/blog/record-iphone-route-gpx/", + "status": 200, + "final": "https://isome.isolated.tech/blog/record-iphone-route-gpx/", + "title": "How to Record an iPhone Route and Export GPX \u2014 iso.me", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/blog/record-iphone-route-gpx/" + ], + "description": [ + "Record a route in iso.me, preview GPS points, export GPX to Files, and check the result. Includes a synthetic sample and clear free and paid limits." + ], + "hreflang": 0 + }, + { + "path": "/blog/view-location-history-iphone/", + "status": 200, + "final": "https://isome.isolated.tech/blog/view-location-history-iphone/", + "title": "How to See Your Location History on iPhone \u2014 iso.me", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/blog/view-location-history-iphone/" + ], + "description": [ + "Find your own visited places in Apple Maps, check Google Timeline, and understand missing records before starting a new iPhone location journal." + ], + "hreflang": 0 + }, + { + "path": "/compare/", + "status": 200, + "final": "https://isome.isolated.tech/compare/", + "title": "Compare iPhone Location Journals \u2014 iso.me", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/compare/" + ], + "description": [ + "Compare iso.me with Google Timeline on iPhone: accounts, recording, backups, exports, and the limits of moving an existing archive." + ], + "hreflang": 0 + }, + { + "path": "/compare/google-maps-timeline/", + "status": 200, + "final": "https://isome.isolated.tech/compare/google-maps-timeline/", + "title": "Google Timeline Alternative for iPhone: iso.me Compared", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/compare/google-maps-timeline/" + ], + "description": [ + "Compare iso.me and Google Timeline for iPhone: accounts, local history, encrypted backup, GPX and CSV exports, pricing, and import limitations." + ], + "hreflang": 0 + }, + { + "path": "/contact", + "status": 200, + "final": "https://isome.isolated.tech/contact", + "title": "Contact iso.me \u2014 Support and Project Links", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/contact" + ], + "description": [ + "Contact iso.me developer Cody Bontecou for support, bug reports, and questions about the private iPhone location journal." + ], + "hreflang": 0 + }, + { + "path": "/docs/", + "status": 200, + "final": "https://isome.isolated.tech/docs/", + "title": "Documentation \u2014 iso.me Docs", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/docs/" + ], + "description": [ + "Practical guides for every corner of iso.me: tracking, timelines, exports, automation, the Apple Watch app, and privacy." + ], + "hreflang": 0 + }, + { + "path": "/docs/apple-watch/", + "status": 200, + "final": "https://isome.isolated.tech/docs/apple-watch/", + "title": "Record Apple Watch GPS routes without your iPhone \u2014 iso.me Docs", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/docs/apple-watch/" + ], + "description": [ + "Independent watch tracking, offline sync, and complications." + ], + "hreflang": 0 + }, + { + "path": "/docs/automatic-exports/", + "status": 200, + "final": "https://isome.isolated.tech/docs/automatic-exports/", + "title": "Automatic exports \u2014 iso.me Docs", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/docs/automatic-exports/" + ], + "description": [ + "Schedule exports once a day or every few hours, keeping one file per day." + ], + "hreflang": 0 + }, + { + "path": "/docs/export-import/", + "status": 200, + "final": "https://isome.isolated.tech/docs/export-import/", + "title": "Export and restore location history \u2014 iso.me Docs", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/docs/export-import/" + ], + "description": [ + "Eight export formats, filters, filename templates, and free import for restores." + ], + "hreflang": 0 + }, + { + "path": "/docs/getting-started/", + "status": 200, + "final": "https://isome.isolated.tech/docs/getting-started/", + "title": "Getting started \u2014 iso.me Docs", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/docs/getting-started/" + ], + "description": [ + "Install, onboarding, permissions, and your first tracking session." + ], + "hreflang": 0 + }, + { + "path": "/docs/photos/", + "status": 200, + "final": "https://isome.isolated.tech/docs/photos/", + "title": "Photos on the map \u2014 iso.me Docs", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/docs/photos/" + ], + "description": [ + "Optionally connect your Photos library to place pictures on your map and outings." + ], + "hreflang": 0 + }, + { + "path": "/docs/places/", + "status": 200, + "final": "https://isome.isolated.tech/docs/places/", + "title": "Places, corrections & manual entries \u2014 iso.me Docs", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/docs/places/" + ], + "description": [ + "Confirm or correct detected visits, save places, and add visits by hand." + ], + "hreflang": 0 + }, + { + "path": "/docs/privacy-data/", + "status": 200, + "final": "https://isome.isolated.tech/docs/privacy-data/", + "title": "Privacy & your data \u2014 iso.me Docs", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/docs/privacy-data/" + ], + "description": [ + "What stays on your device, what can leave it, and how deletion works." + ], + "hreflang": 0 + }, + { + "path": "/docs/siri-shortcuts/", + "status": 200, + "final": "https://isome.isolated.tech/docs/siri-shortcuts/", + "title": "Siri & Shortcuts \u2014 iso.me Docs", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/docs/siri-shortcuts/" + ], + "description": [ + "Nine actions for tracking, stats, renaming, and exports." + ], + "hreflang": 0 + }, + { + "path": "/docs/timeline-outings/", + "status": 200, + "final": "https://isome.isolated.tech/docs/timeline-outings/", + "title": "Timeline & outings \u2014 iso.me Docs", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/docs/timeline-outings/" + ], + "description": [ + "The daily timeline, inferred outings, route replay, and editing or deleting sessions." + ], + "hreflang": 0 + }, + { + "path": "/docs/tracking/", + "status": 200, + "final": "https://isome.isolated.tech/docs/tracking/", + "title": "Visits, routes & battery \u2014 iso.me Docs", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/docs/tracking/" + ], + "description": [ + "How automatic visit detection and route recording work, and the settings that control them." + ], + "hreflang": 0 + }, + { + "path": "/docs/webhooks/", + "status": 200, + "final": "https://isome.isolated.tech/docs/webhooks/", + "title": "Webhooks & self-hosting \u2014 iso.me Docs", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/docs/webhooks/" + ], + "description": [ + "Configure optional delivery and verify your receiver\u2019s payload and authentication requirements." + ], + "hreflang": 0 + }, + { + "path": "/privacy", + "status": 200, + "final": "https://isome.isolated.tech/privacy", + "title": "Privacy Policy \u2014 iso.me", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/privacy" + ], + "description": [ + "iso.me privacy policy: location history is stored on-device with no account and no server-side location archive. Optional Apple services, first-party onboarding analytics, user-configured webhooks, and export-scheduling metadata are disclosed in full." + ], + "hreflang": 0 + }, + { + "path": "/terms", + "status": 200, + "final": "https://isome.isolated.tech/terms", + "title": "Terms of Service \u2014 iso.me", + "h1": 1, + "lang": "en", + "canonical": [ + "https://isome.isolated.tech/terms" + ], + "description": [ + "Terms for iso.me, a private iPhone location journal with local storage, free tracking, and optional export unlock." + ], + "hreflang": 0 + } + ] +} diff --git a/docs/seo-release-facts-2026-10-26.json b/docs/seo-release-facts-2026-10-26.json new file mode 100644 index 00000000..ba9ae1b1 --- /dev/null +++ b/docs/seo-release-facts-2026-10-26.json @@ -0,0 +1,33 @@ +{ + "checked_on": "2026-10-26", + "public_app": { + "version": "1.7.16", + "build": "46", + "state": "READY_FOR_DISTRIBUTION", + "source_commit": "6ae78e622c72ee051e6f14113082556c398d926a", + "google_timeline_import": false, + "country_days": true + }, + "us_lifetime_prices": { + "com.bontecou.isome.lifetime": { + "amount": "39.99", + "currency": "USD" + }, + "com.bontecou.isome.lifetime.family.upgrade": { + "amount": "19.99", + "currency": "USD" + }, + "com.bontecou.isome.lifetime.individual": { + "amount": "19.99", + "currency": "USD" + } + }, + "source_note": "App Store Connect release/build relationship; build-46 archive source checkout was clean at the recorded revision. Current development source is ahead of this binary.", + "apple_campaign_links": { + "/": "https://apps.apple.com/app/apple-store/id6761960794?pt=126424970&ct=seo-home&mt=8", + "/blog/private-location-journal-iphone/": "https://apps.apple.com/app/apple-store/id6761960794?pt=126424970&ct=seo-private-journal&mt=8", + "/compare/google-maps-timeline/": "https://apps.apple.com/app/apple-store/id6761960794?pt=126424970&ct=seo-google-timeline&mt=8", + "/blog/record-iphone-route-gpx/": "https://apps.apple.com/app/apple-store/id6761960794?pt=126424970&ct=seo-gpx&mt=8" + }, + "apple_campaign_source": "Generated in App Store Connect Campaigns UI with explicit owner approval; public provider token, not an authentication credential." +} diff --git a/marketing/README.md b/marketing/README.md index 05b6e725..314f17fb 100644 --- a/marketing/README.md +++ b/marketing/README.md @@ -74,7 +74,10 @@ python3 marketing/scripts/check_import_samples.py This checks record parsing and an invalid-file rejection, not persistence or a full device restore. Do not import sample data into a real journal just to -inspect the file format. Import currently adds records without deduplication. +inspect the file format. The verified public 1.7.16 build imports iso.me files +without the newer preview and duplicate checks. Current development source +includes Google import and duplicate handling; distinguish it from the +publicly distributed binary. The troubleshooting guide at `/blog/missing-location-history-iphone/` handles existing iso.me recordings; the broader history guide handles locating Apple, @@ -104,24 +107,87 @@ isolated.tech domain property filtered to iso.me. The dedicated URL-prefix property is processing; its sitemap already shows Success. Use the report's stored filters and date windows for repeatable comparisons. -The existing gated Cloudflare Web Analytics integration is retained. This -content batch adds no analytics endpoint, visitor identifier, or campaign token. - -1. After deployment, verify the new URLs in Search Console and confirm sitemap - discovery. Keep the saved pre-deployment baseline; record the deployment date. -2. Add an outbound `app_store_clicked` event to an approved analytics collector, - with page path and CTA placement. Preserve the current exclusion gate. Do not - send location records, user text, or arbitrary query strings. -3. Generate genuine App Store Connect campaign links using the account's - provider token. Suggested stable campaign labels: `seo-home`, - `seo-private-journal`, `seo-google-timeline`, and `seo-export-reference`. - Do not invent the provider token or treat ordinary UTM tags as Apple campaign - attribution. -4. Report organic visits, outbound clicks, visible campaign downloads, and - purchases separately. Account for reporting thresholds and delays. +The existing gated Cloudflare Web Analytics integration is retained. The shared +`public/assets/acquisition.js` adds coarse website counts after the same +exclusion gate allows collection. It also honors Global Privacy Control and Do +Not Track. It sends only an exact public page path, event, CTA placement, and +coarse referrer category. No cookies, browser storage, visitor IDs, raw URLs, +query strings, location records, or user text are collected by this listener. + +`POST /api/v1/acquisition` validates a maximum 512-byte same-origin JSON body +and updates `website_acquisition_daily` through the `SEO_DB` D1 binding. This +separate table shares the existing analytics database; it does not write app +onboarding records. Browser/gate failures lose events rather than delay a +navigation. The endpoint can receive synthetic or automated requests, so these +are coarse counters, not an audited attribution system. + +Run the privacy/validation tests: + +```sh +node --test marketing/scripts/acquisition.test.mjs +``` + +Initialize the local table and use the actual Pages runtime: + +```sh +wrangler d1 migrations apply iso-me-onboarding-analytics --local --config marketing/wrangler.jsonc +cd marketing +wrangler pages dev public --port 8892 +``` + +For a 28-day aggregate report: + +```sh +wrangler d1 execute iso-me-onboarding-analytics --remote --config marketing/wrangler.jsonc --file marketing/queries/acquisition.sql +``` + +Interpret `page_view` as page loads and `app_store_clicked` as activations, +not unique people, installs, or purchases. Referrer categories describe each +page's referrer: a later internal page does not retain the original search +source. Do not calculate an organic session conversion rate by joining these +rows. The UTC day is the server receipt day. The existing Search Console +baseline measures search-result clicks independently. + +Four pages now use Apple-generated campaign links: the homepage, private-journal +article, Google Timeline comparison, and GPX walkthrough. The genuine developer +provider token and stable campaign labels live in `content/acquisition.json`. +`campaign_links.py` rewrites download anchors during the build; public product +metadata and unmeasured pages keep their canonical App Store URLs. The homepage +QR encodes the same `seo-home` URL, checked against `assets/app-store-qr-url.txt`. +Regenerate the QR and its URL file when changing that configuration. + +Apple campaign reports have thresholds and delays. Keep organic visits, +outbound activations, visible campaign downloads, and purchases separate. + +After each deployment, record its date and inspect new URLs and sitemap +discovery in Search Console. Preserve the historical baseline and compare +explicit equal-length windows after allowing for reporting lag. A successful +HTTP response is not proof that Google indexed a page. See [Apple's campaign-link documentation](https://developer.apple.com/help/app-store-connect-analytics/acquisition/campaign-links) -and the [SEO execution plan](../docs/isome-seo-plan-2026-10-26.md). +and [the refreshed SEO priorities](../docs/isome-seo-priorities-2026-10-26.md). + +## Release-aware articles + +The Country Days guide is generated at +`/blog/track-days-in-country-iphone/` and linked from the homepage, guide hub, +and Timeline reference. The public 1.7.16 build 46 includes this feature. +Its screenshot is an iOS 26.5 simulator interface example, with no resolved +country history. Counting examples are invented, not a physical travel test. + +The Google Timeline migration walkthrough is prepared in `content/` and +listed in `DRAFTS` in `build_seo_pages.py`. It is intentionally absent from +`public/`, the sitemap, and acquisition links: the confirmed public build's +source predates the importer. Render it outside the deployment tree with: + +```sh +python3 marketing/scripts/preview_drafts.py +``` + +Before promoting it into `PAGES`, confirm the supporting public binary, +repeat import/duplicate checks, replace the release-preview notices, and +update the comparison, history, backup, and export references together. Current +source support alone is insufficient to claim App Store availability. ## Lighthouse diff --git a/marketing/content/acquisition.json b/marketing/content/acquisition.json new file mode 100644 index 00000000..97f1adad --- /dev/null +++ b/marketing/content/acquisition.json @@ -0,0 +1,9 @@ +{ + "providerToken": "126424970", + "campaigns": { + "/": "seo-home", + "/blog/private-location-journal-iphone/": "seo-private-journal", + "/compare/google-maps-timeline/": "seo-google-timeline", + "/blog/record-iphone-route-gpx/": "seo-gpx" + } +} diff --git a/marketing/content/back-up-iphone-location-history.html b/marketing/content/back-up-iphone-location-history.html index 1e7ac98c..b72fd469 100644 --- a/marketing/content/back-up-iphone-location-history.html +++ b/marketing/content/back-up-iphone-location-history.html @@ -79,7 +79,7 @@
Import adds records; do not assume it merges an overlapping archive or skips duplicates. Import each intended file once and inspect the result before retrying. If a file fails, retain it and read the reported format or field error before editing it. A JSON archive from Google Timeline has a different structure and is not a supported iso.me restore file.
+In App Store 1.7.16, import adds records without the newer preview and duplicate checks. Do not assume overlapping files are merged. Import each intended file once and inspect the result before retrying. If a file fails, retain it and read the reported format or field error before editing it. A JSON archive from Google Timeline has a different structure and is not a supported iso.me restore file.
Restore Purchases is separate. It restores an eligible paid entitlement through the App Store; it does not download a copy of your location history. iso.me does not provide an account-based server archive or built-in iCloud journal sync.
diff --git a/marketing/content/google-maps-timeline.html b/marketing/content/google-maps-timeline.html index 20494787..ebfae735 100644 --- a/marketing/content/google-maps-timeline.html +++ b/marketing/content/google-maps-timeline.html @@ -15,7 +15,7 @@Save Google’s exported archive separately before changing apps or devices. iso.me cannot import that archive or reconstruct earlier movement.
+Save Google’s exported archive separately before changing apps or devices. App Store 1.7.16 cannot import that archive. A future importer still cannot reconstruct records missing from the file.
For existing Apple or Google records, start with the iPhone history guide. For new iso.me routes, follow the GPX export walkthrough and check export and restore compatibility. A GPX file is useful for drawing a route elsewhere, but it cannot be imported into iso.me. Keep supported visit and point exports for records you want to restore later.
This walkthrough is prepared for the next supporting release. The currently verified App Store version, 1.7.16 build 46, does not contain this importer. Do not publish this draft as an available workflow until the released build includes Google Timeline import.
In the supporting build, importing is free. Re-exporting files uses the optional lifetime purchase. Files are read locally without a Google login, upload, or place-name lookup by iso.me.
On iPhone, follow Google’s current Timeline export instructions and save the JSON to Files. Google menus can vary during rollouts. If you already have a legacy Takeout ZIP, unzip it first and choose individual JSON files. iso.me’s importer does not accept a ZIP or an entire folder.
Retain an unchanged copy of the original. Importing a file does not move or delete Google history, and it cannot restore records absent from the archive.
| Export | What iso.me can read |
|---|---|
| Classic Location History | A locations array with coordinates and timestamps. Imports points, without inventing visits. |
| Legacy Semantic Timeline | timelineObjects with supported place visits and timed activity paths. |
| Device Timeline | semanticSegments or an iOS root array containing supported visits, activities, and timed paths. |
Each file is limited to 50 MiB and 250,000 visits plus points. Larger archives must be split before selection. Untimed waypoints are not given invented timestamps; unsupported and invalid entries appear in the preview counts.
The importer skips approximate matches within the file and against stored records. Points match at the same rounded second within 10 metres. Visit matching uses arrival, departure, and location tolerances. Review the counts; this is not a guarantee that every semantically similar record is identical.
Open Timeline or Map at a date represented in the archive. Check a known visit, its times, and the available route points. Retain the original while you inspect the result. Reopening the same file should show duplicates rather than offering those same records as new.
The synthetic fixture used by the existing simulator QA contains one new visit, two new points, in-file duplicates, and an invalid record. It is not personal location history. That prior simulator check does not verify this workflow in a newly released App Store binary.
For choosing a recorder, read the Google Timeline comparison. For keeping supported iso.me records afterwards, use the backup guide.
Publish this guide only after checking the supporting public app version, screenshots, and fixture result.
In iso.me, open Timeline → Country Days to count local dates represented by your recorded visits, route points, and manual stays. Choose this year, the last 365 days, or all time, then open a country to review its dates. Viewing the counts and adding manual stays are free. Writing the CSV file requires the optional export purchase.
+This guide covers Country Days in iso.me 1.7.16. It is a personal travel journal: its rules do not determine tax residency, immigration status, or how a visa counts a day.
+ +To collect new history, start recording before your trip. Start enables detailed GPS and visit monitoring together; Stop ends both. Read the first-recording guide for permissions and recording controls.
+
| Situation | How iso.me counts it |
|---|---|
| Many points in the same country on one date | One day for that country, rather than one day per record. |
| Two countries on a travel day | That date can count in both countries. Adding country totals may exceed the number of distinct dates. |
| A record near midnight | The resolved location’s timezone determines the local date, rather than UTC or your phone’s current timezone. |
| A completed visit with a verified departure | Its local date range can contribute multiple dates. |
| An open visit or unverified departure | Only its arrival date is counted. Route points or manual stays can account for other dates. |
| Unknown country, GPS outlier, or recording gap | No invented dates or automatic continuous stay. |
| Overlapping manual and recorded presence | The date counts once per country; the source flags can show both. |
Imagine a recorded point in Portugal on October 1 and another in Spain later that local date. Each country gets October 1. If a manual Portugal stay also includes October 1, Portugal still gets one day. If October 2 has no usable evidence or manual stay, the app does not fill it merely because you have records before and after it.
+This is an invented example of the counting rules, not a captured trip. Review gaps with the missing-records checklist before changing your journal.
+Use Add stay in Country Days. Choose the country and first and last dates, add an optional note, and save. Review the affected country’s dates afterwards. You can edit or delete a manual stay when you find a mistake.
+A manual stay records your account of a trip; it does not create a GPS path. Keep tickets or other original records separately if you need them. Overlapping manual stays do not multiply the same country/date.
+New recordings identify countries when network geocoding is enabled. Analyze saved locations checks earlier records in batches, with stop and resume controls. It can take time for a large archive.
+Country identification uses Apple geocoding and follows your network-geocoding preference. A lookup sends coordinates to Apple; turning it off changes which unresolved locations can be assigned a country. Your journal remains on your device, and iso.me does not receive an archive of it. See the privacy policy for all network boundaries.
+Analysis can identify a country for an existing coordinate. It cannot recover locations that were never recorded. Use a manual stay for dates you can account for independently.
+Use the export control in Country Days and save the CSV to a destination you choose. The file includes country codes, local dates, and recorded/manual source information. Viewing and editing your counts are free; writing this export requires the lifetime unlock. See current pricing.
+Check a known date and a travel day in the saved file. A country-date CSV is a summary, not a backup of every visit, route point, or manual stay. Keep your underlying records using the backup checklist.
+Start a free local journal and review Country Days on your iPhone.
Download free for iPhoneReviewed October 26, 2026 against the source used for App Store 1.7.16 build 46, including CountryDaysView, CountryDayCalculator, and CountryDayResolver. The examples are synthetic. They do not represent a new physical travel test.
diff --git a/marketing/content/view-location-history-iphone.html b/marketing/content/view-location-history-iphone.html index bca903f5..16b9a203 100644 --- a/marketing/content/view-location-history-iphone.html +++ b/marketing/content/view-location-history-iphone.html @@ -39,7 +39,7 @@Google Timeline stores history on the device and can keep an encrypted backup. To save an independent archive, Google’s iPhone instructions use Settings → Location & Privacy → Export Timeline data, then Save to Files. Settings are changing, so follow Google’s current Timeline guide if your menus differ.
-Keep that archive separately. iso.me does not import Google Timeline files; the Google Timeline comparison explains the tradeoffs before you change your recording setup.
+Keep that archive separately. The verified App Store 1.7.16 build does not import Google Timeline files; the Google Timeline comparison explains the tradeoffs before you change your recording setup.