Skip to content
DG

Shipping beats perfection.

Kathmandu, Nepal — Remote worldwide

Back to work
Web App Active

CipherOnce

Secrets that vanish. Security that stays.

CipherOnce — Secrets that vanish. Security that stays. — Web App cover, 1376×768 Peek demo — hover
Web
CipherOnce gallery 1 01
CipherOnce gallery 2 02
CipherOnce gallery 3 03

Role 06

01 Founder
02 Product Strategy
03 Full-Stack Development
04 Cryptography Implementation
05 UX Design
06 Security Architecture

End-to-end ownership — from strategy and design to code, testing and store release.

Platforms 01

Web Primary

Stack 06

Next.js (App Router) TypeScript Web Crypto API (AES-256-GCM) Supabase (Postgres, Auth, Edge Functions) Zero-Knowledge Architecture Content Security Policy & CSP Hardening

Production stack — type-safe, tested, shipped.

Highlights 12

Client-side AES-256-GCM encryption per secret (random 256-bit key)
Zero-knowledge: key in URL fragment, never sent or logged
Self-destruct on first view + time-based expiry (minutes to days)
Passwords, API keys, env files, confidential messages & files
No account required — encrypt, get link, share anywhere
One-time view guarantee + view-status feedback for sender
Open encryption docs — auditable flow, no black boxes
Edge Functions for creation, fetch and atomic destroy

+4 more in case study below.

CipherOnce is a zero-knowledge, end-to-end encrypted secret sharing platform for the most sensitive payloads: passwords, API keys, env files, credentials and confidential messages. It solves a quiet habit — pasting secrets into Slack, email or DMs where they live forever — with a link that self-destructs and a server that never sees plaintext. POINT: Sharing secrets shouldn't require trust in the messenger. EVIDENCE: Teams routinely paste API keys into Slack threads that are indexed, logged and retained for years; even 'secure' note tools often store plaintext server-side, making the provider a honeypot. MEANING: CipherOnce makes the secure path the easiest path: encrypt client-side, share a URL, open once and vanish. The architecture assumes breach — if the server is compromised tomorrow, there is nothing to steal.

Your secrets should be yours alone — even from us.

The Problem

Sharing sensitive information over chat, email or ticketing is insecure by default. POINT: Convenience has normalized permanence — once a secret is pasted, it lives in logs, indexes, backups and search. EVIDENCE: In team audits I've seen, the same Stripe key appears in 4 Slack threads, 2 email forwards and an old Notion page; GitHub and Slack DMs retain messages indefinitely, and many 'secure share' vendors still store plaintext or derive keys server-side, so a single DB leak exposes everything. MEANING: The gap isn't another sharing UI — it's a zero-knowledge primitive that leaves no trace. Until the server literally cannot read what you sent, 'secure sharing' is marketing, not security.

The Solution

CipherOnce is zero-knowledge by architecture, not by policy. POINT: Encrypt client-side, put the key where the server can't see it. EVIDENCE: Each secret gets a random 256-bit AES-GCM key generated in the browser via Web Crypto; plaintext is encrypted locally, ciphertext is POSTed to Supabase with an id and expiry; the key is placed in the URL fragment (#k=...) — fragments are never sent to the server or logged. The share URL is /s/{id}#k={key}. MEANING: The server stores only an encrypted blob it cannot open. On open, the recipient's browser fetches ciphertext, decrypts in-place, then Edge Functions delete the row (one-time view) or a cron sweeps expired rows. MECHANISM: No accounts, no key escrow, no plaintext at rest or in transit to the server — even a full DB dump is useless without the fragment.

Visit CipherOnce
Live CipherOnce Demo
Client-side · AES-256-GCM · fragment key · zero-knowledge
Expiry:0 chars

Zero-knowledge: Key in #k= is never sent to server or logs. DB dump = useless. View once = atomic delete.

Auditable · No account · View onceOpen cipheronce.com

Gallery

03 IMAGES · 1376×768
CipherOnce screenshot 1 — 1376×768
CipherOnce screenshot 2 — 1376×768
CipherOnce screenshot 3 — 1376×768
Case Study Theatre — CipherOnce

How we shipped cipheronce

PEM: Point → Evidence → Meaning. One decision rule per phase. No block-list.

01
Overview 15 sec flow

Zero-knowledge, one link, vanish.

CipherOnce is a zero-knowledge secret sharing primitive for everyday teams. POINT: It makes one-time, self-destructing links the easiest way to share secrets — no accounts, no key management UI, no plaintext on the server. EVIDENCE: As a full-stack Next.js + Supabase + Web Crypto build, it generates a per-secret 256-bit AES-GCM key client-side, stores only ciphertext, and puts the key in the URL fragment so the server literally cannot open what it stores. MEANING: Sharing becomes both safer and simpler — type or paste, get a link, share anywhere, open once and vanish. The overview is the promise in one line: if the server is compromised tomorrow, there is nothing to steal.

