diff --git a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/01 Privacy/P2 Best Private Notes Apps Android/06-atomic-notes-card.png b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/01 Privacy/P2 Best Private Notes Apps Android/06-atomic-notes-card.png index 73a2dfc..2f71a7f 100644 Binary files a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/01 Privacy/P2 Best Private Notes Apps Android/06-atomic-notes-card.png and b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/01 Privacy/P2 Best Private Notes Apps Android/06-atomic-notes-card.png differ diff --git a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/01 Privacy/P3 Notes App Privacy Mistakes/06-routine.png b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/01 Privacy/P3 Notes App Privacy Mistakes/06-routine.png index 9326437..be96eb0 100644 Binary files a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/01 Privacy/P3 Notes App Privacy Mistakes/06-routine.png and b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/01 Privacy/P3 Notes App Privacy Mistakes/06-routine.png differ diff --git a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L1 What Is a Local First Notes App/05-atomic-notes-layers.png b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L1 What Is a Local First Notes App/05-atomic-notes-layers.png index e1e149a..f7ab69e 100644 Binary files a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L1 What Is a Local First Notes App/05-atomic-notes-layers.png and b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L1 What Is a Local First Notes App/05-atomic-notes-layers.png differ diff --git a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L1 What Is a Local First Notes App/what-is-a-local-first-notes-app.md b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L1 What Is a Local First Notes App/what-is-a-local-first-notes-app.md index 219ac6a..9c3e19e 100644 --- a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L1 What Is a Local First Notes App/what-is-a-local-first-notes-app.md +++ b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L1 What Is a Local First Notes App/what-is-a-local-first-notes-app.md @@ -109,7 +109,7 @@ Here's how Atomic Notes splits those jobs: 2. **A sync server coordinates, and keeps metadata only.** It tracks note IDs, timestamps, flags, and versions so your devices agree. It never stores your note titles or text. 3. **Your own Google Drive holds the cloud copy.** Every note lands in a My-Atomic-Notes folder as its own `.atomic` file. The app uses Google's narrow `drive.file` scope, so it can only see files it created. -![A phone showing the Atomic Notes storage report, beside three cards: your phone holds the real copy, the sync server keeps metadata only, and your Google Drive holds one file per note. An optional vault keeps cloud copies as ciphertext.](05-atomic-notes-layers.png "Fig 4. Atomic Notes: phone first, Google Drive second, a metadata-only server in between.") +![A phone showing the Atomic Notes Cloud Notes screen, beside three cards: your phone holds the real copy, the sync server keeps metadata only, and your Google Drive holds one file per note. An optional vault keeps cloud copies as ciphertext.](05-atomic-notes-layers.png "Fig 4. Atomic Notes: phone first, Google Drive second, a metadata-only server in between.") One honest detail. Unless you turn on the optional vault, note text is plain JSON in your Drive and passes through the sync server on its way there, without being stored. Turn the vault on and your phone encrypts every note with AES-256-GCM before upload, so the server and Google only ever hold ciphertext. diff --git a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L4 Best Offline Notes Apps Android/06-atomic-notes-card.png b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L4 Best Offline Notes Apps Android/06-atomic-notes-card.png index 2b2c9a0..8a66d62 100644 Binary files a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L4 Best Offline Notes Apps Android/06-atomic-notes-card.png and b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L4 Best Offline Notes Apps Android/06-atomic-notes-card.png differ diff --git a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L4 Best Offline Notes Apps Android/best-offline-notes-apps-android.md b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L4 Best Offline Notes Apps Android/best-offline-notes-apps-android.md index d76451b..97e535c 100644 --- a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L4 Best Offline Notes Apps Android/best-offline-notes-apps-android.md +++ b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/02 Local First/L4 Best Offline Notes Apps Android/best-offline-notes-apps-android.md @@ -70,7 +70,7 @@ To find the best offline notes app Android owners will actually keep, every entr - **Latest:** 2.03.5, September 28, 2026 - **Weak spot:** the first sign-in needs internet, the free plan holds 30 notes, and there's no export button yet -![The Atomic Notes notes database screen on a phone showing 8 notes on device and 8 in cloud, beside a fact card about offline saving, sync later, conflict copies, and honest limits.](06-atomic-notes-card.png "Fig 3. Atomic Notes, disclosed: it's my app, and the offline behavior is in its public code.") +![The Atomic Notes Cloud Notes screen on a phone showing 23 notes on the device and 23 in the cloud, beside a fact card about offline saving, sync later, conflict copies, and honest limits.](06-atomic-notes-card.png "Fig 3. Atomic Notes, disclosed: it's my app, and the offline behavior is in its public code.") When the network comes back, Atomic Notes retries a failed sync after 5, 15, and 45 seconds, then waits for the next trigger instead of draining the battery. If an offline edit collides with one from another device, the app keeps both and names one "(conflict copy)". That's why it's my pick for the best offline notes app Android users can run on two phones. diff --git a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/03 Security/S3 Storing Passwords in Notes App/06-atomic-notes-card.png b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/03 Security/S3 Storing Passwords in Notes App/06-atomic-notes-card.png index 73b0132..8051421 100644 Binary files a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/03 Security/S3 Storing Passwords in Notes App/06-atomic-notes-card.png and b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/03 Security/S3 Storing Passwords in Notes App/06-atomic-notes-card.png differ diff --git a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/03 Security/S4 Encryption and Privacy Gaps/06-atomic-answers.png b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/03 Security/S4 Encryption and Privacy Gaps/06-atomic-answers.png index d19c7a7..674f357 100644 Binary files a/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/03 Security/S4 Encryption and Privacy Gaps/06-atomic-answers.png and b/Atomic-Blog-Generation-Pipeline/Output/Main Blogs/03 Security/S4 Encryption and Privacy Gaps/06-atomic-answers.png differ diff --git a/Atomic-Blog-Generation-Pipeline/visuals/atomic_viz.py b/Atomic-Blog-Generation-Pipeline/visuals/atomic_viz.py index d03e88d..99c4635 100644 --- a/Atomic-Blog-Generation-Pipeline/visuals/atomic_viz.py +++ b/Atomic-Blog-Generation-Pipeline/visuals/atomic_viz.py @@ -28,7 +28,9 @@ def file_url(path): def mockup(n): - return file_url(os.path.join(PUBLIC, "mockups", f"atomic-notes-mockup-image-{n:02d}.png")) + """An app screen from public/mockups: a name like "encryption" (release 2.03.5) or a legacy number.""" + name = f"app-{n}.png" if isinstance(n, str) else f"atomic-notes-mockup-image-{n:02d}.png" + return file_url(os.path.join(PUBLIC, "mockups", name)) ATOM = file_url(os.path.join(PUBLIC, "icons", "atom.svg")) diff --git a/Atomic-Blog-Generation-Pipeline/visuals/posts/best_offline_notes_apps_android.py b/Atomic-Blog-Generation-Pipeline/visuals/posts/best_offline_notes_apps_android.py index 5808260..5270da8 100644 --- a/Atomic-Blog-Generation-Pipeline/visuals/posts/best_offline_notes_apps_android.py +++ b/Atomic-Blog-Generation-Pipeline/visuals/posts/best_offline_notes_apps_android.py @@ -70,7 +70,7 @@ def group(x, lbl, title, apps, note, cls): out["05-backup-plan"] = figure("FIG 4 · BACKUPS", 'THE PHONE MAY HOLD THE ONLY COPY', body, "Ten minutes a month. Apps with sync cover a lost phone, not a deleted note.", lines=lines, h=680) - body = phone(7, 64, 190, 260, crop=470, shadow="ink") + body = phone("cloud-notes", 64, 190, 260, crop=470, shadow="ink") facts = [("OFFLINE", "Write, edit, search, delete. No connection needed"), ("SAVES", "To the phone as you type"), ("SYNC LATER", "To your own Google Drive, on its own"), ("RETRIES", "After 5, 15, and 45 seconds, then waits"), ("CONFLICTS", "Both versions kept, one marked conflict copy"), ("HONEST LIMITS", "Sign-in needs internet once. 30 free notes")] diff --git a/Atomic-Blog-Generation-Pipeline/visuals/posts/best_privacy_first_notes_apps_android.py b/Atomic-Blog-Generation-Pipeline/visuals/posts/best_privacy_first_notes_apps_android.py index d22f57d..3e0392d 100644 --- a/Atomic-Blog-Generation-Pipeline/visuals/posts/best_privacy_first_notes_apps_android.py +++ b/Atomic-Blog-Generation-Pipeline/visuals/posts/best_privacy_first_notes_apps_android.py @@ -71,7 +71,7 @@ def build(): out["05-permissions"] = figure("FIG 4 · PERMISSIONS", 'WHO CAN EVEN REACH THE INTERNET?', body, "From each app's AndroidManifest.xml or F-Droid listing. No internet permission means notes can't leave by the app itself.", h=790) - body = phone(12, 64, 190, 260, crop=470, shadow="ink") + body = phone("encryption", 64, 190, 260, crop=470, shadow="ink") facts = [("WHERE NOTES LIVE", "Your phone first, then your own Google Drive"), ("ENCRYPTION", "Optional end-to-end vault, off by default"), ("SERVER", "Metadata only, never note titles or text"), ("NO", "Ads, trackers, or AI"), ("PRICE", "Free, 30 notes, daily sync energy"), ("HONEST LIMITS", "Google sign-in required. No export button yet")] diff --git a/Atomic-Blog-Generation-Pipeline/visuals/posts/encrypted_notes_privacy.py b/Atomic-Blog-Generation-Pipeline/visuals/posts/encrypted_notes_privacy.py index d70803d..ae17d28 100644 --- a/Atomic-Blog-Generation-Pipeline/visuals/posts/encrypted_notes_privacy.py +++ b/Atomic-Blog-Generation-Pipeline/visuals/posts/encrypted_notes_privacy.py @@ -59,7 +59,7 @@ def build(): out["05-five-questions"] = figure("FIG 4 · THE CHECK", 'FIVE QUESTIONS FOR ANY APP', body, "Vague answers usually mean the gap is real.", h=700) - body = phone(12, 64, 190, 260, crop=470, shadow="ink") + body = phone("encryption", 64, 190, 260, crop=470, shadow="ink") facts = [("WHERE", "HTTPS always. On the phone too, with the vault"), ("WHOSE KEY", "Vault: yours, from six words"), ("VISIBLE", "IDs, type, flags, times, rough size"), ("ALSO SENT", "Nothing. No analytics or trackers"), ("RECOVERY", "Your phrase only. No reset path"), ("HONEST LIMITS", "Vault off by default. No audit yet")] diff --git a/Atomic-Blog-Generation-Pipeline/visuals/posts/notes_app_privacy_mistakes.py b/Atomic-Blog-Generation-Pipeline/visuals/posts/notes_app_privacy_mistakes.py index 0471b8e..1b75fa6 100644 --- a/Atomic-Blog-Generation-Pipeline/visuals/posts/notes_app_privacy_mistakes.py +++ b/Atomic-Blog-Generation-Pipeline/visuals/posts/notes_app_privacy_mistakes.py @@ -68,7 +68,7 @@ def build(): routine = [("LOCKS", "Screen lock, app lock, and no-screenshots still on"), ("SHARES", "Revoke links you no longer need"), ("EXPORTS", "Delete or encrypt stray copies"), ("ACCOUNT", "Unique password and two-step verification"), ("UPDATES", "Read release notes for new sharing or AI features")] - body = phone(9, 64, 190, 260, crop=470, shadow="ink") + body = phone("security", 64, 190, 260, crop=470, shadow="ink") rws = "".join(f'
' f'{i + 1:02d}{a}{b}
' for i, (a, b) in enumerate(routine)) diff --git a/Atomic-Blog-Generation-Pipeline/visuals/posts/storing_passwords_in_notes_app.py b/Atomic-Blog-Generation-Pipeline/visuals/posts/storing_passwords_in_notes_app.py index 87f125d..26a46fc 100644 --- a/Atomic-Blog-Generation-Pipeline/visuals/posts/storing_passwords_in_notes_app.py +++ b/Atomic-Blog-Generation-Pipeline/visuals/posts/storing_passwords_in_notes_app.py @@ -56,7 +56,7 @@ def build(): out["05-move-out"] = figure("FIG 4 · MOVING OUT", 'TWENTY MINUTES, IN THIS ORDER', body, "Highest blast radius first. A deleted note often stays in the trash for 30 days.", h=620) - body = phone(12, 64, 190, 260, crop=470, shadow="ink") + body = phone("encryption", 64, 190, 260, crop=470, shadow="ink") facts = [("GOOD FOR", "Journals, health notes, plans, drafts"), ("PROTECTION", "App lock and an optional end-to-end vault"), ("NO AUTOFILL", "Can't stop you pasting into a fake site"), ("NO BREACH ALERTS", "Won't tell you a password leaked"), ("NO GENERATOR", "Can't create unique passwords"), ("VERDICT", "Not a password manager. Use one.")] diff --git a/Atomic-Blog-Generation-Pipeline/visuals/posts/what_is_a_local_first_notes_app.py b/Atomic-Blog-Generation-Pipeline/visuals/posts/what_is_a_local_first_notes_app.py index a006678..58894bc 100644 --- a/Atomic-Blog-Generation-Pipeline/visuals/posts/what_is_a_local_first_notes_app.py +++ b/Atomic-Blog-Generation-Pipeline/visuals/posts/what_is_a_local_first_notes_app.py @@ -85,7 +85,7 @@ def lane(y, label, steps, note, sig): "Source: \"Local-first software\", Ink & Switch, 2019.", h=740) # How Atomic Notes applies it. - body = phone(7, 64, 196, 250, crop=470, shadow="ink") + body = phone("cloud-notes", 64, 196, 250, crop=470, shadow="ink") body += box(390, 190, 360, 196, '
1 · YOUR PHONE
THE REAL COPY
Hive storage on the device. Every note saves as you type, online or not.
', cls="sigshadow") diff --git a/content/blog/best-offline-notes-apps-android.md b/content/blog/best-offline-notes-apps-android.md index 7904edc..afaf371 100644 --- a/content/blog/best-offline-notes-apps-android.md +++ b/content/blog/best-offline-notes-apps-android.md @@ -70,7 +70,7 @@ To find the best offline notes app Android owners will actually keep, every entr - **Latest:** 2.03.5, September 28, 2026 - **Weak spot:** the first sign-in needs internet, the free plan holds 30 notes, and there's no export button yet -![The Atomic Notes notes database screen on a phone showing 8 notes on device and 8 in cloud, beside a fact card about offline saving, sync later, conflict copies, and honest limits.](/blog/best-offline-notes-apps-android/06-atomic-notes-card.png "Fig 3. Atomic Notes, disclosed: it's my app, and the offline behavior is in its public code.") +![The Atomic Notes Cloud Notes screen on a phone showing 23 notes on the device and 23 in the cloud, beside a fact card about offline saving, sync later, conflict copies, and honest limits.](/blog/best-offline-notes-apps-android/06-atomic-notes-card.png "Fig 3. Atomic Notes, disclosed: it's my app, and the offline behavior is in its public code.") When the network comes back, Atomic Notes retries a failed sync after 5, 15, and 45 seconds, then waits for the next trigger instead of draining the battery. If an offline edit collides with one from another device, the app keeps both and names one "(conflict copy)". That's why it's my pick for the best offline notes app Android users can run on two phones. diff --git a/content/blog/what-is-a-local-first-notes-app.md b/content/blog/what-is-a-local-first-notes-app.md index 6635a0f..4b78788 100644 --- a/content/blog/what-is-a-local-first-notes-app.md +++ b/content/blog/what-is-a-local-first-notes-app.md @@ -109,7 +109,7 @@ Here's how Atomic Notes splits those jobs: 2. **A sync server coordinates, and keeps metadata only.** It tracks note IDs, timestamps, flags, and versions so your devices agree. It never stores your note titles or text. 3. **Your own Google Drive holds the cloud copy.** Every note lands in a My-Atomic-Notes folder as its own `.atomic` file. The app uses Google's narrow `drive.file` scope, so it can only see files it created. -![A phone showing the Atomic Notes storage report, beside three cards: your phone holds the real copy, the sync server keeps metadata only, and your Google Drive holds one file per note. An optional vault keeps cloud copies as ciphertext.](/blog/what-is-a-local-first-notes-app/05-atomic-notes-layers.png "Fig 4. Atomic Notes: phone first, Google Drive second, a metadata-only server in between.") +![A phone showing the Atomic Notes Cloud Notes screen, beside three cards: your phone holds the real copy, the sync server keeps metadata only, and your Google Drive holds one file per note. An optional vault keeps cloud copies as ciphertext.](/blog/what-is-a-local-first-notes-app/05-atomic-notes-layers.png "Fig 4. Atomic Notes: phone first, Google Drive second, a metadata-only server in between.") One honest detail. Unless you turn on the optional vault, note text is plain JSON in your Drive and passes through the sync server on its way there, without being stored. Turn the vault on and your phone encrypts every note with AES-256-GCM before upload, so the server and Google only ever hold ciphertext. diff --git a/public/blog/best-offline-notes-apps-android/06-atomic-notes-card.png b/public/blog/best-offline-notes-apps-android/06-atomic-notes-card.png index 2b2c9a0..8a66d62 100644 Binary files a/public/blog/best-offline-notes-apps-android/06-atomic-notes-card.png and b/public/blog/best-offline-notes-apps-android/06-atomic-notes-card.png differ diff --git a/public/blog/best-privacy-first-notes-apps-android/06-atomic-notes-card.png b/public/blog/best-privacy-first-notes-apps-android/06-atomic-notes-card.png index 73a2dfc..2f71a7f 100644 Binary files a/public/blog/best-privacy-first-notes-apps-android/06-atomic-notes-card.png and b/public/blog/best-privacy-first-notes-apps-android/06-atomic-notes-card.png differ diff --git a/public/blog/encrypted-notes-privacy/06-atomic-answers.png b/public/blog/encrypted-notes-privacy/06-atomic-answers.png index d19c7a7..674f357 100644 Binary files a/public/blog/encrypted-notes-privacy/06-atomic-answers.png and b/public/blog/encrypted-notes-privacy/06-atomic-answers.png differ diff --git a/public/blog/notes-app-privacy-mistakes/06-routine.png b/public/blog/notes-app-privacy-mistakes/06-routine.png index 9326437..be96eb0 100644 Binary files a/public/blog/notes-app-privacy-mistakes/06-routine.png and b/public/blog/notes-app-privacy-mistakes/06-routine.png differ diff --git a/public/blog/storing-passwords-in-notes-app/06-atomic-notes-card.png b/public/blog/storing-passwords-in-notes-app/06-atomic-notes-card.png index 73b0132..8051421 100644 Binary files a/public/blog/storing-passwords-in-notes-app/06-atomic-notes-card.png and b/public/blog/storing-passwords-in-notes-app/06-atomic-notes-card.png differ diff --git a/public/blog/what-is-a-local-first-notes-app/05-atomic-notes-layers.png b/public/blog/what-is-a-local-first-notes-app/05-atomic-notes-layers.png index e1e149a..f7ab69e 100644 Binary files a/public/blog/what-is-a-local-first-notes-app/05-atomic-notes-layers.png and b/public/blog/what-is-a-local-first-notes-app/05-atomic-notes-layers.png differ diff --git a/public/mockups/app-atomic-energy.png b/public/mockups/app-atomic-energy.png new file mode 100644 index 0000000..b0b0e22 Binary files /dev/null and b/public/mockups/app-atomic-energy.png differ diff --git a/public/mockups/app-avatar-picker.png b/public/mockups/app-avatar-picker.png new file mode 100644 index 0000000..dac4a32 Binary files /dev/null and b/public/mockups/app-avatar-picker.png differ diff --git a/public/mockups/app-cloud-notes.png b/public/mockups/app-cloud-notes.png new file mode 100644 index 0000000..f41048f Binary files /dev/null and b/public/mockups/app-cloud-notes.png differ diff --git a/public/mockups/app-cloud-sync.png b/public/mockups/app-cloud-sync.png new file mode 100644 index 0000000..55ae372 Binary files /dev/null and b/public/mockups/app-cloud-sync.png differ diff --git a/public/mockups/app-danger-zone.png b/public/mockups/app-danger-zone.png new file mode 100644 index 0000000..cae09d5 Binary files /dev/null and b/public/mockups/app-danger-zone.png differ diff --git a/public/mockups/app-encryption.png b/public/mockups/app-encryption.png new file mode 100644 index 0000000..a3050e0 Binary files /dev/null and b/public/mockups/app-encryption.png differ diff --git a/public/mockups/app-energy-activity.png b/public/mockups/app-energy-activity.png new file mode 100644 index 0000000..c99f4ba Binary files /dev/null and b/public/mockups/app-energy-activity.png differ diff --git a/public/mockups/app-profile.png b/public/mockups/app-profile.png new file mode 100644 index 0000000..e412c5f Binary files /dev/null and b/public/mockups/app-profile.png differ diff --git a/public/mockups/app-security.png b/public/mockups/app-security.png new file mode 100644 index 0000000..f194492 Binary files /dev/null and b/public/mockups/app-security.png differ diff --git a/public/mockups/app-settings-about.png b/public/mockups/app-settings-about.png new file mode 100644 index 0000000..34a443e Binary files /dev/null and b/public/mockups/app-settings-about.png differ diff --git a/public/mockups/app-settings-energy-popup.png b/public/mockups/app-settings-energy-popup.png new file mode 100644 index 0000000..b389a84 Binary files /dev/null and b/public/mockups/app-settings-energy-popup.png differ diff --git a/public/mockups/app-settings.png b/public/mockups/app-settings.png new file mode 100644 index 0000000..73b229a Binary files /dev/null and b/public/mockups/app-settings.png differ diff --git a/public/mockups/atomic-notes-mockup-image-01.png b/public/mockups/atomic-notes-mockup-image-01.png deleted file mode 100644 index a204f5e..0000000 Binary files a/public/mockups/atomic-notes-mockup-image-01.png and /dev/null differ diff --git a/public/mockups/atomic-notes-mockup-image-02.png b/public/mockups/atomic-notes-mockup-image-02.png deleted file mode 100644 index e5c81b2..0000000 Binary files a/public/mockups/atomic-notes-mockup-image-02.png and /dev/null differ diff --git a/public/mockups/atomic-notes-mockup-image-07.png b/public/mockups/atomic-notes-mockup-image-07.png deleted file mode 100644 index 5d7a6f7..0000000 Binary files a/public/mockups/atomic-notes-mockup-image-07.png and /dev/null differ diff --git a/public/mockups/atomic-notes-mockup-image-08.png b/public/mockups/atomic-notes-mockup-image-08.png deleted file mode 100644 index cb0032e..0000000 Binary files a/public/mockups/atomic-notes-mockup-image-08.png and /dev/null differ diff --git a/public/mockups/atomic-notes-mockup-image-09.png b/public/mockups/atomic-notes-mockup-image-09.png deleted file mode 100644 index 1f60d55..0000000 Binary files a/public/mockups/atomic-notes-mockup-image-09.png and /dev/null differ diff --git a/public/mockups/atomic-notes-mockup-image-10.png b/public/mockups/atomic-notes-mockup-image-10.png deleted file mode 100644 index 30e4acb..0000000 Binary files a/public/mockups/atomic-notes-mockup-image-10.png and /dev/null differ diff --git a/public/mockups/atomic-notes-mockup-image-11.png b/public/mockups/atomic-notes-mockup-image-11.png deleted file mode 100644 index abbe03a..0000000 Binary files a/public/mockups/atomic-notes-mockup-image-11.png and /dev/null differ diff --git a/public/mockups/atomic-notes-mockup-image-12.png b/public/mockups/atomic-notes-mockup-image-12.png deleted file mode 100644 index 818da4f..0000000 Binary files a/public/mockups/atomic-notes-mockup-image-12.png and /dev/null differ diff --git a/public/mockups/atomic-notes-mockup-image-13.png b/public/mockups/atomic-notes-mockup-image-13.png deleted file mode 100644 index f6ef5d2..0000000 Binary files a/public/mockups/atomic-notes-mockup-image-13.png and /dev/null differ diff --git a/public/mockups/atomic-notes-mockup-image-14.png b/public/mockups/atomic-notes-mockup-image-14.png deleted file mode 100644 index a0f929f..0000000 Binary files a/public/mockups/atomic-notes-mockup-image-14.png and /dev/null differ diff --git a/public/mockups/atomic-notes-mockup-image-16.png b/public/mockups/atomic-notes-mockup-image-16.png deleted file mode 100644 index 8fe0c91..0000000 Binary files a/public/mockups/atomic-notes-mockup-image-16.png and /dev/null differ diff --git a/public/mockups/atomic-notes-mockup-image-19.png b/public/mockups/atomic-notes-mockup-image-19.png deleted file mode 100644 index 1fcda98..0000000 Binary files a/public/mockups/atomic-notes-mockup-image-19.png and /dev/null differ diff --git a/public/video/atomic-notes-demo-1280x720.mp4 b/public/video/atomic-notes-demo-1280x720.mp4 new file mode 100644 index 0000000..560c304 Binary files /dev/null and b/public/video/atomic-notes-demo-1280x720.mp4 differ diff --git a/public/video/atomic-notes-demo-720x1280.mp4 b/public/video/atomic-notes-demo-720x1280.mp4 new file mode 100644 index 0000000..2c05fc8 Binary files /dev/null and b/public/video/atomic-notes-demo-720x1280.mp4 differ diff --git a/public/video/atomic-notes-demo-poster-1280x720.jpg b/public/video/atomic-notes-demo-poster-1280x720.jpg new file mode 100644 index 0000000..e75d29d Binary files /dev/null and b/public/video/atomic-notes-demo-poster-1280x720.jpg differ diff --git a/public/video/atomic-notes-demo-poster-720x1280.jpg b/public/video/atomic-notes-demo-poster-720x1280.jpg new file mode 100644 index 0000000..de7bf38 Binary files /dev/null and b/public/video/atomic-notes-demo-poster-720x1280.jpg differ diff --git a/src/app/globals.css b/src/app/globals.css index d6c6773..525913c 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -393,6 +393,10 @@ section h2 { .shot img { width: 100%; display: block; + /* Screens come from two builds with different heights. Show every card at the 2.03.5 shape, top-aligned. */ + aspect-ratio: 1080 / 2199; + object-fit: cover; + object-position: top; } .shot .cap { display: flex; @@ -3685,3 +3689,30 @@ section h2 { position: static; } } + +/* ---------- demo video ---------- */ +.lp-demo { + margin: 28px 0 34px; +} +.lp-demo video { + display: block; + width: 100%; + height: auto; + border: 2px solid var(--ink); + border-radius: 8px; + box-shadow: 8px 8px 0 var(--signal); + background: var(--ink); +} +.lp-demo-tall { + display: none !important; +} +@media (max-width: 640px) { + .lp-demo-wide { + display: none !important; + } + .lp-demo-tall { + display: block !important; + max-width: 360px; + margin: 0 auto; + } +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 300a032..928d6d3 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -24,25 +24,32 @@ import { APK_URL, DEVELOPER_URL, SITE_URL } from "@/lib/site"; export const dynamic = "force-dynamic"; +// Screens from earlier builds (notes, editors, coins, notifications) that have no 2.03.5 mockup yet. const M = (n: string) => `/mockups/atomic-notes-mockup-image-${n}.png`; +// Release 2.03.5 screens, cut from the iPhone 18 Pro mockups without the device frame (the app is Android-only). +const A = (name: string) => `/mockups/app-${name}.png`; +const A_H = 2199; -// The screen tour. Image 17 (a recovery phrase) is left out on purpose. +// The screen tour. The recovery phrase screen is left out on purpose. const SHOTS: Shot[] = [ { src: M("03"), label: "Notes" }, { src: M("05"), label: "Editor · Note" }, { src: M("04"), label: "Editor · Checklist" }, { src: M("06"), label: "Select & Delete" }, - { src: M("12"), label: "Encryption vault" }, - { src: M("14"), label: "Atomic Energy" }, + { src: A("settings"), label: "Settings" }, + { src: A("profile"), label: "Profile" }, + { src: A("avatar-picker"), label: "Choose an avatar" }, + { src: A("encryption"), label: "Encryption vault" }, + { src: A("security"), label: "Lock and no screenshots" }, + { src: A("atomic-energy"), label: "Atomic Energy" }, + { src: A("energy-activity"), label: "Energy activity" }, + { src: A("settings-energy-popup"), label: "Energy popup" }, { src: M("15"), label: "Convert Coins" }, - { src: M("13"), label: "Energy popup" }, + { src: A("cloud-sync"), label: "Cloud Sync" }, + { src: A("cloud-notes"), label: "Device and cloud" }, { src: M("18"), label: "Notifications" }, - { src: M("09"), label: "Biometric lock" }, - { src: M("08"), label: "Cloud Sync" }, - { src: M("07"), label: "Device and cloud" }, - { src: M("02"), label: "Settings" }, - { src: M("01"), label: "Profile" }, - { src: M("10"), label: "Danger Zone" }, + { src: A("danger-zone"), label: "Danger Zone" }, + { src: A("settings-about"), label: "About" }, ]; async function latestUpdates(): Promise { @@ -74,7 +81,7 @@ function jsonLd() { isAccessibleForFree: true, offers: { "@type": "Offer", price: "0", priceCurrency: "USD" }, image: `${SITE_URL}/og-banner.png`, - screenshot: [`${SITE_URL}${M("03")}`, `${SITE_URL}${M("12")}`, `${SITE_URL}${M("14")}`], + screenshot: [`${SITE_URL}${M("03")}`, `${SITE_URL}${A("encryption")}`, `${SITE_URL}${A("atomic-energy")}`], featureList: [ "Local-first notes and checklists that work offline", "Sync to a folder in your own Google Drive", @@ -268,9 +275,9 @@ export default async function Home() { @@ -449,8 +456,13 @@ export default async function Home() {

- - + +
@@ -618,7 +630,37 @@ export default async function Home() {

The Technical Editorial design system: ink #15171B on paper #F4F5F1 with one accent, Signal #3A2FF0. - Tap any screen to zoom. Some screens are from the August 2026 build. + Tap any screen to zoom. Settings, vault, energy, sync, and Danger Zone screens are from release 2.03.5. + The notes, editor, coin, and notification screens are from the August 2026 build. +

+ + + + +

+ A 30-second tour in a phone mockup. The home and editor screens in it preview the redesign in progress, + with search, tags, and text formatting that aren't in release 2.03.5 yet. Everything else matches + the current app.

diff --git a/src/components/Phone.tsx b/src/components/Phone.tsx index ed64f32..ef98ddf 100644 --- a/src/components/Phone.tsx +++ b/src/components/Phone.tsx @@ -5,17 +5,20 @@ export function Phone({ shadow = "signal", className = "", eager = false, + height = 2460, }: { src: string; alt: string; shadow?: "signal" | "ink"; className?: string; eager?: boolean; + /** Pixel height of the screenshot at 1080 px wide. Release 2.03.5 screens are 2199. */ + height?: number; }) { return (
{/* eslint-disable-next-line @next/next/no-img-element */} - {alt} + {alt}
); }