A modern, gamified attendance tracking platform for small teams. Staff submit, admin approves, and every present day plants a tree in your team's living forest.
π Try it live β Β· Report Bug Β· Request Feature
Tracking attendance shouldn't feel like a chore. Tally turns the boring grind into a delightful, motivating experience β your team's record is visualized as a living forest where every present day plants a tree, overtime adds a bonus glow, and absences leave withered stumps. The forest changes with the time of day, with a sun that arcs across the sky, twinkling stars at night, a flowing river, and butterflies that appear as your team thrives.
Built for office teams, interns, and small businesses that want a clean, modern, free alternative to enterprise time-tracking tools.
- π’ Multi-tenant workspaces β each admin owns a private workspace with full data isolation
- π₯ Role-based access β admins manage, staff submit; tight Firestore security rules enforce boundaries
- βοΈ Email-based staff invites β admin adds staff by email; they receive a "set your password" link and join in one click
- π Google sign-in for admins plus traditional email/password
- β±οΈ Check-in / check-out flow β staff clock in when they arrive, clock out when they leave; entry/exit times stored automatically
- π Full-year attendance calendar with intelligent day classification (on-time, late, early-out, etc.)
- β Admin approval workflow β staff submissions are pending until approved (or set workspace to auto-approve)
- ποΈ Date-range leave requests β staff request planned off days 3+ days in advance with reason; admin can mark off periods directly for any staff
- βοΈ Configurable per workspace β office hours, working days (MonβSat or MonβFri etc.), and a holiday calendar
- πΈ Photo uploads β company logo and staff profile photos via Cloudinary (free tier, no Firebase Storage required)
A unique gamified visualization that lives below every attendance calendar:
- π± Every present day plants a tree at a stable, seed-deterministic position
- π³ Tree size = hours worked ratio; arrive late or leave early β stunted tree
- β¨ Overtime grows oversized trees with a soft yellow glow
- πͺ΅ Absent days wither into dead trees; πͺ¨ planned off-days become stumps
- β³ Today's tree grows in real-time β checked in but not out? The tree gets bigger every 30 seconds with a pulsing emerald halo
- π¦ Wildlife appears as your forest thrives β butterflies, rabbits, deer
- π¦ Birds fly across the sky β count grows with healthier forests
- π Live day/night cycle β sun arcs from east to west, moon rises after dusk, stars twinkle at night, all driven by the actual system clock
- π Animated flowing river with shimmers and floating leaves drifting downstream
- π· Naturalistic ground β clustered grass, blooming flowers, and the occasional mushroom
- π¨ Clean, modern design inspired by Linear/Vercel
- π Smooth animations and live transitions
- π± Fully responsive
- π Inline toast notifications (no ugly browser alerts)
- β‘ Real-time Firestore subscriptions β no manual refresh needed
| Layer | Technology |
|---|---|
| Frontend | React 19, Vite 8, React Router 7 |
| Styling | Tailwind CSS 4, custom design tokens |
| Auth | Firebase Authentication (email/password + Google OAuth) |
| Database | Cloud Firestore with security rules |
| Image hosting | Cloudinary (unsigned upload preset) |
| Icons | Lucide React |
| Date handling | date-fns |
| Hosting | Vercel |
Add screenshots here after deployment
| Login | Dashboard | Calendar | Forest |
|---|---|---|---|
| TBD | TBD | TBD | TBD |
- Node.js 18+ (LTS recommended)
- A Firebase project (create one free)
- A Cloudinary account (sign up free)
git clone https://github.com/rajendra7169/attendance-system.git
cd attendance-system
npm install- Go to the Firebase Console β Add project
- Skip Google Analytics (optional)
- Build β Authentication β Get started
- Sign-in method tab β Enable Email/Password
- Enable the "Email link (passwordless sign-in)" toggle inside Email/Password (optional but recommended)
- Also enable Google provider β set support email β Save
- Build β Firestore Database β Create database
- Choose a region close to your users (e.g.
asia-south1) - Start in production mode (we'll apply our security rules next)
Paste the contents of firestore.rules into the Firestore β Rules tab and publish.
- Project Settings (gear icon) β Your apps β Web app β Register app
- Copy the
firebaseConfigvalues for the next step
- Sign up at cloudinary.com
- On the dashboard, copy your Cloud Name
- Settings β Upload β Upload presets β Add upload preset
- Signing Mode:
Unsigned(important β required for browser uploads) - Folder:
attendance-system(optional) - Save and copy the preset name
- Signing Mode:
Copy the example and fill in your values:
cp .env.example .env.localEdit .env.local:
# Firebase
VITE_FIREBASE_API_KEY=your_api_key
VITE_FIREBASE_AUTH_DOMAIN=your-project.firebaseapp.com
VITE_FIREBASE_PROJECT_ID=your-project
VITE_FIREBASE_STORAGE_BUCKET=your-project.appspot.com
VITE_FIREBASE_MESSAGING_SENDER_ID=123456789
VITE_FIREBASE_APP_ID=1:123456789:web:abcdef
# Cloudinary
VITE_CLOUDINARY_CLOUD_NAME=your_cloud_name
VITE_CLOUDINARY_UPLOAD_PRESET=your_preset_namenpm run devOpen http://localhost:5173. Click "Create one" to set up your first workspace.
attendance-system/
βββ public/ # Static assets
βββ src/
β βββ components/
β β βββ Calendar.jsx # Year calendar + attendance modal
β β βββ Forest.jsx # The living forest visualization
β β βββ Header.jsx # Top navigation with pending badge
β β βββ MemberCard.jsx # Staff card with attendance stats
β βββ context/
β β βββ AuthContext.jsx # User + workspace state with live subscriptions
β βββ hooks/
β β βββ useAuth.js
β βββ pages/
β β βββ Login.jsx # Unified email/password + Google sign-in
β β βββ Signup.jsx # Workspace creation
β β βββ Onboard.jsx # Post-Google sign-up workspace setup
β β βββ ResetPassword.jsx
β β βββ Dashboard.jsx # Admin + Staff dashboards
β β βββ MemberDetail.jsx # Staff profile + calendar + forest
β β βββ Admin.jsx # Company settings, staff, approvals
β βββ utils/
β β βββ firebase.js
β β βββ calendarUtils.js # Day classification, time math
β β βββ staffUtils.js # Invite, create, resend
β β βββ uploadImage.js # Cloudinary upload helper
β βββ App.jsx # Routes
β βββ main.jsx # Entry point
βββ firestore.rules # Production-ready security rules
βββ vercel.json # Vercel SPA routing config
βββ .env.example # Template for local env vars
βββ package.json
| Command | What it does |
|---|---|
npm run dev |
Start the Vite dev server at localhost:5173 |
npm run dev -- --host 0.0.0.0 |
Expose dev server to your LAN (test on other devices) |
npm run build |
Production build to dist/ |
npm run preview |
Serve the production build locally |
npm run lint |
Run ESLint |
The fastest path to production:
1. Push to GitHub (see Pushing this code below)
- Go to vercel.com/new β Import Git Repository
- Pick your
attendance-systemrepo - Vercel auto-detects Vite β no configuration needed
- Add environment variables (copy each
VITE_*from your.env.local) - Click Deploy
In the Firebase Console β Authentication β Settings β Authorized domains β Add domain β enter your Vercel URL (e.g. your-app.vercel.app) or custom domain.
For Google sign-in to work, also add your domain to the OAuth Web client in Google Cloud Console β Credentials:
- Authorized JavaScript origins β
https://your-domain - Authorized redirect URIs β
https://your-domain/__/auth/handler
That's it. Subsequent pushes to main auto-deploy in ~30 seconds.
Password-reset URL: No need to set this in the Firebase Console β Tally passes the current site's origin as the action URL on every reset call, so it works automatically across localhost, Vercel previews, and production.
In Vercel β your project β Settings β Domains β add tally.yourdomain.com (or any subdomain). Vercel auto-provisions SSL. Then re-add the custom domain to Firebase Authorized Domains and the Google Cloud OAuth client.
Drag-and-drop the dist/ folder after npm run build, or connect the GitHub repo. Add the same env vars in Site settings.
- Bulk CSV staff import
- Monthly attendance report export (PDF/CSV)
- Email notifications on approval / rejection
- Mobile native apps (React Native)
- Geofencing for office-based check-in
- Customizable forest themes (snowy winter, autumn, etc.)
- Achievement badges (perfect month, 100-day streak, etc.)
- Slack / WhatsApp integration
Contributions are very welcome. Whether it's a bug fix, a new feature, or improved docs:
- Fork the repo
- 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
For larger changes, please open an issue first to discuss the approach.
This project is licensed under the MIT License β see the LICENSE file for details.
You're free to use it in personal or commercial projects.
- Firebase for an excellent free auth + database tier
- Cloudinary for free image hosting
- Lucide for the beautiful icon set
- Tailwind CSS for making styling fun again
- date-fns for sane date handling
Rajendra Pandey
- GitHub: @rajendra7169
- Built with β and π³
β If you found this project useful, please consider giving it a star! β
Made with β€οΈ in Nepal