Skip to content
Local-first · Flutter + Supabase · reviving 2026

ATOMIC NOTES

Notes that are actually yours.

A local-first notes app with optional, per-note cloud sync. No trackers, no ads, no AI. Your notes are never someone's training data. It was born from a real account breach, then rebuilt to keep it that way by design.

0trackers / ads / AI
50free notes, server-enforced
100%usable offline
Why it exists

It started with a
breach.

The developer used a mainstream notes app the way most people do. Ideas, mostly. Also a few account passwords and private notes he never should have typed there.

Then one ordinary day the emails started. "New sign-in from a location you don't usually use." One account, then another. What followed was a frantic afternoon of password resets, token revocations, and locked-out services.

The lesson

Stop using apps that take your data hostage and use it for their own profit.

So Atomic Notes became the app he wished he'd had. He shelved it three years ago, waiting on the tech to catch up. It has. Now it's revived: a new design system, a re-architected sync engine, and a privacy-first foundation.

The problem in 2026

Your notes became
training data.

The industry quietly changed the deal. "Free" now tends to mean your content is the product. It gets read, profiled, and more and more often fed into models as training data. Your notes are the most personal text you'll ever write. That's not a corpus you should have to donate.

  • Your words. Content used to "improve services" and train AI models.
  • Your behavior. Analytics and crash SDKs profiling how, when, and what you write.
  • Your context. Ad SDKs reading signals to target you.
  • Your location of record. Cloud-first by default, so their servers hold the master copy.
  • Nothing to train on. The app has no AI, so your notes are never used for training.
  • Zero telemetry. No analytics, no crash reporters, no third-party trackers shipped.
  • No ad SDKs in the app today.
  • Local-first. Your device holds the source copy, and the cloud stays opt-in and per-note.

This isn't a posture bolted on afterward. It's why the app is local-first, why there's no AI, and why the funding model sells convenience, never your content.

App interface · built with Flutter

Ink on paper.
One signal.

Real screens from the app. Tap any shot to enlarge.

Under the hood

Proof, not
promises.

The parts that matter, straight from the source. One repository as the single source of truth. A sync engine that never clobbers your unsynced edits. And limits enforced where they actually count.

01 · LOCAL-FIRST

Instant save

Every keystroke settles into on-device Hive storage. Launch never waits on the network, on full 5G or in airplane mode.

02 · SYNC

Per-note, merged

One row per note, realtime stream, tombstones for deletes, last-write-wins on a server-set timestamp.

03 · INTEGRITY

Server-authoritative

Row-Level Security + Postgres triggers. Quotas and timestamps can't be spoofed by a client.

// lib/main.dart : startup can time out, but it can never silently die.
await Supabase.initialize(url: cred.PROJECT_URL, publishableKey: cred.API_KEY)
    .timeout(const Duration(seconds: 15));
await Hive.initFlutter();
await NotesRepository.instance.init();   // loads the local copy first
// on failure: runApp(StartupFailedApp(error)). never exit(0)
// lib/database/notes_repository.dart : merge without clobbering unsynced work
if (local.dirty && local.updatedAt.isAfter(remote.updatedAt)) continue;
if (remote.updatedAt.isAfter(local.updatedAt)) {
  _notes[remote.id] = remote;              // remote is newer → take it
  unawaited(_box.put(remote.id, remote.toMap()));
}
-- supabase/migrations/002_per_note_realtime.sql
-- updated_at is server-authoritative: a bad client clock cannot win a conflict.
create trigger note_touch_updated_at
  before insert or update on public.note
  for each row execute function public.touch_updated_at();
-- supabase/migrations/003_note_limit.sql
-- The 50-note tier is a UI hint AND a database rule. curl can't add note #51.
if live >= allowance then
  raise exception 'note_limit_reached' using errcode = 'check_violation';
end if;
Encryption · in active development

Sealed on your device,
before it ever leaves.

The next release closes the one real gap. Note content gets encrypted on-device with AES-256-GCM, under a key derived from your credentials, so the server only ever stores ciphertext. Here's the design being built:

