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
3 changes: 2 additions & 1 deletion public/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Key facts:

- Storage: on-device first (Hive). Sync writes one .atomic file per note to the user's Google Drive, using the drive.file scope (the app sees only files it created).
- Server: stores metadata only (note ids, pinned and deleted flags, timestamps, Drive file ids). It never stores note titles or text. With the vault off, note text passes through it in transit to Drive.
- Price: free. Every account holds 30 notes. Cloud sync uses Atomic Energy: +20 every 24 hours, cap 120, standard sync 5 (at most once an hour), instant sync 10, syncs with nothing to upload are free. 1 Atomic Coin = 40 energy. New accounts get 5 coins. Coin purchases are not available yet.
- Price: free. Every account holds 30 notes. Cloud sync uses Atomic Energy: +20 every 24 hours, cap 120, standard sync 5 (at most once an hour), instant sync 10, syncs with nothing to upload are free. 1 Atomic Coin = 40 energy. New accounts get 5 coins. Coins are not sold in the app yet. Early supporters on Patreon (https://www.patreon.com/cw/DevBehindYou) who send their account email get Atomic Coins from the developer by hand.
- Capacity tiers: Tachyon 30 notes (free), Antimatter 40 (10 coins), Monopole 50 (20 coins), Strangelet 100 (30 coins).
- Device security: biometric lock, TOTP two-step verification, blocked screenshots (FLAG_SECURE), Android secure storage.
- Distribution: signed APKs on GitHub Releases. Certificate SHA-256 cc24ae5ce1dca50fcd5e5c4c252d69e4965c55a975bd0e4739e8938fad9bebeb. Not on Google Play. No iOS build yet.
Expand All @@ -16,6 +16,7 @@ Key facts:
- [Home](https://atomic-notes-community.vercel.app/): features, how sync works, what each party can see, Atomic Energy, FAQ
- [Updates](https://atomic-notes-community.vercel.app/updates): live release notes and service status
- [Blog](https://atomic-notes-community.vercel.app/blog): development updates and technical write-ups
- [Support](https://atomic-notes-community.vercel.app/support-atomic-notes): support on Patreon and get Atomic Coins early

## Source and downloads

Expand Down
10 changes: 9 additions & 1 deletion src/app/controller/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,14 @@ function NewNotification({
setTargetEmail("");
setPinned(false);
const size = typeof d.audience_size === "number" ? d.audience_size : null;
onMsg(size === null ? "Notification published." : `Notification published to ${size} ${size === 1 ? "user" : "users"}.`);
const forNewAccounts = !targetEmail.trim() && audience === "new";
onMsg(
forNewAccounts
? "Notification published. Every account created from now on will see it."
: size === null
? "Notification published."
: `Notification published to ${size} ${size === 1 ? "user" : "users"}.`
);
onCreated();
} catch (e) {
onMsg(e instanceof Error ? e.message : "Failed to create.");
Expand Down Expand Up @@ -470,6 +477,7 @@ function NewNotification({
<option value="all">Everyone</option>
<option value="active">Active — opened in 7 days</option>
<option value="inactive">Inactive — not in 7 days</option>
<option value="new">New accounts — created from now on</option>
</select>
</label>
<label>
Expand Down
57 changes: 56 additions & 1 deletion src/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -1658,7 +1658,7 @@ section h2 {
.steps li:first-child {
border-top: none;
}
.steps li::after {
.steps li:not(:last-child)::after {
display: none;
}
.lp-showcase-phones {
Expand Down Expand Up @@ -1701,3 +1701,58 @@ section h2 {
transition: none;
}
}

/* ---------- support page ---------- */
.support-hero > * {
max-width: 820px;
}
.support-title {
font-size: clamp(2.8rem, 7vw, 5rem);
letter-spacing: 0.5px;
}
.support-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 24px;
margin-top: 36px;
align-items: start;
}
.support-note {
background: var(--signal);
color: #fff;
border: 2px solid var(--ink);
border-radius: 6px;
padding: 22px;
box-shadow: 6px 6px 0 var(--ink);
}
.support-note .num {
color: #d8d6ff;
}
.support-note h3 {
font-size: 1.8rem;
margin-top: 8px;
}
.support-note p:not(.num) {
margin: 10px 0 0;
line-height: 1.6;
}
.support-list {
margin: 12px 0 0;
padding-left: 18px;
display: grid;
gap: 8px;
line-height: 1.55;
color: #2b2e34;
}
.support-facts {
margin: 22px 0 26px;
max-width: 640px;
}
.lp-small a {
color: var(--signal);
}
@media (max-width: 820px) {
.support-grid {
grid-template-columns: 1fr;
}
}
3 changes: 2 additions & 1 deletion src/app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,8 @@ export default async function Home() {
</dl>
<p className="lp-small">
New accounts get 5 Atomic Coins. If a sync fails and no note gets through, its energy is refunded.
Coins can&apos;t be bought in the app yet.
Coins can&apos;t be bought in the app yet, but early supporters get them:{" "}
<Link href="/support-atomic-notes">support on Patreon</Link>.
</p>
</Reveal>
</div>
Expand Down
1 change: 1 addition & 0 deletions src/app/sitemap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export default function sitemap(): MetadataRoute.Sitemap {
{ url: BASE, changeFrequency: "weekly", priority: 1 },
{ url: `${BASE}/blog`, changeFrequency: "weekly", priority: 0.8 },
{ url: `${BASE}/updates`, changeFrequency: "daily", priority: 0.6 },
{ url: `${BASE}/support-atomic-notes`, changeFrequency: "monthly", priority: 0.5 },
...posts,
];
}
148 changes: 148 additions & 0 deletions src/app/support-atomic-notes/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
import type { Metadata } from "next";
import { SiteNav } from "@/components/SiteNav";
import { SiteFooter } from "@/components/SiteFooter";
import { PATREON_URL } from "@/lib/content";

export const metadata: Metadata = {
title: "Support Atomic Notes, get Atomic Coins early",
description:
"Support Atomic Notes on Patreon at the amount you choose. Send your Atomic Notes account email, and the developer sends you Atomic Coins as an early-supporter reward.",
alternates: { canonical: "/support-atomic-notes" },
};

const STEPS: { t: string; d: React.ReactNode }[] = [
{
t: "Find your email",
d: (
<>
It&apos;s the Google email you sign in to Atomic Notes with. In the app, open <b>Atomic Energy</b> and tap{" "}
<b>Get Atomic Coins</b> to see it.
</>
),
},
{
t: "Support on Patreon",
d: <>Open the DevBehindYou page on Patreon and support the project at the amount you choose.</>,
},
{
t: "Send your email",
d: (
<>
Send the developer a Patreon message with your Atomic Notes account email. Check it letter by letter: the coins
go to exactly that account.
</>
),
},
{
t: "Get your coins",
d: (
<>
The developer adds your early-supporter Atomic Coins to that account by hand. They show up in Atomic Energy
after the next refresh.
</>
),
},
];

export default function SupportPage() {
return (
<>
<SiteNav current="support" />
<main>
<section className="hero lp-hero dotgrid">
<div className="wrap support-hero">
<p className="eyebrow">SUPPORT ATOMIC NOTES</p>
<h1 className="support-title">
Support the build. <span className="sig">Get coins early.</span>
</h1>
<p className="lp-lead">
Atomic Notes is built by one developer, with no ads and no trackers. Coins aren&apos;t sold in the app
yet. Support the project on Patreon, and the developer sends Atomic Coins to your account as an
early-supporter reward.
</p>
<div className="hero-actions">
<a href={PATREON_URL} className="btn-signal" target="_blank" rel="noreferrer">
Support on Patreon
</a>
<a href="#how" className="btn-ghost">
How it works
</a>
</div>
</div>
</section>

<section id="how">
<div className="wrap">
<p className="eyebrow">FOUR STEPS</p>
<h2>
How the reward <span className="sig">reaches you.</span>
</h2>
<ol className="steps">
{STEPS.map((s, i) => (
<li key={s.t}>
<span className="num">{String(i + 1).padStart(2, "0")}</span>
<h3>{s.t}</h3>
<p>{s.d}</p>
</li>
))}
</ol>

<div className="support-grid">
<div className="support-note">
<p className="num">IMPORTANT</p>
<h3>Use the exact account email</h3>
<p>
The reward is sent to the email you write, not to your Patreon name. A wrong or misspelled email means
the coins can&apos;t reach you. If you signed in with more than one Google account, use the one that
holds your notes.
</p>
</div>
<div className="feature">
<p className="num">GOOD TO KNOW</p>
<ul className="support-list">
<li>Patreon handles the payment. Atomic Notes never sees your card or bank details.</li>
<li>Patreon support is usually a monthly membership. You can cancel on Patreon at any time.</li>
<li>The developer sends rewards by hand, so they can take a little time to arrive.</li>
<li>Writing notes stays free. Coins only buy sync energy and room for more notes.</li>
</ul>
</div>
</div>
</div>
</section>

<section>
<div className="wrap">
<p className="eyebrow">WHAT COINS DO</p>
<h2>
One coin, <span className="sig">40 energy.</span>
</h2>
<dl className="facts support-facts">
<div>
<dt>Convert</dt>
<dd>1 Atomic Coin adds 40 energy, enough for 8 automatic syncs</dd>
</div>
<div>
<dt>Antimatter</dt>
<dd>10 coins, room for 40 notes</dd>
</div>
<div>
<dt>Monopole</dt>
<dd>20 more coins, room for 50 notes</dd>
</div>
<div>
<dt>Strangelet</dt>
<dd>30 more coins, room for 100 notes</dd>
</div>
</dl>
<div className="hero-actions">
<a href={PATREON_URL} className="btn-signal" target="_blank" rel="noreferrer">
Support on Patreon
</a>
</div>
</div>
</section>
</main>
<SiteFooter />
</>
);
}
1 change: 1 addition & 0 deletions src/components/SiteFooter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export function SiteFooter() {
<a href="/#features">Features</a>
<a href="/#how-it-works">How it works</a>
<a href="/#faq">FAQ</a>
<Link href="/support-atomic-notes">Support on Patreon</Link>
</nav>
<nav aria-label="Project">
<p className="foot-head">Project</p>
Expand Down
5 changes: 4 additions & 1 deletion src/components/SiteNav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const LINKS = [
{ id: "faq", label: "FAQ" },
];

export function SiteNav({ current }: { current?: "blog" | "updates" }) {
export function SiteNav({ current }: { current?: "blog" | "updates" | "support" }) {
const [active, setActive] = useState("");
const [open, setOpen] = useState(false);

Expand Down Expand Up @@ -52,6 +52,9 @@ export function SiteNav({ current }: { current?: "blog" | "updates" }) {
<Link href="/updates" className={current === "updates" ? "active" : ""}>
Updates
</Link>
<Link href="/support-atomic-notes" className={current === "support" ? "active" : ""}>
Support
</Link>
<a href={APK_URL} className="btn-signal nav-cta">
Download
</a>
Expand Down
3 changes: 3 additions & 0 deletions src/lib/content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ export const RELEASE = {

export const REPO_URL = "https://github.com/DevBehindYou/Atomic-Notes-App-V0.2";

/** Where supporters go. Early supporters get Atomic Coins by hand (see /support-atomic-notes). */
export const PATREON_URL = "https://www.patreon.com/cw/DevBehindYou";

/** The answer-first definition, used in the page and in structured data. */
export const DEFINITION =
"Atomic Notes is a free, source-available notes app for Android that keeps your notes on your phone first and syncs them to a private folder in your own Google Drive. It has no AI features, no ads and no analytics. An optional vault encrypts every note on the device with AES-256-GCM, so the sync server and Google only ever store ciphertext.";
Expand Down