NEMESIS isn't just another productivity app—it's a complete reimagining of personal infrastructure. This is what happens when you combine:
- 🧠 A Developer's Obsession with clean architecture
- ⚔️ Stoic Philosophy applied to systems design
- 🔥 Gaming UI/UX sensibilities (think: Cyberpunk HUD meets Terminal)
- 📊 Enterprise-Grade data synchronization
Built for cognitive athletes who believe discipline scales through automation, not willpower. Your finances, habits, journal entries, and mental states—all rendered as queryable data structures in a cloud-native terminal interface.
|
|
╔══════════════════════════════════════════════════════════════════╗
║ NEMESIS VISUAL LANGUAGE ║
╠══════════════════════════════════════════════════════════════════╣
║ ║
║ 🎨 Catppuccin-Inspired Palettes (Dracula/Aura/Tokyo/Memento) ║
║ 🔠 JetBrains Mono (Terminal Monospace Everywhere) ║
║ 🪟 macOS-Style Window Controls (●●●) with Draggable Frames ║
║ 📐 Brutalist Grid Layouts (No Rounded Corners, Pure Function) ║
║ 🎯 Color-Coded by Intent: ║
║ • Green (#a6e3a1) → Income/Success/Completion ║
║ • Red (#f38ba8) → Expenses/Danger/Deletion ║
║ • Blue (#89b4fa) → Information/Tasks/Focus ║
║ • Mauve (#cba6f7) → Accent/Active/Primary Actions ║
║ • Yellow (#f9e2af) → Warnings/Time-Sensitive ║
║ ⚡ Zero Animations (Instant Feedback Only) ║
║ 🖱️ Hover States Only on Interactive Elements ║
║ ║
╚══════════════════════════════════════════════════════════════════╝
Your real-time command center. All subsystems aggregate here:
|
💰 WALLET
|
🎯 HABIT STATS
|
🧠 MOOD TRACKER
|
|
💧 HYDRATION
|
⏱️ FOCUS TIMER
|
🌬️ BREATHING
|
|
💭 DAILY QUOTE
|
✅ WELLNESS CHECKLIST
|
📈 CASHFLOW CHART
|
|
🎯 ACTIVE TASKS — Live habit summary | 💳 RECENT TRANSACTIONS — Last 5 financial events |
||
Track every rupee with database-level precision:
| Feature | Description |
|---|---|
| Transaction Ledger | Complete audit trail with category, date, notes, and delete capability |
| Expense Breakdown | Recharts pie chart showing category distribution |
| Savings Goal | Visual progress bar with editable target amount |
| Recurring Subscriptions | Monthly burn rate calculator (Netflix, Spotify, etc.) |
| Overall Finance Matrix | Multi-view analytics (All/Income/Expense/Subscription/Savings) |
| Smart Categorization | Auto-credit to savings account when category = "Savings" |
| Date Stamping | Historical timeline with ISO 8601 timestamps |
Example Workflow:
// Add expense → Auto-categorized → Firestore sync → Real-time update across all devices
const newTransaction = {
type: 'expense',
amount: 1500,
category: 'Groceries',
notes: 'Monthly stock-up',
date: new Date().toISOString()
}
StorageService.addFinance(userId, newTransaction);Because thoughts are data structures too:
- VIM Buffer Editor — Distraction-free writing (
INSERT MODEplaceholder) - Mood Scale (1-5) — Numerical tracking per entry
- History Archive — Chronological browser with delete option
- Mood Trend Chart — 7-day LineChart visualization
- Gratitude Log — Separate practice tracker (❤️ icon-labeled entries)
Why Vim-Inspired?
No WYSIWYG bloat. Just you, a textarea, and your thoughts. The interface gets out of your way.
Gamified consistency with anti-spam protection:
|
Streak System
Cooldown Protection
|
Consistency Grid
Process Manager
|
Anti-Cheat Measures:
// Can't spam-click the "EXECUTE" button
if (cooldowns[habitId] && cooldowns[habitId] > 0) return;
// Streak only increments if consecutive days
const isConsecutive = lastCompleted === yesterday || lastCompleted === today;
const newStreak = isConsecutive ? habit.streak + 1 : 1;Gemini AI Integration (Currently Stubbed for Firebase Architecture):
- Aggregates finances, journal, habits
- Natural language insight generation
- Weekly performance summaries
- 3-point actionable recommendations
Why Stubbed?
In production Firebase, AI calls should happen via Cloud Functions to avoid downloading entire collections to the client. The UI is fully built—just needs backend hookup.
| Setting | Options |
|---|---|
| Theme Selector | Dracula / Aura / Tokyo Night / Memento Mori |
| User Profile | Display UID, email, username |
| Password Manager | Secure credential updates with re-authentication |
| Data Purge | Nuclear option (Firebase deletion requires Cloud Function) |
Security Features:
- Re-authentication required for password changes
- Firebase Auth email/password flow
- Scoped Firestore rules (users can only access their own data)
graph TB
A[👤 User] -->|Firebase Auth| B[React App]
B -->|Real-time Listeners| C[Firestore]
C -->|onSnapshot| B
B -->|CRUD Operations| D[Storage Service]
D -->|Batched Writes| C
B -->|Widget Rendering| E[30+ Components]
E -->|Recharts| F[Data Visualization]
B -->|Gemini API| G[AI Insights]
C -->|Security Rules| H[User-Scoped Collections]
style B fill:#cba6f7,stroke:#89b4fa,stroke-width:3px,color:#000
style C fill:#89b4fa,stroke:#a6e3a1,stroke-width:2px,color:#000
style E fill:#a6e3a1,stroke:#f9e2af,stroke-width:2px,color:#000
Core:
React: 18.3.1
TypeScript: 5.8.3
Vite: 6.2.0
UI Framework:
Layout: React Grid Layout 1.4.4
Styling: Tailwind (via CDN)
Icons: Lucide React 0.294.0
Charts: Recharts 2.12.7
Fonts:
Primary: JetBrains Mono
Fallback: Monospace |
Cloud Services:
Database: Firestore (NoSQL)
Auth: Firebase Auth
Hosting: Firebase Hosting
Analytics: Firebase Analytics
State Management:
Method: Real-time Listeners
Subscriptions: onSnapshot()
Persistence: Cloud-first
Build & Deploy:
Build: Vite (esbuild)
Deploy: Firebase CLI |
| Pattern | Implementation |
|---|---|
| Real-time Sync | Firestore onSnapshot() listeners in useEffect hooks |
| Optimistic UI | Instant local updates → Firestore confirmation |
| Component Isolation | 30+ widgets in WidgetRegistry.tsx (zero cross-dependencies) |
| Type Safety | Strict TypeScript ("strict": true in tsconfig) |
| Custom Hooks | useUserId() for Firebase Auth state |
| Grid System | React Grid Layout with localStorage fallback |
| Security | Firestore rules: allow read, write: if request.auth.uid == userId |
🔍 Click to see Firestore schema
firestore/
│
├── 📁 users/{userId}/
│ │
│ ├── 📄 [user document]
│ │ ├── theme: string (dracula|aura|tokyo|memento)
│ │ └── settings: { notifications: bool, sound: bool }
│ │
│ ├── 📁 userData/
│ │ ├── layout
│ │ │ └── windows: WindowState[]
│ │ ├── savings
│ │ │ ├── goal: number
│ │ │ └── current: number
│ │ ├── gratitude
│ │ │ └── items: string[]
│ │ ├── wellnessConfig
│ │ │ └── items: string[]
│ │ └── sleep
│ │ └── lastHours: string | null
│ │
│ ├── 📁 finances/{financeId}
│ │ ├── type: 'income' | 'expense'
│ │ ├── amount: number
│ │ ├── category: string
│ │ ├── notes?: string
│ │ └── date: ISO8601 string
│ │
│ ├── 📁 journal/{journalId}
│ │ ├── mood: number (1-5)
│ │ ├── text: string
│ │ └── date: ISO8601 string
│ │
│ ├── 📁 habits/{habitId}
│ │ ├── name: string
│ │ ├── frequency: 'daily' | 'weekly'
│ │ ├── streak: number
│ │ ├── longestStreak: number
│ │ ├── lastCompletedDate: ISO8601 | null
│ │ └── history: ISO8601[]
│ │
│ ├── 📁 subscriptions/{subId}
│ │ ├── name: string
│ │ └── cost: number
│ │
│ ├── 📁 hydrationLog/{dateKey}
│ │ └── count: number
│ │
│ └── 📁 wellnessLog/{dateKey}
│ └── state: { [item: string]: boolean }
✅ Node.js >= 18.0.0
✅ npm >= 8.0.0
✅ Firebase CLI (npm install -g firebase-tools)
✅ Git📦 Step-by-Step Setup
# 1. Clone the repository
git clone https://github.com/yourusername/nemesis-os.git
cd nemesis-os
# 2. Install dependencies
npm install
# 3. Configure Firebase
# Create project at https://console.firebase.google.com/
# Enable: Authentication (Email/Password), Firestore, Hosting
# 4. Update Firebase config in services/firebase.ts
# Replace with your project credentials:
const firebaseConfig = {
apiKey: "YOUR_API_KEY",
authDomain: "your-project.firebaseapp.com",
projectId: "your-project-id",
storageBucket: "your-project.appspot.com",
messagingSenderId: "YOUR_SENDER_ID",
appId: "YOUR_APP_ID",
measurementId: "YOUR_MEASUREMENT_ID"
};
# 5. Set up Firestore Security Rules
firebase deploy --only firestore:rules
# 6. Start development server
npm run dev
# → http://localhost:3000
# 7. Build for production
npm run build
# 8. Deploy to Firebase Hosting
firebase login
firebase init hosting # Select 'dist' as public directory
firebase deploy🔒 Click to see production-ready rules
Create firestore.rules:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Helper function: Check if user is authenticated
function isAuthenticated() {
return request.auth != null;
}
// Helper function: Check if user owns the resource
function isOwner(userId) {
return request.auth.uid == userId;
}
// User profile documents
match /users/{userId} {
allow read, write: if isAuthenticated() && isOwner(userId);
// User subcollections (finances, journal, habits, etc.)
match /{subcollection}/{document=**} {
allow read, write: if isAuthenticated() && isOwner(userId);
}
}
}
}Deploy rules:
firebase deploy --only firestore:rules⚙️ Gemini AI Setup
Create .env.local:
VITE_GEMINI_API_KEY=your_gemini_api_key_hereGet your API key from Google AI Studio
Note: AI Insights currently stubbed for Firebase architecture. Production implementation requires Cloud Functions.
🗂️ Detailed File Tree
nemesis-os/
│
├── 📁 components/
│ ├── Sidebar.tsx # Left navigation dock with workspace switcher
│ ├── UIComponents.tsx # Reusable primitives:
│ │ # • Button (4 variants)
│ │ # • Input (with labels)
│ │ # • Card (with header/action slot)
│ │ # • Badge (4 color schemes)
│ ├── WindowFrame.tsx # Draggable window wrapper with:
│ │ # • macOS-style controls (●●●)
│ │ # • Maximize/minimize states
│ │ # • Resize handle (bottom-right)
│ └── WidgetRegistry.tsx # 30+ widgets organized by workspace:
│ # • Dashboard (10 widgets)
│ # • Finance (6 widgets)
│ # • Journal (4 widgets)
│ # • Habits (3 widgets)
│ # • Insights (1 widget)
│ # • Settings (1 widget)
│
├── 📁 pages/ (LEGACY - now widget-based)
│ ├── Dashboard.tsx
│ ├── Finance.tsx
│ ├── Journal.tsx
│ ├── Habits.tsx
│ ├── Insights.tsx
│ └── Settings.tsx
│
├── 📁 services/
│ ├── firebase.ts # Firebase initialization
│ │ # • initializeApp()
│ │ # • getAuth(), getFirestore()
│ │ # • getAnalytics()
│ ├── storageService.ts # Firestore CRUD operations:
│ │ # • subscribeToFinances()
│ │ # • addJournal()
│ │ # • updateHabit()
│ │ # • saveLayout()
│ │ # • 20+ methods
│ └── geminiService.ts # AI integration (stubbed)
│
├── 📄 types.ts # TypeScript interfaces:
│ # • WindowState
│ # • FinanceData
│ # • Habit
│ # • JournalEntry
│ # • 10+ more
│
├── 📄 App.tsx # Main window manager:
│ # • Auth state management
│ # • Grid layout controller
│ # • Workspace switcher
│ # • Theme applier
│
├── 📄 index.tsx # React DOM renderer
├── 📄 index.html # HTML shell with:
│ # • Tailwind CDN
│ # • JetBrains Mono font
│ # • CSS variable themes
│ # • Import maps for ESM
│
├── 📄 vite.config.ts # Build configuration
├── 📄 tsconfig.json # TypeScript strict mode
├── 📄 firebase.json # Firebase Hosting config
├── 📄 .firebaserc # Firebase project link
├── 📄 firestore.rules # Security rules
├── 📄 firestore.indexes.json # Composite indexes (none needed)
└── 📄 package.json # Dependencies & scripts
📊 Financial Tracking
// Morning Routine
1. Finance → ADD_ENTRY widget
2. Select type: EXPENSE / INCOME
3. Enter amount: 500
4. Category: "Coffee"
5. Note: "Starbucks - morning meeting"
6. Date: Auto-filled (today)
7. COMMIT RECORD
↓
Real-time sync to Firestore
↓
LEDGER.CSV updates instantly
↓
EXPENSE_MATRIX pie chart recalculates
↓
WALLET widget shows new balancePro Tip: Use category "Savings" to auto-credit your savings goal!
⚡ Habit Execution
// Evening Check-In
1. Habits → ACTIVE_PROTOCOLS widget
2. Find today's protocols (e.g., "Read 10 pages")
3. Click EXECUTE button
↓
Streak increments (+1)
↓
5-second cooldown activates
↓
CONSISTENCY_GRID updates (green square for today)
↓
Dashboard → HABIT_STATS refreshes (% completion)Anti-Cheat: Can't spam EXECUTE. Cooldown + midnight validation prevents abuse.
📖 Journal Entry
// Night Reflection
1. Journal → VIM_BUFFER widget
2. Select mood: 1-5 scale (1=bad, 5=great)
3. Write entry in textarea ("INSERT MODE")
4. Click WRITE AND QUIT
↓
Timestamped entry saved
↓
HISTORY widget shows chronological list
↓
MOOD_TREND chart updates 7-day line graphVim Inspiration: No formatting tools. Just raw text. Gets out of your way.
| Shortcut | Action |
|---|---|
Enter |
Submit forms (Add Entry, New Habit, etc.) |
Esc |
Close maximized windows (coming soon) |
Ctrl + S |
Save journal entry (coming soon) |
| Feature | Implementation |
|---|---|
| 🔒 Authentication | Firebase Auth (OAuth 2.0 + bcrypt password hashing) |
| 🗃️ Database Rules | Scoped Firestore: userId == request.auth.uid |
| 🔑 Password Management | Re-authentication required for updates |
| 🚫 No Third-Party Tracking | Zero analytics SDKs (optional Firebase Analytics) |
| 📱 Cross-Device Sync | HTTPS-only communication |
| 💾 Data Ownership | You control the Firebase project |
| 🗑️ Right to Delete | Full account purge via Settings (requires Cloud Function) |
Privacy Guarantee:
NEMESIS doesn't sell data. We don't even have your data—it's in your Firebase project. Open-source = full transparency.
Note: Replace placeholder images with actual screenshots
|
|
|
|
Want something specific? Open an issue with:
- 🎯 Use Case — Why you need it
- 💡 Proposed Solution — How it should work
- 🎨 UI Mockup — Visual reference (optional)
NEMESIS is 100% open-source. PRs are welcome for:
|
🐛 Bug Fixes
|
✨ New Features
|
⚡ Optimizations
|
📋 Contribution Checklist
Before Submitting:
- Code follows existing style (PascalCase components, camelCase functions)
- TypeScript strict mode passes (
no 'any' types) - Firestore operations tested in isolation
- No
console.log()left in production code - Widget is self-contained (no cross-widget state dependencies)
- Changes documented in PR description
Preferred PR Format:
## 🎯 Problem
[Describe the issue or feature gap]
## ✅ Solution
[Explain your implementation]
## 🖼️ Screenshots (if UI change)
[Before/After images]
## 🧪 Testing Done
- [ ] Local dev server (`npm run dev`)
- [ ] Production build (`npm run build`)
- [ ] Firebase emulator (if Firestore changes)Looking to contribute? Start here:
- 🟢 Add new theme palette
- 🟢 Create hydration reminder notification
- 🟢 Build CSV export feature
- 🟢 Implement keyboard shortcuts
MIT License
Copyright (c) 2026 NEMESIS Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
TL;DR: Do whatever you want. Just don't sue us.
|
|
- Catppuccin — For the color palette that started a revolution
- Dracula Theme — For proving dark mode is superior
- i3wm — For tiling window manager philosophy
- Cyberpunk 2077 — For HUD design that looks like the future
- Neovim — For terminal aesthetics and Vim keybindings
- r/productivity — For constant debates on systems vs habits
- Hacker News — For bikeshedding about Firebase vs Supabase
- IndieHackers — For proving you don't need VC funding
- GitHub Community — For showing that open source still wins
|
Found a bug? Firestore not syncing? |
Have an idea? Want a new widget? |
Need private support? |
╔════════════════════════════════════════════════════════════════════╗
║ ║
║ "The best time to plant a tree was 20 years ago. ║
║ The second best time is now. ║
║ The third best time is right after you deploy NEMESIS." ║
║ ║
║ — Ancient Developer Proverb ║
║ ║
╚════════════════════════════════════════════════════════════════════╝
Current Status: [ PRODUCTION READY ] | Version: v1.0.0 | Last Updated: January 2026
Made for the 1% who read READMEs all the way to the end. You're one of us now.