Skip to content

Repository files navigation

Chronicles - In Active Design/Development

A zero-knowledge encrypted journal and digital day planner for those too busy to journal. Capture the key moments of your day, organize with topics, and track health, goals, and more — all encrypted on your device before it ever leaves the browser.

Features

  • Zero-Knowledge Encryption - AES-256-GCM client-side encryption with non-extractable keys; server never sees plaintext
  • Two-Factor Authentication - TOTP-based 2FA (authenticator app); inline setup wizard with QR code, confirmation step, and 8 backup codes; disable with password confirmation
  • Dashboard Home - Two-column drag-and-drop widget layout; quick entry, daily priorities, events & meetings, mini calendar, affirmations, daily wellness check-in, tasks, shopping list, medication schedule, weather, and menu plan; daily quote and greeting; Add your custom topic widget
  • Rich Text Editor - TipTap-based editor with formatting toolbar, inline freehand drawing, and voice dictation
  • Voice Dictation - Tap the mic button to dictate entries hands-free using the Web Speech API; interim text previews in real-time as you speak; works offline on iOS/Safari (on-device processing); auto-continues after silence
  • Topic Organization - Categorize entries with custom topics, icons, and drag-and-drop reordering; define your own custom fields per topic (text, number, date, yes/no, URL) — fields appear in the entry editor and dashboard quick entry; entries saved with only field values auto-summarize them as content; any topic can optionally hide the main text area so its entries are fields-only
  • Quick Tab Filters - Today, Date (with active filter bar and clear button), Tasks, All, Bookmarks, and Search views; the Date view lists events and meetings on their scheduled day, matching the calendar
  • Goals & Milestones - Track goals with milestone progress and task linking; milestone status cycle (Not Started → In Progress → Completed) with tap-to-advance on the card; goal cards display the entry's featured image as a banner
  • Custom Planner Filters - Cross-hierarchy search across goals, milestones, tasks, and todos; filter by keyword, item type, status, priority, parent goal, and parent milestone; save named filters that persist and can be reloaded in one tap
  • Meal Planning & Recipes - Weekly menu planner with a dedicated meals section (Menu, Recipes, Shopping Lists, Meals tabs); recipes render as a formatted recipe page — name, description, prep/cook/serves/calories/difficulty stats band, photo hero, checkable ingredients, and numbered method steps — with live serving scaling that recalculates ingredient amounts, one-tap "Add to shopping list" (appends all ingredients and cross-links the entries), and "Add to menu"
  • Shopping Lists - Checklist-style lists linkable to recipes; dashboard widget shows active list with inline check-off
  • Health Tracking - Medications, symptoms, food, exercise, and allergies; printable medication lists (with dosage and schedule), symptom logs, and allergy records
  • Medication Schedule - Daily dose tracking with time-based scheduling; real-time sync on tab focus
  • Daily Wellness Check-in - Tap-to-fill water glasses, mood faces (1–5), sleep hours, period toggle, and flow intensity on the dashboard; entries stored encrypted under the Wellness topic and fully editable in the journal
  • Health Reporting - Correlation analysis, severity trends, exercise impact, and wellness trends (water/mood/sleep) with cross-correlation insights (sleep→mood, water→symptoms, exercise→sleep, mood→symptoms); cycle calendar showing period and flow days by month; date range filtering
  • Mini Calendar Widget - Monthly grid on dashboard with entry-presence dots; click any day to jump to that day's journal entries
  • Calendar View - Visual month overview; events and meetings appear on their scheduled date in your header colour
  • Calendar Sync - Two-way sync of Event and Meeting entries with Google Calendar (pick any calendar you own); optional import of events created directly in Google; read-only Apple Calendar subscription feed (ICS) for iPhone/iPad/Mac; connect, disconnect, and sync on demand from Settings
  • Entry Images - Attach up to 7 photos per entry, stored zero-knowledge in your own Cloudflare R2 bucket; images are encrypted in the browser with your master key before upload, so your bucket only ever holds ciphertext; thumbnail strip, tap-to-open lightbox, and an optional featured image that renders as a hero banner above the entry
  • Entry Sharing - Share entries via public links; the share dialog manages the links for that entry (create, copy, revoke). Shared copies are stored unencrypted on the server by design — creating a link is an explicit opt-out of zero-knowledge for that entry, and revoking it removes access. Sharing is hidden for entries with images, except recipes, which share their formatted text while the photo stays private
  • Title-Led Entry Headers - Events, meetings, quotes, books, music, goals, and milestones open with their own name in place of the date block — events/meetings add a date · time · location line, quotes render formatted with author attribution, books show title and author
  • PWA Support - Installable as a standalone app with offline shell caching
  • Customizable Theme - Light/dark mode with muted accent color presets (Teal, Ink, Rose, Amber, Sage, Denim, Purple) that recolor the whole app, plus header colors and background images
  • Display Name - Set a display name shown in the dashboard greeting; username shown read-only in account settings
  • Apple Pencil Support - Scribble handwriting-to-text in all fields; freehand drawing canvas with pressure sensitivity, palm rejection, and undo — drawings saved inline as encrypted SVG
  • Mobile Responsive - Collapsible navigation, touch-friendly tap targets, single-column dashboard on small screens
  • Accessible - ARIA roles, focus management, keyboard navigation, reduced motion support

