All projects
Mobile App
Built — not yet launched

Temphera — Journal Planner App with a Privacy-First Admin Console

Temphera is a journal-planner app for individuals and couples, built by CountryDevs: journal, moods, habits, goals and money in one React Native app, plus an admin console that lets staff run support and moderation without reading what users write.

For TempheraJan–Aug 2026
  • iOS and Android app
  • Admin console
  • Marketing site
Temphera features page header and feature lists

Overview

Temphera puts a journal, a planner and a money tracker in one app. People write daily entries with guided prompts, log moods, run morning, evening and weekly-review routines, track habits and streaks, and set goals for the year, the month and the day. The finance side covers expenses, income, budgets, spending limits and investments. The app is free to start, with two subscriptions on top: Plus unlocks unlimited history, insights and data export, and Pro adds couples mode, where two linked accounts share budgets, expenses and savings and settle up, and investments tracked by ticker and priced from Yahoo Finance or AMFI's daily mutual-fund NAVs.

The second half is the console the team uses to run it: support tickets, moderation, broadcasts, feature flags, analytics and system health, in a separate service with its own backend. It is built around one rule: staff work from metadata and counts, never from what a user wrote.

Temphera is our own product: co-founder Mayur Srivatsav led the build between January and August 2026 across four repositories. It has not been released: the app still carries React Native's default bundle identifiers, the store billing keys are empty, the SwiftUI home-screen widget is written but not yet added to the iOS build, and the domain is not serving.

How does the console keep staff out of user content?

The admin backend's README states its first rule plainly: no content-field access, ever. We enforced it in layers, so that no single mistake opens it up.

Reads go through allowlists

The admin service does not import the app's data models. Every user collection it reads is registered with an explicit field allowlist, and queries run with that projection built in. A user's profile in the console shows metadata and per-collection counts (journal entries, mood entries, expenses) with no way to open an entry. Even a user's free-text bio is left out. A unit test walks the whole registry and fails if any field name matches the pattern for content.

Writes go through a signed bridge

The console's database role can read user collections but can only write to its own. When staff remove a reported post, the console calls an HMAC-signed internal endpoint on the app's backend, which hides the content and can restore it if an appeal succeeds.

Moderation without the text

A moderation item carries a pointer to the content (collection, document and field), the report reason and classifier scores. The body is never rendered. An appeal must be reviewed by a different moderator from the one who made the decision, and that is checked on the server, not just hidden in the interface.

Analytics from counters

Retention cohorts, feature adoption and audience segments are built from activity counters and allow-listed metadata fields, so growth work never needs content either.

Why can't staff rewrite the audit log?

Every staff action that changes something is written through one service. A writer takes a Redis lock, reads the last entry and inserts the next one with a sequence number and the previous entry's hash. The new hash is SHA-256 over a canonical (RFC 8785) JSON form of the entry, so the same content always hashes the same way. Unique indexes on the sequence and the hash turn any race past the lock into a retry rather than a fork in the chain.

Insert-only, twice over

No code path updates or deletes an entry, and the database role for the admin service is granted insert and read on the log but not update or remove. There is deliberately no expiry index: entries are kept for at least six years.

Proof that leaves the building

Each night the previous day's hashes are rolled into a Merkle root, signed, and shipped to Backblaze B2 under a compliance-mode object lock with ten-year retention, so even someone with full database access cannot rewrite history unnoticed. Three failed shipments in a row raise a critical alert. A verifier in the console re-hashes any range and lists the daily roots, and a broken chain puts a SEV-1 banner across the dashboard.

High-risk actions

Crypto-shred, feature-flag kill switches and break-glass grants need a fresh 2FA code tied to the same person and session. A break-glass grant adds temporary permissions from a template, needs a written reason, expires on a hard deadline and asks for a post-incident note afterwards.

A review of our own code found that the fresh-2FA check on break-glass grants had been mounted as the middleware factory instead of being called, which silently skipped it. It is fixed, with a comment at the route explaining why.

When is crypto-shred allowed to run?

A deletion in Temphera is meant to be final, so most of the code is about when it is allowed to run.

Two phases

  1. Shred. After a 7-day grace window, the user's encryption key record is destroyed: the wrapped data key, nonce, salt and recovery material are cleared, which is meant to leave anything encrypted under that key unreadable by anyone, including us.
  2. Hard delete. Thirty days after the shred, the user's records are dropped from every listed collection, from journal and mood entries to budgets, habits and routines. The user document becomes a tombstone so audit-log and ticket references don't point at nothing.