// DESIGN: client-side encryption shipping in the next release.
// Notes are sealed on-device. Only ciphertext + nonce are ever synced.
import 'package:cryptography/cryptography.dart';

final algorithm = AesGcm.with256bits();

Future<SecretBox> sealNote(String plaintext, SecretKey key) =>
    algorithm.encrypt(utf8.encode(plaintext), secretKey: key);

// key = Argon2id( passphrase, per-user salt ). Derived locally, never uploaded.
// server row stores only: { nonce, ciphertext, mac }. Unreadable server-side.

Try the concept, live

This runs entirely in your browser through the Web Crypto API, with a throwaway AES-256-GCM key. Type on the left. What the server would see shows up on the right. Your text never leaves this page.

Honest status: this is an illustration of the approach. Real AES-256-GCM, but with a random demo key. In the app, encryption is in active development for the next release. Note content today is protected by HTTPS and Row-Level Security, but it isn't end-to-end encrypted yet. See the reality check below.
Privacy & security · the honest version

Exactly where it
stands today.

An app built in reaction to a data breach doesn't get to overclaim security. So, precisely:

Protected today
  • In transit All backend traffic is over HTTPS / TLS.
  • Access control Supabase Row-Level Security. Every policy is auth.uid() = user_id, so only your account touches your rows.
  • No tracking Zero telemetry: no analytics, no crash reporters, no ad SDKs, no third-party trackers.
  • No AI Nothing sends your notes to a model. No content is used for training.
  • Device lock Optional biometric unlock gates the app locally.
Not protected yet
  • End-to-end encryption Note content sits as ordinary text in your row. Transport and access control protect it, but the operator could still read it. In active development for the next release.
  • Local at-rest On-device storage isn't encrypted at rest today.
  • Why say so Encoding and access control aren't cryptography, and this page won't pretend otherwise. Being exact now is the whole point.
Design system · "Technical Editorial"

Restraint as a
feature.

Condensed uppercase headings, hairline rules instead of shadows, and one accent color. The only "shadow" in the whole app is a solid 2px zero-blur offset that mimics offset print.

Ink
#15171B · type, borders
Paper
#F4F5F1 · the canvas
Signal
#3A2FF0 · the only accent
BEBAS NEUEDisplay · headings · uppercase
Hanken GroteskBody · narrative
JetBrains MonoMetadata · counts · status
Roadmap

Where it's going.

Nothing below is finished. This is intended direction, not current behavior.

In progress · next release

Client-side encryption

On-device AES-256-GCM under a credential-derived key. The prerequisite for opening the source.

Planned

Publish the source

Open the repository to public read access once encryption and hardening are integrated.

Planned

Distribution & developer verification

GitHub Releases first. An Amazon Appstore listing, strictly to satisfy AdMob's recognized-store requirement. Android Developer Verification, registered early.

Concept · not live

The Atomic Coin system

A gamified, opt-in rewarded-ad economy to fund cloud infrastructure without subscriptions.

Roadmap concept, not live: the planned Atomic Coin flow

The guarantee: a free periodic background sync stays free for everyone. Coins only ever buy speed. They never buy the guarantee that a note is saved, and never buy access to your data. Ad completions get verified server-side (SSV).

Later

Task & reminder notifications

Local notifications for checklists and reminders once the core is stable.

Explicitly not on the roadmap: AI features and paid subscriptions. Both got evaluated, then rejected. They push toward the exact data-hungry model Atomic Notes exists to avoid.
Get the app

Sideload it.
Keep control.

GitHub-first distribution. No Play Store gate, no account harvesting.

Android
Prebuilt APKs on the v1.12.1 release. Pick the file that matches your device (arm64-v8a fits most phones).
iOS
Planned. An unsigned iOS build already compiles in CI. Signed distribution needs an Apple Developer account.
Google Play
No Play Store listing is planned. The Play Console fee is a real barrier for a solo, no-budget project.
Amazon · F-Droid
An Amazon Appstore listing is planned strictly for future rewarded-ads eligibility. F-Droid may follow as a separate ad-free build flavor.
↓ Download v1.12.1 GitHub repo