Privacy & Security

  • All entry content is encrypted in the browser before transmission
  • Images never touch the Chronicles server — they are encrypted client-side and uploaded straight to your own R2 bucket with URLs signed in the browser; your R2 credentials are themselves encrypted with your master key, so the server stores only ciphertext it cannot read
  • Two-factor authentication (TOTP) — no external services; secrets stored encrypted server-side
  • Recovery key system allows password reset without compromising zero-knowledge design
  • Sharing is the one deliberate exception: creating a share link stores a plaintext copy of that entry on the server so the link works for anyone — you opt in per entry, and revoking the link removes access
  • Schema-per-user database isolation (not row-level security)
  • Session management — view and revoke active sessions from any device
  • Non-extractable CryptoKeys — master key cannot be exported from the browser's crypto subsystem
  • Split-token sessions — database leaks cannot reconstruct valid session tokens

Screenshots - Chronicles is in a re-design slated for release July/August with a phone app via React Native coming soon.

New look: Screenshot 2026-06-24 at 11 45 57 PM Screenshot 2026-06-24 at 11 47 51 PM Screenshot 2026-06-24 at 11 48 00 PM Screenshot 2026-06-24 at 11 48 28 PM Screenshot 2026-06-24 at 11 49 25 PM Screenshot 2026-06-24 at 11 49 55 PM Screenshot 2026-06-24 at 11 50 17 PM Screenshot 2026-06-24 at 11 50 27 PM Screenshot 2026-06-24 at 11 50 42 PM Screenshot 2026-06-24 at 11 51 49 PM Screenshot 2026-06-24 at 11 52 00 PM Screenshot 2026-06-24 at 11 52 19 PM

Architecture

This is a complete rebuild combining the best of the original Chronicles UI with a cleaner, modular architecture:

  • Client: React 19 SPA (Vite) — no Next.js, ready for React Native
  • Server: Express 5 API with TypeScript
  • Shared: Crypto, types, validation, and theme tokens shared across platforms
  • Components: Atomic Design (atoms -> molecules -> organisms -> templates -> views)
  • Styling: styled-components (CSS-in-JS) with muted vintage design tokens
chronicles-rebuild/
├── client/          # React SPA (Vite + styled-components + PWA)
├── server/          # Express API (Prisma + PostgreSQL)
├── shared/          # Shared code (crypto, types, theme)
└── docs/            # BLUEPRINT.md, ACCESSIBILITY_UX_PLAN.md

How It Works

Chronicles is a daily journal. Capture moments, organize with topics, and track what matters to you.

Topics

Topics categorize your entries — like tags or folders. Each has an icon and color.