Four refusals

Each phase refuses to run if the grace window hasn't passed, if the account is under legal hold, if (for the hard delete) the shred hasn't happened, or if the user has a paid subscription with no refund decision recorded. That last rule exists because the shred destroys the evidence: once the key is gone nobody can establish what the user had or was owed, so the money question has to be answered first.

In the console, scheduling a shred needs a legal basis, a reason of at least 50 characters, two acknowledgements and a fresh 2FA code, and every step is logged at SEV-1.

The honest caveat

The shred path is built and unit-tested in the admin backend. The per-user encryption it acts on is not in place in the app's backend yet; a separate piece of work owns it. Until that lands the shred step has no key to destroy, and the 30-day hard delete is what removes the data. The project's own deployment checklist marks crypto-shred as not signed off for exactly this reason, and so do we.

The challenge

A journal app holds some of the most private things people write: moods, worries, money, relationships. Someone still has to answer support emails, review reported posts, process deletion requests and keep the service healthy. The usual admin panel reads straight from the production database and shows staff everything, and its activity log is a table anyone with database access can edit.

We needed staff tooling that is useful for support and moderation but cannot show content by design, a record of staff actions that staff themselves cannot quietly rewrite, and a deletion path that is final but hard to trigger by mistake. On the product side, one app had to hold a journal, a planner, a finance tracker and a couples mode without feeling like four apps.

The solution

The admin console runs on its own Express backend and shares the database through a narrow MongoDB role: it can read user collections and write only its own. Every read of user data goes through a per-collection field allowlist, and a unit test fails if a content field appears in one. Anything that must touch user content, such as hiding a reported post, goes through an HMAC-signed internal API on the app's backend.

Staff accounts use nine roles with explicit permissions, and every role requires two-factor sign-in: TOTP, with WebAuthn passkeys required after a 90-day enrolment window. High-risk actions need a fresh 2FA code on top of the session, and every staff change lands in a hash-chained, insert-only audit log. The app itself is React Native 0.83, on an Express and MongoDB backend with background jobs for market data and nightly roll-ups.

The impact

Temphera is built and has not been released. Its admin backend's exit-criteria document records more than 376 unit tests and 14 integration tests for that service and about 200 for the app's backend. The deploy-time checks in the same document (probing the database role, live 2FA enrolment for every staff account, shipping audit roots to locked storage) have not been run, because there is no staging or production deployment yet.

Two gaps are on record. The per-user encryption that crypto-shred destroys is not yet in place in the app's backend, so crypto-shred cannot be signed off end to end, and the staff-side billing tools have not been started. We list them because the point of this console is that it does not overstate what it protects.

Features

What we built into Temphera

Journal and moods

Daily entries with guided prompts, gratitude, highlights, doodles, On This Day and a Year in Pixels view, plus mood check-ins with history and stats.

Habits and routines

A habit tracker with streaks, morning, evening and weekly-review routines, and a rating for each day.

Goals for the year, month and day

Yearly goals, monthly plans, daily priorities, a bucket list and a life timeline in one planner.

Personal finance with market data

Expenses, income, monthly budgets, spending limits, dream purchases and a scenario planner. Holdings can be entered by hand on any plan; on Pro they can be tracked by ticker and priced from Yahoo Finance or AMFI's daily mutual-fund NAVs.

Couples mode

A Pro feature: two accounts link as a couple to share budget categories, expenses and savings, split costs 50/50 or by a ratio they set, and record settlements between them.

Insights from your own history

Mood stats show each month's average, streak and spread. On Plus, nightly roll-ups turn entries into written insights and a Year in Pixels grid with one colour per logged day.

Metadata-only admin console

Users, tickets and moderation show metadata and counts. A moderation item carries a pointer to the content and classifier scores, never the body.

Hash-chained audit log

An insert-only log of staff actions with SHA-256 chaining, daily signed Merkle roots and a verifier inside the console.

Staff security

Nine roles, mandatory 2FA, WebAuthn passkeys, fresh-2FA checks on high-risk actions and time-boxed break-glass grants.

Support desk

Email tickets threaded from inbound mail, with per-address inboxes and routing, reply macros, SLA timers and satisfaction surveys.

By the numbers
86
Screens in the mobile app
9
Staff roles, every one requiring 2FA
376+
Unit tests in the admin backend
7days
Grace window before a deletion runs
Screens

