Blame
|
1 | # π Employee Hour Tracker |
||||||
| 2 | ||||||||
|
3 | > A badass web app to monitor employees entering their time, serve up real-time analytics, and automate your backups β so you can stop worrying and focus on getting sh*t done. |
||||||
|
4 | |||||||
| 5 |  |
|||||||
| 6 |  |
|||||||
| 7 |  |
|||||||
| 8 |  |
|||||||
|
9 |  |
||||||
|
10 | |||||||
|
11 | --- |
||||||
| 12 | ||||||||
|
13 | <details> |
||||||
| 14 | <summary><i>Click to show screenshots</i></summary> |
|||||||
| 15 | ||||||||
|
16 | ## Screenshots |
||||||
| 17 |  |
|||||||
| 18 | [](./Screenshot_2025-08-08_at_4.03.27_PM.png) |
|||||||
| 19 | [](./Screenshot_2025-08-08_at_4.03.54_PM.png) |
|||||||
| 20 | [](./Screenshot_2025-08-08_at_4.05.46_PM.png) |
|||||||
| 21 | ||||||||
|
22 | </details> |
||||||
|
23 | |||||||
|
24 | --- |
||||||
| 25 | ||||||||
|
26 | ## β¨ Features |
||||||
| 27 | ||||||||
|
28 | ### π
**Time Tracking (A.K.A. Keeping Tabs on Your Squad)** |
||||||
| 29 | ||||||||
| 30 | - Weekly grid interface sharp enough to make spreadsheets cry |
|||||||
| 31 | - Click once? Log it. Twice? Flag it. Thrice? Fix-it mode, baby |
|||||||
| 32 | - Built-in calendar picker so you don't fat-finger the wrong week |
|||||||
| 33 | - Default week your way β past, present, or hell, even the future |
|||||||
| 34 | - No βSaveβ button needed β everything saves itself like grown-up software |
|||||||
|
35 | |||||||
| 36 | ### π **Analytics Dashboard** |
|||||||
|
37 | |||||||
| 38 | - Sexy-ass charts courtesy of Chart.js |
|||||||
| 39 | - Date ranges? Yep. Choose from Last Week, Month, 90 Days, or freestyle |
|||||||
| 40 | - Pie charts of shame: See who's not entered a damn thing |
|||||||
| 41 | - Employee comparisons so you know whoβs crushing it |
|||||||
| 42 | - Summary stats that slap you with truths at a glance |
|||||||
|
43 | |||||||
| 44 | ### π₯ **Employee Management** |
|||||||
|
45 | |||||||
| 46 | - Add, edit, and yeet employees in or out with full control |
|||||||
| 47 | - Inline editing β because popups can get bent |
|||||||
| 48 | - Confirmation dialogs keep you from rage-deleting poor Jim by mistake |
|||||||
| 49 | - Secure, session-based login β no freeloaders allowed |
|||||||
|
50 | |||||||
| 51 | ### πΎ **Data Export & Backup** |
|||||||
|
52 | |||||||
| 53 | - Export in: |
|||||||
| 54 | - Colored Excel (preserves all that green/yellow/red goodness) |
|||||||
| 55 | - JSON (for the nerds and the APIs) |
|||||||
| 56 | - CSV (because boring as hell = universal) |
|||||||
| 57 | - Auto-backups so you can sleep like a baby β configurable too |
|||||||
| 58 | ||||||||
| 59 | ### π¨ **Beautiful AF UI** |
|||||||
| 60 | ||||||||
| 61 | - Responsive as heck β use it on a tablet, a phone, or a potato |
|||||||
| 62 | - A glorious purple gradient worth showing off to design nerds |
|||||||
| 63 | - Smooth transitions that donβt make you nauseous |
|||||||
| 64 | - Touch support that'll make any mobile user say βdamn thatβs cleanβ |
|||||||
| 65 | - You might actually enjoy navigating this one |
|||||||
| 66 | ||||||||
| 67 | --- |
|||||||
|
68 | |||||||
| 69 | ## π Quick Start |
|||||||
| 70 | ||||||||
|
71 | ### Prerequisites (Donβt Skip This, Ya Animal) |
||||||
|
72 | |||||||
|
73 | - Node.js 18+ |
||||||
| 74 | - OR Docker & Docker Compose (weβre fancy) |
|||||||
|
75 | |||||||
|
76 | --- |
||||||
|
77 | |||||||
|
78 | ### π§ͺ Option 1: Raw Node.js |
||||||
|
79 | ```bash |
||||||
| 80 | git clone https://github.com/tebwritescode/employee-hour-tracker.git |
|||||||
| 81 | cd employee-hour-tracker |
|||||||
| 82 | npm install |
|||||||
|
83 | npm start # Start like a regular ol' app |
||||||
| 84 | npm run dev # If you want auto-reload magic |
|||||||
|
85 | ``` |
||||||
| 86 | ||||||||
|
87 | --- |
||||||
| 88 | ||||||||
| 89 | ### π³ Option 2: Docker Compose (Recommended as Hell) |
|||||||
|
90 | |||||||
| 91 | ```bash |
|||||||
| 92 | git clone https://github.com/tebwritescode/employee-hour-tracker.git |
|||||||
| 93 | cd employee-hour-tracker |
|||||||
| 94 | docker-compose up -d |
|||||||
|
95 | docker-compose logs -f # Because watching logs is oddly satisfying |
||||||
| 96 | docker-compose down # When itβs time to kill it |
|||||||
|
97 | ``` |
||||||
| 98 | ||||||||
|
99 | --- |
||||||
| 100 | ||||||||
| 101 | ### π¨ Option 3: Docker CLI (For Hardcore Terminal Nerds) |
|||||||
|
102 | |||||||
| 103 | ```bash |
|||||||
| 104 | docker build -t employee-hour-tracker . |
|||||||
| 105 | docker run -d \ |
|||||||
| 106 | --name employee-tracker \ |
|||||||
| 107 | -p 3000:3000 \ |
|||||||
| 108 | -v employee-tracker-data:/app/data \ |
|||||||
| 109 | employee-hour-tracker |
|||||||
| 110 | ``` |
|||||||
| 111 | ||||||||
|
112 | App launches at `http://localhost:3000` |
||||||
| 113 | Go ahead, open it. We dare you. |
|||||||
|
114 | |||||||
|
115 | --- |
||||||
|
116 | |||||||
|
117 | ## π§ Configuration (Don't Screw These Up) |
||||||
|
118 | |||||||
| 119 | | Variable | Default | Description | |
|||||||
| 120 | |----------|---------|-------------| |
|||||||
|
121 | | `PORT` | `3000` | Where the hell the server listens | |
||||||
| 122 | | `NODE_ENV` | `development` | Pick your poison: `development` vs `production` | |
|||||||
| 123 | | `DB_PATH` | `./employee_tracker.db` | Where your crucial time data lives | |
|||||||
| 124 | | `SESSION_SECRET` | `employee-tracker-secret-key` | Hide this like itβs your banking password | |
|||||||
| 125 | | `DEFAULT_ADMIN_USERNAME` | `admin` | The overlordβs default login | |
|||||||
| 126 | | `DEFAULT_ADMIN_PASSWORD` | `admin123` | CHANGE THIS ASAP π₯ | |
|||||||
| 127 | | `BACKUP_ENABLED` | `true` | Yeah, you want this on | |
|||||||
| 128 | | `BACKUP_INTERVAL` | `86400000` | How often to save your backside (MS) | |
|||||||
| 129 | | `BACKUP_RETENTION_DAYS` | `30` | How long to keep your safety net | |
|||||||
| 130 | ||||||||
| 131 | --- |
|||||||
| 132 | ||||||||
| 133 | ### π Docker Compose Config |
|||||||
|
134 | |||||||
| 135 | ```yaml |
|||||||
| 136 | version: '3.8' |
|||||||
| 137 | services: |
|||||||
| 138 | app: |
|||||||
| 139 | image: employee-hour-tracker |
|||||||
| 140 | environment: |
|||||||
| 141 | - NODE_ENV=production |
|||||||
| 142 | - SESSION_SECRET=your-secure-secret-here |
|||||||
| 143 | - DEFAULT_ADMIN_USERNAME=admin |
|||||||
| 144 | - DEFAULT_ADMIN_PASSWORD=change-this-password |
|||||||
| 145 | ports: |
|||||||
| 146 | - "3000:3000" |
|||||||
| 147 | volumes: |
|||||||
| 148 | - ./data:/app/data |
|||||||
| 149 | - ./backups:/app/backups |
|||||||
| 150 | ``` |
|||||||
| 151 | ||||||||
|
152 | --- |
||||||
| 153 | ||||||||
|
154 | ## π Usage Guide |
||||||
| 155 | ||||||||
|
156 | ### β±οΈ Time Tracking `/tracking` |
||||||
| 157 | ||||||||
| 158 | 1. Pick your week and start clicking grid cells like a god |
|||||||
| 159 | 2. Cycle statuses like a boss |
|||||||
| 160 | 3. Sit back β auto-saveβs doing the work for you |
|||||||
| 161 | 4. Use arrows & selectors if you like jumping through time |
|||||||
| 162 | ||||||||
| 163 | ### π Analytics `/analytics` |
|||||||
|
164 | |||||||
|
165 | 1. Choose your dates |
||||||
| 166 | 2. Interpret shame-slices in the pie chart |
|||||||
| 167 | 3. Compare your teamβs hustle in bar form |
|||||||
| 168 | 4. Click Export and flex on your boss with pretty data |
|||||||
|
169 | |||||||
|
170 | ### π¨βπΌ Admin Stuff `/management` |
||||||
| 171 | ||||||||
| 172 | 1. Log in as admin (`admin` / `admin123`) β seriously, change that |
|||||||
| 173 | 2. Add new employees like itβs HR day |
|||||||
| 174 | 3. Click to edit names (typos wonβt fix themselves) |
|||||||
| 175 | 4. Boot off old names thoughtfully (confirmation included) |
|||||||
| 176 | 5. Global settings & data export tools right at your manicured fingertips |
|||||||
| 177 | ||||||||
| 178 | --- |
|||||||
|
179 | |||||||
|
180 | ## ποΈ Project Architecture |
||||||
|
181 | |||||||
| 182 | ``` |
|||||||
| 183 | employee-hour-tracker/ |
|||||||
|
184 | βββ π server.js # RESTful backend engine of doom |
||||||
| 185 | βββ π backup.js # Makes sure your data doesnβt go *poof* |
|||||||
| 186 | βββ π package.json # Clearly youβve heard of this |
|||||||
| 187 | βββ π docker-compose.yml # Container boyband orchestration |
|||||||
| 188 | βββ π Dockerfile # Turns your app into deployable magic |
|||||||
| 189 | βββ π public/ # Frontend good stuff |
|||||||
| 190 | β βββ index.html # Your glorious entry point |
|||||||
| 191 | β βββ style.css # Sharp purple swagger |
|||||||
| 192 | β βββ script.js # Grid logic + admin finesse |
|||||||
| 193 | β βββ chart.js # Analytics eye-candy |
|||||||
| 194 | βββ π backups/ # This folder saves asses |
|||||||
| 195 | βββ π employee_tracker.db # Don't delete this... seriously |
|||||||
|
196 | ``` |
||||||
| 197 | ||||||||
|
198 | --- |
||||||
| 199 | ||||||||
| 200 | ### βοΈ Tech Stack |
|||||||
| 201 | ||||||||
| 202 | - **Backend**: Node.js + Express |
|||||||
| 203 | - **Database**: SQLite3 + better-sqlite3 (the better part matters) |
|||||||
| 204 | - **Frontend**: Raw Vanilla JS (no extra calories) + Chart.js |
|||||||
| 205 | - **Auth**: express-session + bcryptjs (like a bouncer for your admin area) |
|||||||
| 206 | - **Containerization**: Docker & Docker Compose |
|||||||
| 207 | ||||||||
| 208 | --- |
|||||||
|
209 | |||||||
| 210 | ## π Security |
|||||||
| 211 | ||||||||
|
212 | - Hashed passwords (get rekt plain text) |
||||||
| 213 | - Session-based login β no silly tokens |
|||||||
| 214 | - CORS-tight so outsiders canβt jack your data |
|||||||
| 215 | - SQL injection-proof β parameterized 'cause weβre not amateurs |
|||||||
| 216 | - Secrets optional but highly encouraged (youβve been warned) |
|||||||
|
217 | |||||||
|
218 | --- |
||||||
|
219 | |||||||
|
220 | ## π§ Dev Life |
||||||
|
221 | |||||||
| 222 | ```bash |
|||||||
|
223 | npm run dev # Hot reload fixups |
||||||
| 224 | npm start # Serious prod mode |
|||||||
| 225 | npm run install-deps # Just in case you skipped setup like a rebel |
|||||||
| 226 | ``` |
|||||||
|
227 | |||||||
|
228 | --- |
||||||
|
229 | |||||||
|
230 | ### π API Endpoints |
||||||
| 231 | ||||||||
| 232 | | Method | URL | What-It-Does | Auth | |
|||||||
| 233 | |--------|-----|--------------|------| |
|||||||
| 234 | | GET | `/api/employees` | Fetch worker list | β | |
|||||||
| 235 | | POST | `/api/employees` | Add a badass | β
| |
|||||||
| 236 | | PUT | `/api/employees/:id` | Update someoneβs stuff | β
| |
|||||||
| 237 | | DELETE | `/api/employees/:id`| Boot 'em | β
| |
|||||||
| 238 | | GET | `/api/time-entries` | Fetch time logs | β | |
|||||||
| 239 | | POST | `/api/time-entries` | Save/correct logs | β | |
|||||||
| 240 | | GET | `/api/analytics` | Data candy | β | |
|||||||
| 241 | | POST | `/api/login` | Get in | β | |
|||||||
| 242 | | POST | `/api/logout` | Peace out | β
| |
|||||||
| 243 | | GET | `/api/export/:format` | Download your victory proof | β
| |
|||||||
|
244 | |||||||
|
245 | --- |
||||||
|
246 | |||||||
|
247 | ## π Known WTFs |
||||||
|
248 | |||||||
|
249 | - Week nav is a little moody if you click like a caffeinated squirrel |
||||||
| 250 | - In rare cases, the status markerβs a lazy bastard and doesnβt update instantly |
|||||||
|
251 | |||||||
|
252 | (Fix coming soon. Or yell at us, that works too.) |
||||||
| 253 | ||||||||
|
254 | ## Support |
||||||
|
255 | |||||||
|
256 | Issues? Questions? Praise-singing? |
||||||
| 257 | File an issue on GitHub or yell at [teb](https://github.com/tebwritescode). |
|||||||
|
258 | |||||||
|
259 | --- |
||||||
|
260 | π Created by: [tebbydog0605](https://github.com/tebwritescode) |
||||||
| 261 | π Docker Hub: [tebwritescode](https://hub.docker.com/u/tebwritescode) |
|||||||
| 262 | π» Website: [teb.codes](https://teb.codes) |
|||||||