Default Topics with special fields:

  • Task - Todo items with completion tracking and auto-migration
  • Goal - Objectives with milestone progress tracking
  • Milestone - Checkpoints within goals, linkable to tasks
  • Medication - Schedules with dosage, frequency, and dose logging
  • Food - Meal logging with ingredients, calories, and meal type
  • Symptom - Severity tracking (1-10 scale) with duration
  • Exercise - Type, duration, intensity, and distance tracking
  • Allergy - Allergen, severity, and reaction tracking
  • Wellness - Auto-created by the dashboard check-in widget; water, mood, and sleep fields
  • Event - Name, date/time, location, and contact details; opens with the event name as its header
  • Meeting - Name, attendees, topic, location, and scheduling
  • Recipe - Formatted recipe page: description, category, prep/cook/serves/calories/difficulty, checkable ingredients with serving scaling, numbered method steps, photo hero, shopping-list and menu integration
  • Shopping List - Checklist items with categories, linkable to recipes
  • Menu Plan - Weekly meal slots, linkable to recipes
  • Priorities - Auto-created by the dashboard priorities widget
  • Music / Books / TV/Movies - Entertainment tracking; books and music lead with their title/artist from your custom fields
  • Research / Idea / Quote - Inspiration collection; quotes display formatted with author attribution

You can create your own topics for anything else. Any topic can have user-defined custom fields — add them by editing a topic in the Topics view. Fields appear in the entry editor and Quick Entry widget. Supported types: text, number, date, yes/no, URL.

Navigation

  • Dashboard (/) - Home view with daily widgets and quick entry
  • Journal (/journal) - Main entry view with quick tab filters (Today, Date, Tasks, All, Bookmarks, Search)
  • Topics - Manage and browse entries by topic
  • Calendar - Month view with clickable days for detail; events/meetings appear on their scheduled date
  • Planning - Goals, milestones, tasks, and todos (dropdown selector); Custom Filters view at /goals/filter
  • Meals (/menu) - Menu planner, Recipes, Shopping Lists, and Meals log tabs
  • Health - Medications, schedule, food, exercise, symptoms, allergies, and reporting
  • Quick Links - Entertainment and inspiration collections

Keyboard Shortcuts

Shortcut Action
Ctrl/Cmd + N New entry
Ctrl/Cmd + D Delete selected entry
Enter Save entry (when editor is focused)
Shift + N New entry (when not typing)

Dashboard Widgets

The dashboard has two columns. Default layout:

Left Right
Quick Entry Mini Calendar
Priorities Affirmations
Events & Meetings Daily Wellness Check-in
Menu Plan (add more from widget tray)

Additional widgets available in the tray: Tasks, Shopping List, Medication Schedule, Weather.

Drag to reorder within or across columns. Layout is saved per-browser.

Health Reporting

Analyze health data with correlation analysis:

  • Symptom frequency and severity trends over time
  • Food-symptom correlations — identify trigger ingredients
  • Exercise impact on symptom patterns
  • Wellness trends — water, mood, and sleep over time with cross-correlations (sleep→mood, water→symptoms, exercise→sleep, mood→symptoms)
  • Calorie summaries by meal type
  • Date range filtering — Today, Week, Month, Year, or custom date range

Calendar Sync

Keep Event and Meeting entries in sync with the calendars you already use:

  • Google Calendar (two-way) — Connect your Google account in Settings → Calendar Sync and pick which calendar to sync to. Events and meetings you create in Chronicles appear there; edits and deletions propagate. Optionally import events created directly in Google (from today onward) as Chronicles entries.
  • Apple Calendar (subscription feed) — Enable the ICS feed to get a private webcal:// URL you can subscribe to from iPhone, iPad, or Mac (one-way: Chronicles → Apple Calendar). Regenerate the URL any time if it leaks.

Only event titles, times, and locations are synced — never your journal content. Requires Google OAuth credentials on the server (see server/.env.example); the Apple feed works with no external setup.

Entry Images