What Temphera looks like

Temphera pricing page with Free and Premium plan cards
Pricing compares the free tier with Premium, with a monthly/annual toggle.
Temphera admin console dashboard with KPI tiles and navigation sidebar
The staff home shows the signed-in admin's sessions and recent actions, recent SEV-1 audit events, and live tiles for tickets, analytics and system health.
User detail page with profile metadata and content-count tiles
A user's profile shows only metadata and per-collection counts (journal, mood, expense entries); staff cannot open the entries themselves.
Moderation item with classifier score bars, decision form and appeal review form
A moderation item shows only a content reference, report reason and classifier scores — never the body — with decision and appeal-review panels.
List of submitted and in-review moderation appeals
Appeals are reviewed by a different moderator than the original decider, enforced server-side.
Audit log list with sequence numbers, actions, actors and severity badges
Every staff action lands in an append-only, hash-chained audit ledger that can be filtered by action, severity and result.
Chain integrity verifier showing a verification result and a Merkle root ledger
The verifier re-hashes a range of audit entries against the chain and lists the signed daily Merkle roots.
Support Agent role detail showing 2FA requirement, session limits and grouped permission chips
Each role carries an explicit permission list plus 2FA and session-length policy; system roles are read-only.
Two-factor settings with TOTP enabled and two enrolled passkeys
Staff 2FA settings show TOTP status and enrolled WebAuthn passkeys, which can be removed individually.
Kill switch confirmation dialog on a feature flag
Tripping a flag's kill switch disables it globally and requires a fresh TOTP code before it goes through.
Destructive crypto-shred dialog with legal basis, reason and two confirmation checkboxes
Scheduling a crypto-shred requires a legal basis, a 50-character reason and two acknowledgements; it destroys the user's encryption keys after a 7-day grace window.
Ticket queue with status and priority pills and SLA timers
The email-based support queue shows status, priority and live first-response and resolution SLA countdowns per ticket.
System health page with a grid of background queue cards
Queue depth and failures for every background worker, refreshed every 30 seconds.
App screens

Inside the mobile app

Temphera planner home with a 'Make today count' header, a today's-tasks bar and four quick-access tiles
The planner home for Monday 19 October: a greeting, today's three tasks and quick access to habits, monthly goals, notes and the calendar.
Couples hub showing two partner avatars, a shared-spend ring, a 'Leo owes you $542' strip and tiles for joint budget and shared expenses
The shared hub for a linked couple, Ava and Leo: $2,805 of shared spending against a $3,170 joint budget this month, the running balance between them (Leo owes Ava $542), and shortcuts to add a shared expense, settle up or open the joint budget and shared expenses.
Settlement screen with 'Leo owes you $542', a Mark as settled button and paid versus fair-share figures for each partner
Settling up: $2,805 of shared spending split 60/40. Ava paid $2,225 against a fair share of $1,683 and Leo paid $580 against $1,122, so Leo owes Ava $542.
Joint budget screen with an 88% ring and category rows for rent, groceries, utilities and dining out showing budget and spend
The couple's joint budget for October 2026: $2,805 spent of $3,170 budgeted (88%), tracked per shared category with an editable amount for each.
Finance home with a category spending donut and an orange investment portfolio card
The personal finance home, scrolled to spending by category ($1.56K in total, led by shopping, gifts, groceries, utilities and restaurants) and a portfolio card showing $43,000 invested, a current value of $51,450 and a return of $8,450.
Holdings list with invested and returns tiles, type filter chips and positions such as an S&P 500 ETF, a growth fund and Apple stock
Investment holdings: six positions with $43,000 put in and +$8,450 in returns, filterable by type, each showing value, gain and edit or pause controls.
Scenario planner with projection tiles for 3 months to 2 years and three what-if rows
The what-if planner projects savings at 3, 6, 12 and 24 months from the income and expenses entered (typed in for this demo), and compares cutting expenses 10%, earning 10% more or saving to a 20% target.
A grid of coloured squares, one per day for each month of 2026, with a five-colour mood legend
Year in Pixels for 2026: one colour per day from mood check-ins, with 249 of 365 days logged and the year's mix of moods from awesome to worst.
Mood stats screen with average, days-logged and streak tiles, a distribution bar list and the top of a trend chart
October's mood stats: an average of 3.2, 15 of 19 days logged (79%), a six-day streak and the distribution across five moods, with the month's trend chart below.
Journal home on 17 October listing gratitude, highlights and thoughts-and-feelings entries
The journal for Saturday 17 October with three entries (gratitude, highlights and a short reflection), under the day's prompt and above the quick-journal cards.
On This Day screen with a 2025 card showing a mood and journal snippets, and the start of a 2024 card
On This Day for 19 October brings back the same date in earlier years: the mood and journal entry from 2025, then 2024.
Habit tracker with a streak ring, a consistency heatmap and monthly and weekly completion counts
The habit tracker for October 2026: Morning walk on a five-day streak at 52% for the month, a four-month consistency heatmap, and month, week and all-time-best counts across five habits.
Yearly goals screen with a 0 of 5 summary, four category progress rings and goal rows with 25/50/75/100% chips
Yearly goals for 2026: none of the five goals is finished yet, and progress rings show work at 40%, family at 43% and personal at 73%, with each goal tracked in 25% steps.
Monthly plan with a motto card, a checklist of four goals and two important dates
October's monthly plan: a motto, four monthly goals with one done, and important dates such as a half-marathon training check and a birthday.
Project details
Tech stack
React NativeTypeScriptNode.jsExpressMongoDBRedisBullMQSocket.IONext.jsTailwind CSSCASLWebAuthnTOTPAWS SESBackblaze B2
Timeline & team
Jan–Aug 2026
FAQ

