The Premium, Privacy-First Personal Ledger & Budget Tracker for the Ethiopian Financial Ecosystem
BirrTu is a privacy-first, offline-first personal financial ledger tailored precisely for the modern Ethiopian banking and mobile wallet ecosystem. Engineered to run entirely within your browser's sandboxed environment, BirrTu bypasses centralized databases and remote trackers, keeping 100% of your financial logs securely stored on your physical device.
For users seeking seamless multi-device persistence, BirrTu supports isolated, secure backups directly to your private, hidden Google Drive AppData directory.
Your transaction ledgers and balance histories reside entirely inside standard client-side IndexedDB storage. No backend trackers can harvest, trace, or leak your financial details.
Zero-setup presets custom-styled for key financial platforms in Ethiopia:
- Commercial Bank of Ethiopia (CBE)
- Telebirr
- CBE Birr
- Awash Bank
- Dashen Bank / Hibret Bank / COOP / Cooperative Bank of Oromia
- Physical Cash Pouches
Organize your life into independent financial scopes (e.g., Personal, Freelance Business, Family Household) and swap between workspaces with zero friction.
☁️ Secure, Hidden Google Drive Sync
Signed-in workspaces sync automatically through independent, per-device journals
inside your Google Account's hidden appDataFolder. Wallets, transactions,
settings, deletion tombstones, and portable PIN verifiers are merged only with
records carrying the same stable workspace identity. Guest workspaces remain
local-only.
Interactive financial breakdown charts, dynamic spending category rings, and monthly budget trajectory trends to help you monitor cash flow at a glance.
Generate clean, official PDF bank ledger reports or download your complete database as raw JSON files for cold, offline archives.
┌────────────────────────────────────────────────────────┐
│ React 19 View Layer │
└───────────────┬────────────────────────┬───────────────┘
│ │
┌────────────────▼────────────────┐ ┌▼──────────────────────────────┐
│ IndexedDB Storage (idb) │ │ Google Drive Integration │
│ (Transactions, Wallets) │ │ (Encrypted Cloud Sync App) │
└─────────────────────────────────┘ └───────────────────────────────┘
- Frontend Core: React 19 + TypeScript (strict types)
- Bundler: Vite 6 + Tailwind CSS CSS-in-JS configuration
- Animation Suite:
motion(Framer Motion API wrapper) - Storage Subsystem: Local browser IndexedDB (wrapped cleanly using the
idbclient helper library) - Visual Analytics: Recharts Engine
- Report Generation: jsPDF client compiler
Ensure you have Node.js v18+ and npm v9+ installed on your workstation.
git clone https://github.com/BirtuCan-Software/birrtu-app.git
cd birrtu-appnpm installThe app reads Firebase settings directly from Vite env vars, so put your project values in .env.development for local work and .env.production for production builds:
# Local Server URL
APP_URL="https://ais-dev-7wb32p6p2vg5tfn7gykhvh-58167563393.europe-west1.run.app"
# Firebase Web Client Credentials (Development)
VITE_FIREBASE_API_KEY="your_firebase_api_key"
VITE_FIREBASE_AUTH_DOMAIN="your_firebase_auth_domain"
VITE_FIREBASE_PROJECT_ID="your_firebase_project_id"
VITE_FIREBASE_STORAGE_BUCKET="your_firebase_storage_bucket"
VITE_FIREBASE_MESSAGING_SENDER_ID="your_firebase_messaging_sender_id"
VITE_FIREBASE_APP_ID="your_firebase_app_id"
# Google Identity Services OAuth web client (for Drive reconnection)
VITE_GOOGLE_CLIENT_ID="your_google_oauth_web_client_id"If you want to override values locally without touching tracked files, create an ignored .env.local file.
npm run devOpen http://localhost:3000 in your web browser.
npm run buildOptimized assets compile in the /dist directory.
Since BirrTu is built entirely as a Single Page Application (SPA), it does not require an active Node.js server in production. You can host it on any standard Apache web server.
- Build the Assets: Run
npm run buildon your machine. - Compress files: Compress the contents of the generated
/distfolder directly into a.zipfile (e.g.,birrtu-release.zip). Ensureindex.htmlresides at the root of the .zip folder. - Upload to File Manager: Log in to your cPanel File Manager and upload your
.zipdirectly into the web root (usuallypublic_htmlor a mapped subdomain directory). - Extract: Extract the uploaded
.zipfolder. - Dynamic Fallback Routing (.htaccess): Since React uses client-side routing, manual page reloads (e.g. hitting refresh on
/settings) will yield a 404 error from Apache. To bypass this, create or open a.htaccessfile in your root folder and add this fallback rule:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>.env.developmentis explicitly tracked in Git to provide immediate onboarding profiles..env.productionis strictly blocked in.gitignoreto prevent any production secrets leakage.- Firebase config is read from those env files directly; no separate
firebase-applet-config.jsonis used. .gitignoreis fully audited to skip node modules, log streams, localized configurations, and editor settings.
To bind your directory and commit to the remote repository, run:
git init
git add .
git commit -m "Initial Commit: BirrTu Premium Offline Financial Ledger"
git branch -M main
git remote add origin https://github.com/BirtuCan-Software/birrtu-app.git
git push -u origin mainLicensed under the MIT License. Created with care by the team at BirtuCan Software. All rights reserved.
