The Problem
Organizing personal life data across disparate tools creates fragmentation. This repo addresses that with a self-hosted platform, but its architecture spans 5 independent projects with shared modules, circular imports, and duplicated UI logic that increases maintenance overhead and risk of inconsistent state.
What This Does
Lifeforge is a portfolio of 5 self-contained projects: packages (284 files, 259 code files), tools (161 files, 120 code files), client (146 files, 118 code files), server (100 files, 95 code files), and shared (51 files, 49 code files). The client is a React + Tailwind application built with Vite (client/vite.config.ts, client/package.json), while the server runs Express. Module federation is used for UI composition, but a critical CSS architecture issue (PR #93) blocks progress—bundling Tailwind independently in host and federated modules causes cascade layer conflicts that break responsive utilities. The shared module (shared/src/index) is a hub with 31 imports and 4 dependents, participating in a circular dependency cycle with instability 0.97. UI components show severe duplication: 448 repeated 6-line blocks across 131 files, including client/src/core/accountSettings/components/AvatarColumn.tsx and client/src/core/personalization/components/BgImageSelector/index.tsx. Import cycles involve packages/lifeforge-ui/src/components/overlays/modals/features/FormModal/typescript/form.types.ts, server/src/core/functions/database/PBService/index.ts, and packages/lifeforge-ui/src/components/inputs/RRuleInput/index.tsx.
How It Is Wired
Execution starts at client/index.html → client/src/App.tsx. The app routes through account settings (client/src/core/accountSettings/index.tsx), modals (2FA: EnableTwoFAModal/index.tsx, QR login: QRLoginScannerModal/index.tsx), and personalization (FontFamilySelector, BgImageSelector). On the server, server/src/core/functions/database/PBService/index.ts is a cycle member with 10 inbound and 7 outbound imports. The most connected module is packages/lifeforge-ui/src/components/inputs/index with 33 outgoing imports and 1 importer, also in a cycle. The hub shared/src/index has 12 outbound imports and 4 inbound, with high instability. Fifty-six modules reside in circular dependencies overall. Databases are PocketBase (server/src/core/models/), and traineddata files (server/src/core/models/digits.traineddata, eng.traineddata) are large blobs over 5MB committed to the repo.
How To Use It
Setup: No lockfile is present (client/package.json has no bun.lock or d.lock equivalent). Install with pnpm install or bun install (bun is the lockfile format detected). The root bun.lock suggests Bun is the package manager.
Configuration: Environment variables are not explicitly named in the structure, but PocketBase connection details would likely live in client/package.json scripts or a .env file (not present in the detected files). The Docker setup uses docker/client/Dockerfile, docker/db/Dockerfile, and docker-compose.yaml.
Running it: Start the client with pnpm dev (inferred from Vite config) or bun run dev. Start the server with pnpm start or bun run start (scripts would be in root or client/package.json). The full stack is intended via docker-compose up --build.
Note: Exact run commands are not documented in the detected files; verify the root package.json scripts and client/package.json before assuming.
Real-World Use
A user self-hosts Lifeforge to consolidate calendar, tasks, notes, and personal analytics in one privacy-controlled dashboard. They enable two-factor authentication via client/src/core/accountSettings/modals/EnableTwoFAModal/index.tsx, which integrates QR code scanning (QRCodeDisplay.tsx) and OTP verification (OTPConfirmScreen.tsx). The module federation setup allows adding new feature modules (e.g., a new dashboard widget) without redeploying the entire host, though the CSS layering conflict documented in the README must be resolved before production use.
Code Health & Issues
The static analysis found 95 issues across 60 high, 35 medium, 0 low categories, plus 8 code health audit findings:
- [HIGH] Pin third-party GitHub Actions to a commit SHA -
.github/workflowsusesoven-sh/setup-bun@v2; a tag can move and run with your secrets. - [MEDIUM] Enable Dependabot or Renovate - 17 manifests, no update bot configured.
- [MEDIUM] Pin container base image by digest -
docker/client/Dockerfileusesoven/bun:alpine,nginx:alpinewithout digests. - [MEDIUM] Gate pull requests on dependency vulnerability scan - no scan in CI.
- [MEDIUM] Move large binaries to Git LFS -
server/src/core/models/digits.traineddata(10.8MB),eng.traineddata(5.0MB). - [MEDIUM] Add non-root USER to the image -
docker/client/Dockerfilehas no USER directive. - [MEDIUM] Expand the test suite - 1 test file against 642 source files (ratio 0.002).
- [LOW] Set timeout-minutes on workflow jobs -
build.ymldeclares no job timeout.
Additional structural concerns: dependency lockfile absent, causing non-reproducible builds; 56 modules in circular import dependencies; 448 duplicated 6-line blocks across 131 files; and the unresolved Tailwind CSS cascade conflict blocking further development.
The Bottom Line
This is a capable self-hosted life-organization platform with a modular architecture and solid Docker/ CI setup, but it is held back by missing dependency pinning, large binary bloat, circular import cycles, and a critical CSS architecture issue that prevents stable module federation. It is best suited for developers or teams comfortable fixing import cycles, upgrading CI gates, and migrating Tailwind configurations. Casual users should wait until PR #93 completes the component-based styling migration.