Jacob Schmidt f06c1d15bb refactor: encrypt fragments in SQLCipher DB, organize services into domain modules
- Move standalone fragment storage from unencrypted SQLite to the existing
  encrypted SQLCipher database (journal_cache.db)
- Add IDatabaseSessionService/DatabaseSessionService for shared encrypted
  connection management after authentication
- Update fragments table schema: nullable entry_id, add guid column
- Reorganize flat Services/ directory (28 files) into 9 domain modules:
  Ai, Config, Database, Entries, Fragments, Logging, Sidecar, Speech, Vault
- Update all namespace declarations and using statements across all projects
- Update REFACTORING_SUMMARY.md with all changes

Co-Authored-By: Warp <agent@warp.dev>
2026-02-23 21:58:45 -06:00
2026-02-23 19:57:18 -06:00
2026-02-23 19:57:18 -06:00

Project_Journal

A structured journaling system with encrypted monthly vaults, desktop UI, CLI tools, and optional AI-assisted analysis.

Support Matrix

  • Python: 3.14
  • Platforms: Windows and Linux (first-class), macOS (best effort)
  • Default profile: CPU
  • Optional profiles: GPU, optional NLP backend

Dependency Profiles

  • requirements_base.txt: shared Journal runtime dependencies
  • requirements_cpu_only.txt: base + CPU AI stack
  • requirements_gpu.txt: base + GPU AI stack
  • requirements_nlp_optional.txt: optional spaCy backend (auto-fallback if unavailable)

Quickstart

Linux (CPU default)

cd Project_Journal
python3.14 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install --extra-index-url https://download.pytorch.org/whl/cpu -r requirements_cpu_only.txt

Linux (GPU optional)

cd Project_Journal
python3.14 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements_gpu.txt

Windows PowerShell (CPU default)

cd Project_Journal
py -3.14 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install --extra-index-url https://download.pytorch.org/whl/cpu -r requirements_cpu_only.txt

On Windows + Python 3.14, pywebview is intentionally skipped due upstream pythonnet build compatibility. run_desktop.py will auto-fallback to opening the app in your system browser.

Optional NLP backend (spaCy)

python -m pip install -r requirements_nlp_optional.txt
python -m spacy download en_core_web_sm

If spaCy is missing or unsupported, Journal now auto-falls back to built-in NLP heuristics. On current Python 3.14 environments, this optional install may be skipped due upstream spaCy compatibility.

Running

Desktop App

python ./journal/run_desktop.py

CLI

python -m journal.cli.main --help
python -m journal.cli.main vault load
python -m journal.cli.main search "your query"

NLP Backend Control

Set JOURNAL_NLP_BACKEND to choose behavior:

  • auto (default): use spaCy when available, else fallback
  • spacy: require spaCy backend and fail clearly if unavailable
  • fallback: always use fallback heuristics

Examples:

export JOURNAL_NLP_BACKEND=fallback
python ./journal/run_desktop.py
$env:JOURNAL_NLP_BACKEND = "spacy"
python .\journal\run_desktop.py

Installer Script

Use the Linux helper script:

./installreqs.sh
./installreqs.sh --gpu
./installreqs.sh --with-nlp

C# Backend

The backend/ directory contains a .NET 10 implementation that provides the same journal functionality as the Python layer, with encrypted vault support and an identical JSON command protocol.

Projects

  • Journal.Core — shared library: domain models, services, repositories, DTOs
  • Journal.Api — minimal ASP.NET Core web API (/api/command POST endpoint)
  • Journal.Sidecar — console app (stdin/stdout JSON protocol or CLI with vault and search subcommands)
  • Journal.SmokeTests — 70+ integration tests (no test framework dependency)

Architecture

Entry (thin command dispatcher)
  ├── IFragmentService → FragmentService → IFragmentRepository
  ├── IEntryFileService → EntryFileService → IEntryFileRepository
  ├── IEntrySearchService → EntrySearchService
  ├── IVaultStorageService → VaultStorageService → IVaultCryptoService
  ├── IJournalDatabaseService → JournalDatabaseService (SQLCipher)
  ├── IAiService → PythonSidecarAiService | DisabledAiService
  ├── ISpeechBridgeService → PythonSidecarSpeechService | DisabledSpeechBridgeService
  ├── CommandLogger
  └── IJournalConfigService → JournalConfigService

Build & Run

cd backend
dotnet build

Run the API server:

dotnet run --project Journal.Api

Run the sidecar (stdin/stdout mode):

dotnet run --project Journal.Sidecar

Sidecar CLI commands:

dotnet run --project Journal.Sidecar -- vault load --password <value>
dotnet run --project Journal.Sidecar -- vault save --password <value>
dotnet run --project Journal.Sidecar -- search "your query" --tag stress --start-date 2026-02-01

Run smoke tests:

dotnet run --project Journal.SmokeTests

Environment Variables

  • JOURNAL_PROJECT_ROOT — override project root detection
  • JOURNAL_DATA_DIR / JOURNAL_VAULT_DIR — override data/vault paths
  • JOURNAL_AI_PROVIDERnone (default) or python-sidecar
  • JOURNAL_PYTHON_EXE — Python executable path (default: python)
  • JOURNAL_LOG_LEVELtrace, debug, information, warning (default), error, critical

Encryption

  • Vault: AES-256-GCM with PBKDF2-HMAC-SHA256 key derivation (600k iterations)
  • Database: SQLCipher with PBKDF2-derived key
  • Wire format matches the Python implementation for cross-language parity

Notes

  • Decrypted journal data in journal/data is cleared on graceful shutdown.
  • Vault save/load commands remain unchanged.
Description
No description provided
Readme 14 MiB
Languages
C# 43.7%
Svelte 29.5%
Python 10.6%
TypeScript 10.4%
Rust 3.6%
Other 2%