A modern, intelligent web-based money tracker designed specifically for college students to manage their finances effortlessly.
salin (Bisaya word for "remaining" -- in this context, remaining balance/money) is a Progressive Web App (PWA) that helps college students track their daily expenses, monitor their budgets, and gain insights into their spending habits. Built with simplicity and efficiency in mind, Salin provides an intuitive interface for managing multiple accounts, categorizing transactions, and even parsing transaction details from text using AI.
- Student-Focused: Designed with the needs of college students in mind
- Privacy-First: Your financial data stays secure with Supabase authentication
- Intelligent Parsing: AI-powered transaction parsing using Google Gemini
- Multi-Account: Track multiple accounts (cash, bank cards, digital wallets)
- Budget Tracking: Set and monitor budgets by category
- Offline-Ready: Works offline as a PWA with service worker caching
- Mobile-First: Responsive design optimized for mobile devices
- Create and manage multiple accounts (Cash, Bank, E-Wallet)
- Real-time balance tracking
- Account type categorization with custom icons
- Add income and expense transactions
- Edit and delete transactions with balance recalculation
- Search and filter transactions by date, type, or category
- Transaction history with detailed view
- Pre-defined categories (Food, Transportation, Shopping, etc.)
- Custom category creation
- Category-based spending analysis
- Visual indicators with emojis
- Set monthly budgets by category
- Real-time budget progress tracking
- Visual alerts for budget thresholds
- Spending analytics and insights
- Parse transaction details from text using Google Gemini
- Automatic extraction of:
- Transaction amount
- Description/title
- Category
- Date
- Review and edit parsed transactions before saving
- Quick overview of all accounts
- Recent transactions
- Budget summaries
- Spending insights
- Send feedback directly to developers
- Secure email/password authentication
- Password reset functionality
- JWT-based session management
- Protected routes and API endpoints
- In-app feedback form
- Multiple feedback types (Bug, Feature, Improvement, General)
- Email notifications via Resend API
- User-friendly modal interface
Salin follows a modern client-server architecture:
┌─────────────────────────────────────────────┐
│ Client (Vanilla JS PWA) │
│ ┌─────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ Pages │ │Components│ │Service Worker│ │
│ └─────────┘ └──────────┘ └──────────────┘ │
└─────────────────┬───────────────────────────┘
│ HTTP/REST API
┌─────────────────▼───────────────────────────┐
│ Backend (Node.js/Express) │
│ ┌───────────┐ ┌──────────┐ ┌─────────────┐ │
│ │Controllers│ │Middleware│ │ Services │ │
│ └───────────┘ └──────────┘ └─────────────┘ │
└─────────────────┬───────────────────────────┘
│
┌─────────┴──────────┐
│ │
┌───────▼────────┐ ┌────────▼────────┐
│ Supabase │ │ Google Gemini │
│ (PostgreSQL) │ │ (AI Parsing) │
└────────────────┘ └─────────────────┘
Frontend:
- Vanilla JavaScript (ES6+ modules)
- HTML5 & CSS3
- Service Worker for PWA functionality
- Local Storage for offline data
Backend:
- Node.js with Express 5.x
- RESTful API architecture
- JWT authentication
- Serverless deployment (Netlify Functions)
Database & Services:
- Supabase (PostgreSQL with Row Level Security)
- Google Gemini API (AI text parsing)
- Resend (Email notifications)
Deployment:
- Netlify (Frontend & Serverless Functions)
- GitHub Actions for CI/CD
- Node.js v18 or higher
- npm or yarn
- Supabase account
- Google Gemini API key (optional, for parsing feature)
- Resend API key (optional, for feedback emails)
-
Clone the repository
git clone https://github.com/rolpppp/salin.git cd salin -
Install dependencies
npm install
-
Set up environment variables
Create a
.envfile in the root directory:# Supabase Configuration SUPABASE_URL=your_supabase_url SUPABASE_SERVICE_KEY=your_service_key SUPABASE_ANON_KEY=your_anon_key # JWT Secret JWT_SECRET=your_jwt_secret # Google Gemini (Optional) GEMINI_API_KEY=your_gemini_api_key # Server Configuration PORT=3000 CLIENT_URL=http://localhost:8080 # Resend Email (Optional) RESEND_API_KEY=your_resend_api_key RESEND_FROM_EMAIL=Salin Feedback <onboarding@resend.dev> FEEDBACK_EMAIL=your_email@example.com
-
Set up Supabase database
Run the SQL migrations in your Supabase SQL Editor:
- Create tables for users, accounts, categories, transactions, and budgets
- Set up Row Level Security policies
- Create database triggers for balance updates
-
Run the development server
npm run dev
This will start:
- Backend API on
http://localhost:3000 - Frontend client on
http://localhost:8080
- Backend API on
-
Open the app
Navigate to
http://localhost:8080in your browser
salin/
├── api/ # Backend API
│ ├── index.js # Main entry point & serverless handler
│ └── _app/
│ ├── config/ # Configuration files
│ │ └── supabase.js # Supabase client setup
│ ├── controllers/ # Request handlers
│ │ ├── auth.controller.js
│ │ ├── account.controller.js
│ │ ├── transaction.controller.js
│ │ ├── category.controller.js
│ │ ├── budget.controller.js
│ │ ├── dashboard.controller.js
│ │ ├── parsing.controller.js
│ │ ├── feedback.controller.js
│ │ └── user.controller.js
│ ├── middleware/ # Express middleware
│ │ └── auth.js # JWT authentication
│ ├── routes/ # API routes
│ │ ├── auth.routes.js
│ │ ├── account.routes.js
│ │ ├── transaction.routes.js
│ │ ├── category.routes.js
│ │ ├── budget.routes.js
│ │ ├── dashboard.routes.js
│ │ ├── parsing.routes.js
│ │ └── feedback.routes.js
│ └── services/ # Business logic services
│ ├── email.service.js
│ └── gemini.services.js
│
├── client/ # Frontend application
│ └── public/
│ ├── index.html # Main HTML entry
│ ├── manifest.json # PWA manifest
│ ├── sw.js # Service worker
│ ├── assets/ # Static assets
│ │ ├── icons/ # App icons
│ │ └── svg/ # SVG images
│ └── src/
│ ├── js/
│ │ ├── app.js # Main app logic & router
│ │ ├── api.js # API client
│ │ ├── utils.js # Utility functions
│ │ ├── components/ # Reusable components
│ │ │ ├── BudgetForm.js
│ │ │ ├── FeedbackForm.js
│ │ │ ├── Modal.js
│ │ │ ├── ParseReview.js
│ │ │ ├── Toast.js
│ │ │ └── TransactionForm.js
│ │ └── pages/ # Page modules
│ │ ├── dashboard.js
│ │ ├── account.js
│ │ ├── categories.js
│ │ ├── transaction.js
│ │ ├── onboarding.js
│ │ └── auth/
│ │ ├── login.js
│ │ ├── callback.js
│ │ ├── forgotPassword.js
│ │ └── resetPassword.js
│ └── styles/
│ ├── main.css # Main styles
│ ├── reset.css # CSS reset
│ └── variables.css # CSS variables
│
├── .env # Environment variables (not in git)
├── .env.example # Example env file
├── netlify.toml # Netlify configuration
├── package.json # Dependencies & scripts
└── README.md # This file
# Start production server
npm start
# Start development server with auto-reload
npm run server
# Start client with live-server
npm run client
# Run both server and client concurrently
npm run dev
# Format code with Prettier
npm run formatPOST /api/auth/signup- Create new accountPOST /api/auth/login- Login userPOST /api/auth/request-password-reset- Request password resetPOST /api/auth/reset-password- Reset password
GET /api/user- Get current user profilePUT /api/user- Update user profile
GET /api/accounts- Get all user accountsPOST /api/accounts- Create new accountPUT /api/accounts/:id- Update accountDELETE /api/accounts/:id- Delete account
GET /api/transactions- Get all transactions (with filters)GET /api/transactions/:id- Get single transactionPOST /api/transactions- Create transactionPUT /api/transactions/:id- Update transactionDELETE /api/transactions/:id- Delete transaction
GET /api/categories- Get all categoriesPOST /api/categories- Create categoryPUT /api/categories/:id- Update categoryDELETE /api/categories/:id- Delete category
GET /api/budgets- Get all budgetsPOST /api/budgets- Create budgetPUT /api/budgets/:id- Update budgetDELETE /api/budgets/:id- Delete budget
GET /api/dashboard- Get dashboard data
POST /api/parsing/parse-text- Parse transaction from text
POST /api/feedback- Submit feedback
Key Tables:
users- User profiles (synced with Supabase Auth)accounts- User financial accountscategories- Transaction categoriestransactions- Income/expense recordsbudgets- Budget allocations
Features:
- Row Level Security (RLS) policies
- Database triggers for automatic balance updates
- Indexes for query optimization
- Foreign key constraints for data integrity
- Create a controller in
api/_app/controllers/ - Define routes in
api/_app/routes/ - Register routes in
api/index.js - Create frontend page/component in
client/public/src/js/ - Update router in
client/public/src/js/app.js - Add API client methods in
client/public/src/js/api.js
- Use ES6+ features (arrow functions, async/await, destructuring)
- Follow modular architecture
- Write descriptive commit messages
- Use Prettier for code formatting
- Keep functions small and focused
- Add JSDoc comments for complex functions
- Start the dev server:
npm run dev - Test authentication flow
- Test all CRUD operations
- Test offline functionality (disable network in DevTools)
- Test on mobile viewport
- Check console for errors
Automatic Deployment:
- Push to
mainbranch triggers Netlify deployment - Build time: ~1-2 minutes
- Environment variables configured in Netlify dashboard
Manual Deployment:
# Install Netlify CLI
npm install -g netlify-cli
# Deploy to Netlify
netlify deploy --prodSet these in Netlify dashboard:
SUPABASE_URLSUPABASE_SERVICE_KEYSUPABASE_ANON_KEYJWT_SECRETGEMINI_API_KEY(optional)RESEND_API_KEY(optional)RESEND_FROM_EMAIL(optional)FEEDBACK_EMAIL(optional)
Backend Issues:
- Check Netlify function logs
- Add
console.logstatements - Test endpoints with Postman/curl
- Verify environment variables
Frontend Issues:
- Open browser DevTools Console
- Check Network tab for API calls
- Verify token in localStorage
- Test in incognito mode
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
502 Bad Gateway on Netlify:
- Check if all required environment variables are set
- Verify Supabase credentials are correct
- Check function logs in Netlify dashboard
Authentication not working:
- Verify JWT_SECRET is set
- Check token expiration
- Clear localStorage and try again
Transactions not updating balance:
- Check database triggers are enabled
- Verify RLS policies allow the operation
- Check console for SQL errors
AI Parsing not working:
- Verify GEMINI_API_KEY is valid
- Check API quota limits
- Test with simpler text input
This project is licensed under the MIT License - see the LICENSE file for details.
- Supabase - Backend as a Service
- Google Gemini - AI-powered text parsing
- Resend - Email API
- Netlify - Hosting and deployment
- Feather Icons - Beautiful open-source icons
For issues, questions, or suggestions:
- Open an issue
- Use the feedback form in the app
- Contact: proj.salin@gmail.com
Made with ❤️ for college students managing their finances