Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
[![Platform](https://img.shields.io/badge/platform-iOS%2017%2B%20%7C%20watchOS%2010%2B-lightgrey)](#tech-stack)
[![Swift](https://img.shields.io/badge/swift-5-orange)](#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)**

Expand Down Expand Up @@ -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.

Expand All @@ -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

Expand Down
2 changes: 2 additions & 0 deletions docs/isome-seo-plan-2026-10-26.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
153 changes: 153 additions & 0 deletions docs/isome-seo-priorities-2026-10-26.md

Large diffs are not rendered by default.

6 changes: 5 additions & 1 deletion docs/seo-content-inventory-2026-10-26.md
Original file line number Diff line number Diff line change
@@ -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 |
| --- | --- | --- | --- |
Expand All @@ -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.
Expand Down
70 changes: 70 additions & 0 deletions docs/seo-implementation-2026-10-26.md
Original file line number Diff line number Diff line change
@@ -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.
Loading
Loading