A personal finance workspace that makes budgeting feel calm instead of chaotic.
Summary
Financcino is a full-stack personal finance application that lets users log expenses, upload and process receipts, set budgets, and get spending insights through analytics dashboards and an AI chatbot. It's the most security- and backend-hardened project in the portfolio set, with rate limiting, security headers, and structured input validation already in place — details that matter a lot for a finance-adjacent app and are worth highlighting explicitly.
Problem
Logging expenses by hand is tedious enough that most people stop doing it within weeks.Receipts pile up physically or in photo albums with no structured way to extract the data.Without categorized analytics, people can see that they overspent, but not where or why.Budgeting tools rarely connect budget limits to real-time actual spending in a way that's visible before the money's already gone.
Solution
Structured expense logging — add, edit, delete, and categorize expenses (Food, Transport, Utilities, etc.), filterable by date/category/amount.Receipt upload and processing — image upload (via Multer) with OCR-based automatic expense extraction, removing manual entry for anything with a receipt.Budget management — set per-category budget limits with budget-vs-actual comparison and alerts, so overspending is visible before it happens, not after.Analytics dashboards — interactive Recharts-based visualizations for category breakdowns and monthly/yearly trends.AI chatbot — financial advice and spending-pattern analysis based on the user's own logged data, rather than generic tips.Security-first backend — Helmet security headers, express-rate-limit, express-validator input validation, and JWT + Clerk auth, which matters more here than in most portfolio projects since the data is financial.
Features
Architecture
Frontend
Backend
Database
DevOps & Tooling
Financcino follows a secure MERN architecture where a React + Vite frontend communicates with a security-hardened Express.js backend through REST APIs for all financial operations.
Users authenticate using Clerk, which manages secure sign-in, session handling, and protected access before requests reach the backend.
Authenticated requests are validated through JWT middleware, while Helmet, Express Rate Limiting, and Express Validator provide layered protection against common security threats and invalid input.
The backend routes requests through dedicated controllers for authentication, expenses, categories, receipts, analytics, chatbot, and budget management, keeping business logic modular and maintainable.
Expense receipts are uploaded through a Multer-based file processing pipeline, where OCR extracts structured transaction data that can be reviewed and stored as expense records.
Mongoose models interact with MongoDB to manage users, expenses, categories, receipts, budgets, transactions, and analytics, ensuring efficient data persistence and retrieval.
The React frontend updates dashboards, expense tracking, analytics charts, and chatbot interactions dynamically using REST APIs, Context API, and custom hooks without requiring page reloads.
This layered architecture separates authentication, security, business logic, file processing, and data persistence, resulting in a scalable, secure, and maintainable personal finance platform.
Key code
router.post("/api/transactions", requireAuth, async (req, res) => {
const { amount, category, description, date } = req.body;
const transaction = await db.transactions.create({
userId: req.auth.userId,
amount,
category,
description,
date: new Date(date),
});
// Auto-update budget coaching
const budget = await db.budgets.findByUserAndCategory(
req.auth.userId, category
);
if (budget && budget.spent + amount > budget.limit) {
transaction.coaching = {
type: "warning",
message: `You've used ${Math.round(((budget.spent + amount) / budget.limit) * 100)}% of your ${category} budget.`
};
}
res.json({ transaction });
});Results
Achieved a Lighthouse Performance score of 90/100
Scored 96/100 for Accessibility and 100/100 for SEO
First Contentful Paint (FCP): 0.9 s
Largest Contentful Paint (LCP): 1.6 s