Add up to 7 photos to any journal entry — without giving up zero-knowledge:

  1. Bring your own bucket — Create a free Cloudflare R2 bucket and an API token (Object Read & Write, scoped to that bucket). Your storage, your bill (R2's free tier has no egress fees).
  2. Enter credentials in Settings → Entry images — They autosave as you type, get encrypted with your master key, and are stored as ciphertext the server cannot read. The setup guide in Settings walks through the bucket, token, and the required CORS policy, and an optional "Test connection" verifies everything from your browser.
  3. Attach images in the editor — Photos are downscaled, encrypted with AES-256-GCM in the browser, and uploaded directly to your bucket with browser-signed URLs. Chronicles' server never sees the images or your credentials — your bucket only ever contains encrypted noise.

Star an image to feature it as a full-width banner above the entry (recipes and goal cards use it too); tap any thumbnail for a full-screen lightbox with keyboard and swipe navigation. Deleting an image or an entry (including bulk delete) also removes the objects from your bucket. Sharing is automatically disabled for entries that contain images — except recipes, which share only their formatted text while the photo stays in your bucket.

Printable Views

Medication lists, symptom logs, and allergy records can be printed directly from the browser for sharing with healthcare providers.

Settings

  • Account - Display name, read-only username
  • Security - Change password; Two-factor authentication (TOTP setup wizard with QR code and backup codes)
  • Sessions - View and revoke active sessions from any device
  • Features - Enable/disable health tracking, planning, entertainment, and more
  • Calendar Sync - Connect Google Calendar, choose the target calendar, toggle imports, manage the Apple ICS feed, and clean up old events
  • Entry Images - Toggle the feature, enter your Cloudflare R2 credentials (autosaved and master-key encrypted), test the connection, and follow the built-in setup guide
  • Theme - Light/dark mode, muted accent color presets, header colors, background images
  • Data - Seed test data, export/import entries

Getting Started

Prerequisites

  • Node.js 18+
  • PostgreSQL 15+

Installation

  1. Clone the repository

  2. Install dependencies:

    npm install
  3. Set up environment variables:

    cp server/.env.example server/.env
    # Edit server/.env with your database credentials

    Optional: to enable Google Calendar sync, add Google OAuth credentials and a CALENDAR_TOKEN_KEY (see comments in .env.example). Entry images need no server configuration — each user connects their own R2 bucket from Settings.

  4. Set up the database:

    cd server
    npx prisma generate
    npx prisma db push
  5. Run both servers:

    npm run dev

    This starts the Express API on port 3001 and the Vite dev server on port 5173.

Registration

Password requirements:

  • Minimum 12 characters
  • At least one uppercase letter, lowercase letter, and number

Recovery Key: At registration, you'll receive a recovery key (formatted as hex with dashes). Save it securely — it's the only way to recover your account if you forget your password.

Commands

npm run dev              # Start both client and server
npm run dev:client       # Start Vite dev server only
npm run dev:server       # Start Express API only
npm run build            # Build all packages
npm run test             # Run all tests (shared + server + client)
npm run test:coverage    # Run tests with coverage

Tech Stack

  • Frontend: React 19, Vite, react-router-dom, styled-components, Zustand, TipTap, perfect-freehand
  • Backend: Express 5, TypeScript, Prisma
  • Database: PostgreSQL (schema-per-user isolation)
  • Encryption: Web Crypto API (AES-256-GCM, PBKDF2-SHA256 600k iterations)
  • Image Storage: User-owned Cloudflare R2 buckets; dependency-free in-browser AWS SigV4 signing (Web Crypto HMAC)
  • Calendar: Google Calendar API (OAuth 2.0, two-way) + self-hosted ICS subscription feed
  • Auth: Split-token sessions (selector + SHA-256 verifier hash) + TOTP 2FA (otplib)
  • PWA: vite-plugin-pwa with Workbox (shell caching, no encrypted data cached)
  • Accessibility: ARIA roles, focus trapping, keyboard navigation, prefers-reduced-motion
  • Testing: Vitest, React Testing Library, supertest

License

© 2025/2026 Claudette Raynor. All rights reserved.You may not use this for any commercial purpose. You can download this application for personal use only, but you may not modify it.

About

A fast, efficient, encrypted journaling system with task management and goal tracking, medication, exercise, and health tracking, and customizable topics, colors, and backgrounds.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages