Your AI-powered life planner. Track anything, your way.
lifora-promo.mp4
Lifora is a free, open-source personal planner to track your daily life -- gym, work, habits, finances, study, and more. Describe anything you want to track in plain language and AI builds the section for you. Self-hostable, no subscription needed.
- Gym -- Daily attendance tracker with configurable weekly goals
- Work -- Multi-job hour tracking, earnings calculator, expense & route logging
- Habits -- Daily habit tracking with streaks and custom colors
- Finances -- Expense categories, monthly bills, reimbursement tracking
- Study -- Subject-based session logging, homework, grades & academic items
- Hobbies -- Project management and time tracking for hobbies
- Housework -- Chore tracking with recurring tasks
- Health -- Water intake, sleep, weight, and mood logging
- Goals -- Goal setting with milestones across personal, career, health & financial categories
- Reading -- Book tracking with progress, ratings, and notes
- Journal -- Daily journal entries with mood tracking
- Shopping -- Shopping lists with quantities and prices
- Meal Prep -- Weekly meal planning by day and meal type
All sections are toggleable per user. Enable only what you need.
Share any section (or a specific job within Work) with a supervisor, manager, or collaborator. Two access modes:
- Magic link -- generate a URL anyone can open to view your data read-only, no account required
- Account-based -- invite by email, the shared section appears in their "Shared with me" sidebar
Sharing is managed in Settings > Sharing. You can set optional expiry dates, revoke access anytime, and track who has access. Email invitations are sent via Resend.
Export any section's data as a .xlsx file -- built-in sections and custom sections alike. Each section page has a download button in the header. Custom sections use their field definitions as column headers automatically.
Beyond the built-in sections, users can describe any activity in natural language (e.g., "I resell monitors on Facebook Marketplace") and the AI generates a fully custom tracking section with smart fields, formulas, and the right view type.
How it works:
- User describes what they want to track during onboarding or setup.
- Semantic search runs against a shared template pool using vector embeddings. The user's prompt is converted to a 1536-dimensional vector (via OpenAI
text-embedding-3-small) and compared against existing templates stored in MongoDB Atlas Vector Search. - Match decision based on cosine similarity score:
- Strong match (>= 0.85): The proven template is reused instantly -- no AI call needed, zero latency. Usage count is incremented.
- Weak match (0.70 - 0.84): Existing templates (including their layout HTML) are passed as inspiration, and the AI generates a tailored version.
- No match (< 0.70): The AI generates an entirely new section from scratch using a field-analysis system that picks the right layout structure based on field composition.
- Save & deduplicate: After generation, an embedding is computed for the output template and compared to the source:
- If the fork is significantly different (cosine distance > threshold), it's saved as a new template with a
forkedFromreference. - If it's essentially the same, the source template's usage count is incremented instead.
- If the fork is significantly different (cosine distance > threshold), it's saved as a new template with a
- Usage-based ranking: Search results are weighted by usage count, so the best templates naturally rise to the top over time.
The result: The first user to request "dog breeding tracker" triggers a full AI generation. The next user who asks for something similar gets a faster, proven template that's adapted to their needs. The shared pool gets smarter with every user.
User Prompt
│
▼
Generate Embedding (OpenAI text-embedding-3-small)
│
▼
Vector Search (MongoDB Atlas) ──► Top 3 matches by cosine similarity
│
├── Score >= 0.85 ──► Instant Reuse (no AI call, proven template)
├── Score 0.70-0.84 ──► Use as Inspiration (AI generates informed by matches)
└── Score < 0.70 ──► Generate from Scratch (field-analysis-driven AI generation)
│
▼
Deduplicate (compare output embedding to source)
│
├── Different enough ──► Save as new template
└── Too similar ──► Increment usage count on source
│
▼
User gets their custom section
- Framework: Next.js 16 (App Router)
- Database: MongoDB with Mongoose
- Auth: NextAuth v5 (credentials + Google OAuth)
- Styling: Tailwind CSS 4, CSS custom properties, Framer Motion
- Email: Resend (share invitations)
- Export: ExcelJS (
.xlsxgeneration) - AI: Mistral, Claude, Gemini, OpenAI (multi-provider, user-configurable)
- Deployment: Vercel
- Node.js 20+
- pnpm (recommended) or npm
- MongoDB (local instance or MongoDB Atlas)
- Clone the repository:
git clone https://github.com/TemaDeveloper/personal_planner.git
cd personal_planner- Install dependencies:
pnpm install- Create a
.env.localfile:
MONGODB_URI=mongodb://localhost:27017/personal_planner
NEXTAUTH_SECRET=your-secret-key
NEXTAUTH_URL=http://localhost:3000
# AI-powered onboarding (free Mistral API key from console.mistral.ai)
MISTRAL_API_KEY=your-mistral-api-key
# Optional: Shared template pool with semantic search (platform.openai.com)
OPENAI_API_KEY=your-openai-api-key
# Optional: Google OAuth
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
# Optional: Email invitations for sharing (resend.com)
RESEND_API_KEY=- Start the development server:
pnpm devOpen http://localhost:3000 to start using Lifora.
The easiest way to deploy is with Vercel:
- Push your repo to GitHub
- Import the project on Vercel
- Add your environment variables (
MONGODB_URI,NEXTAUTH_SECRET,MISTRAL_API_KEY,OPENAI_API_KEY,RESEND_API_KEY, Google OAuth vars) - Deploy
If you want the shared template pool to work, create a vector search index in your MongoDB Atlas cluster:
- Go to Atlas console -> your cluster -> Atlas Search tab
- Click Create Search Index -> select Atlas Vector Search
- Database:
personal-planner, Collection:sectiontemplates - Index name:
section_template_embeddings - Use the visual editor to add:
- Field
embedding: type vector, dimensions 1536, similarity cosine - Filter field
isShared
- Field
- Click Create
To backfill embeddings for existing templates:
npx tsx src/lib/scripts/backfill-embeddings.tsWithout the index or OPENAI_API_KEY, the app still works — it just generates every section from scratch without searching the shared pool.
Contributions are welcome! See CONTRIBUTING.md for guidelines on setting up the dev environment, code conventions, and the PR process.
This project is licensed under the MIT License. See LICENSE for details.