Questions about this project

How can support staff help Temphera users without reading their journals?

Every admin read goes through a per-collection field allowlist that returns metadata and counts only, and a unit test fails if a content field ever appears in one. The admin service's database role cannot write to user collections at all; actions such as hiding a reported post go through a signed internal API on the app's backend.

What happens to a Temphera user's data when they ask to be deleted?

After a 7-day grace window the user's encryption key record is destroyed, and 30 days later their records are hard-deleted while a tombstone keeps audit references intact. Both steps refuse to run under a legal hold or while a paid subscription has no refund decision recorded.

How is the Temphera admin audit log made tamper-evident?

Each entry stores a SHA-256 hash of its canonical JSON plus the previous entry's hash, so changing any past row breaks the chain. Each night the day's hashes are rolled into a signed Merkle root for off-site storage under a ten-year object lock, and a verifier in the console re-checks any range.

Can couples share a budget in the Temphera app?

Yes, on the Pro plan. Two accounts link as a couple to share budget categories, expenses and savings, split shared costs 50/50 or by a ratio they set, and see who owes whom before recording a settlement.

More work

Other things we shipped

All projects
Storafleet fleet overview with storage totals, trend line, transfers list and per-provider footprint barsFeatured
Saasfor Storafleet

Storafleet — Multi-Cloud Storage Control Plane

Storafleet is CountryDevs' own SaaS control plane for object storage. Teams connect buckets they already own on 50+ providers, including AWS S3, Cloudflare R2, Backblaze B2, Wasabi and MinIO, then browse, migrate, search, secure and cost-check them from one console.

Next.js 15ReactRedux ToolkitNode.js+11
50+Storage providers in the connection roster
Case study
Pakka Logistics home page hero on desktopFeatured
Mobile Appfor Pakka Logistics

Pakka Logistics — Porter-Style Delivery Platform

Pakka Logistics is a Porter-style delivery platform for India. We built all of it: Android apps for customers and drivers, a business portal, an operations console and the website. The web platform is live; the Android apps are being prepared for Google Play.

React NativeTypeScriptRedux ToolkitNode.js+12
96.3%API routes exercised by a probe before launch (260 of 270)
Case study
Superadmin stories grid with photo storiesFeatured
Mobile Appfor Slic Solutions Private Limited

LetSlic — Social Media App with Group Chat, Stories and Premium

LetSlic, listed on Google Play as Slic, is a social app for photo posts, 24-hour stories and real-time chat with group moderation. We built it for Slic Solutions Private Limited: the React Native app, two Node.js APIs, the superadmin console and the website, plus Premium and ads.

React NativeTypeScriptReduxNode.js+13
13Months from first commit to handover (Jun 2025 – Jul 2026)
Case study
Got a project?

Let's build the
next one together

Tell us what you're trying to ship. We'll come back with a scope, a timeline, and a fixed price — usually within 48 hours.

Not ready for a full build? Start with a fixed-price Discovery Sprint, or get a code audit of an app someone else built.