Philosophy

“Your secrets should be yours alone — even from us.”

02
Problem 4+ copies per key

Secrets live forever in chat logs.

The way teams share secrets is broken by habit. POINT: Chat, email and docs are convenient and permanent. EVIDENCE: Passwords and API keys pasted in Slack threads are searchable for years; email forwards multiply copies; many vaults and 'secure notes' still store plaintext or escrow keys server-side, so a leak is catastrophic. Developers know not to commit .env, but still DM it to a teammate under deadline. MEANING: We didn't need another vault with a better UI — we needed an ephemeral, zero-knowledge channel where the secure path is the path of least resistance. CipherOnce fills that gap by making the safe choice faster than the risky copy-paste.

Habit audit: Same Stripe key in 4 Slack threads + 2 emails + Notion — searchable for years.
03
Approach Server never sees

Refuse the compromise.

We designed CipherOnce from the compromise we refused to make. POINT: The server must never see plaintext — not at creation, not at rest, not on open. EVIDENCE: That constraint shaped every decision: key in fragment (#k=...) because fragments aren't sent or logged; per-secret random AES-256-GCM via Web Crypto (not a master password); ciphertext-only storage with id + expiry; Edge Functions for atomic fetch-and-destroy; and expiry sweep as a second guard. MEANING: Constraints clarified the product — no accounts (friction > persistence), no key recovery (recovery would break zero-knowledge), and explicit fragment preservation warnings. MECHANISM: The flow is deterministic — plaintext → client AES-GCM → POST ciphertext+expiry → URL /s/{id}#k={key} → recipient GET ciphertext → client decrypt → DELETE row → optional time expiry fallback — and the docs explain it openly so teams can audit without trusting marketing.

Decision rule

If it doesn’t serve “server never sees plaintext”, it doesn’t ship.

04
Experience <15s end-to-end

Invisible is the feature.

The UX goal was to make zero-knowledge feel effortless. POINT: Invisibility is the feature. EVIDENCE: A user lands, types or pastes a secret, chooses 'one-time' or a time window (5 min to 7 days), and gets a link instantly. They share it anywhere — Slack, email, ticket — the link carries the decryption key in its fragment. The recipient opens, the secret is revealed once, then the page shows 'destroyed' and the sender sees 'opened'. MEASURE: In usability checks, the flow stays under 15 seconds end-to-end with no onboarding. MEANING: If the user has to think about encryption, the product has failed. By putting all crypto in the client and all friction in the past (one extra copy-paste for the fragment), CipherOnce turns secure behavior into the easiest behavior.

30s Loom — CipherOnce walkthrough
No onboarding · <15s Watch →
05
Engineering AES-256-GCM

Boring stack, strong guarantee.

CipherOnce is a hardened full-stack web app where security is architecture. POINT: Keep keys out of the network. EVIDENCE: Next.js (App Router) + TypeScript with Web Crypto for AES-256-GCM per secret; Supabase Postgres for ciphertext rows (id, ciphertext, expiry, no key) and Edge Functions for create/fetch/destroy plus cron sweep for expiry; fragment-only key transport ensures proxies, logs and caches never see it; strict CSP, no plaintext logging, and minimal metadata retention. MEANING: Even a full DB dump, CDN log tail, or edge trace is useless without fragments, which are client-only. MECHANISM: Create: WebCrypto.generateKey → AES-GCM encrypt → POST ciphertext; Share: URL with #k; Open: GET ciphertext → WebCrypto decrypt → POST delete (atomic) → render plaintext then wipe from memory; Expire: scheduled function deletes stale rows. The stack stays boring so the guarantee stays strong.

Flow — fragment never sent
Browser encrypt POST cipher /s/ID#k=KEY GET cipher Decrypt + DELETE
06
Lessons No resend key

Every feature is a leak.

Security reframes product craft. POINT: Every feature is a potential leak. EVIDENCE: Adding 'resend key' or 'team vault' was tempting, but both would break zero-knowledge, so they were cut; early UX that hid the fragment copy step caused lost keys, so fragment preservation warnings and copy confirmations were added. MEANING: The invisible must be designed for — clear copy ('server never sees your secret'), open docs, and auditable flows matter more than marketing. MECHANISM: Building CipherOnce taught me to reason about lifecycle, not just creation: birth (keygen), share (fragment transport), reveal (client decrypt), and guaranteed destruction (single view + time expiry + no logs). That lifecycle thinking now shapes all my products: decide the compromise you refuse, then let it design the system.

Commit rhythm
Weekly shipping — solo, steady. Solo → Store is product discipline.

Building a security product is a constraint-driven education. POINT: Every line is an attack surface. EVIDENCE: Early prototypes that derived keys server-side were rejected — even with good intentions, the threat model f…

Build like this?
Let’s ship your product — end-to-end.
Kathmandu → Remote · Solo studio · Product-led
2 products View all work