Use hosted Trackam
The fastest route for the public beta. Create an account at trackam.click and connect the WakaTime plugin you already use.
Create an account →Official documentation
Everything you need to connect your editor, understand your analytics, share verified work, manage Trackam, or run it on your own infrastructure.
Sign up
02Copy editor config
03Start coding
Start here
Go from a new account to verified coding activity in about five minutes.
The fastest route for the public beta. Create an account at trackam.click and connect the WakaTime plugin you already use.
Create an account →Run the same application and PostgreSQL database on your own machine or server. Your history stays under your control.
Read the self-hosting guide →Open Trackam, choose a username, enter your email, and use a password of at least eight characters. The beta currently accepts up to 100 developer accounts.
Open the verification message Trackam sends you. Verification is required for password recovery and optional weekly coding summaries.
Trackam never displays the raw API key on screen. Use Copy config securely immediately after signup or key regeneration.
Open a project and edit a file. The official WakaTime plugin sends small heartbeat events to Trackam in the background.
Return to the dashboard. The “coding now” status should turn on and today’s heartbeat count should begin increasing.
Trackam is compatible with official WakaTime plugins. Only the API URL and API key change.
Event time, project, language, branch, editor, operating system, machine, and file metadata sent by the plugin.
Keystrokes, source-code contents, passwords, clipboard contents, or screenshots.
Editor integration
Keep the official WakaTime plugin and point it to Trackam. Trackam implements the ingestion endpoints the plugin expects.
Install “WakaTime” from the Extensions marketplace.
Install WakaTime from Settings → Plugins.
Install the official wakatime/vim-wakatime plugin.
Any current WakaTime plugin that supports a custom API URL can connect.
After signup, select Copy config securely. Paste the copied text into the WakaTime configuration file for your operating system.
~/.wakatime.cfg%USERPROFILE%\.wakatime.cfg[settings]
api_url = https://trackam.click/api/v1
api_key = your-one-time-trackam-api-key
/api/v1.Do not use the dashboard URL, add a trailing endpoint name, or leave the value as WakaTime’s default host.
Trackam stores only a SHA-256 lookup hash of each API key. The raw value is delivered once during signup or regeneration with a non-cacheable response. It is copied directly to your clipboard and never rendered in the dashboard.
Open Dashboard → Settings → API key → Regenerate. The previous key stops working immediately, so update every editor that used it.
Understand your work
Trackam turns editor heartbeats into useful coding sessions, trends, streaks, and tool breakdowns without pretending idle time is work.
The “coding now” indicator is active when Trackam received a recent heartbeat. It automatically turns off when activity becomes stale.
Consecutive local calendar days with recorded coding time. Your configured timezone determines day boundaries.
Stat cards compare coding time, daily average, and heartbeat count against the immediately preceding period of equal length.
Open any project to inspect coding time, languages, branches, daily activity, and heartbeat totals for the selected range.
| Dashboard label | Period | Best used for |
|---|---|---|
Today | Your current local day | Live focus and daily goals |
7 days | Rolling seven local days | Weekly rhythm and short-term trends |
30 days | Rolling thirty local days | Monthly review and portfolio updates |
Quarter | Rolling ninety local days | Longer project and skill patterns |
Trackam sorts your heartbeats and measures the gap between consecutive events. A positive gap counts only when it is smaller than your heartbeat timeout. The default timeout is 900 seconds (15 minutes), and you can set a value from 60 to 3,600 seconds in Settings. Larger gaps are treated as breaks.
The timeout is only the maximum allowed gap between two events. A single isolated heartbeat contributes no invented block of time.
The overview groups coding seconds by project, language, editor, and operating system. Daily totals and breakdowns are maintained during ingestion for fast dashboard reads. Changing your timezone or heartbeat timeout rebuilds your summaries and coding intervals so historical views remain consistent with the new preference.
Build consistency together
Set targets for yourself, keep a portable copy of your raw data, and share private competition with people you choose.
Set a daily target and a rolling seven-day target from the dashboard. Progress updates as daily summaries are maintained, using your account timezone and heartbeat timeout.
Daily target
90 min65 of 90 minutesRolling 7-day target
10 hrs4h 48m of 10 hoursThe contribution-style heatmap shows up to 366 local calendar days. Colour intensity represents coding time for each day; hovering or focusing a cell reveals its date and duration. This heatmap is private inside your dashboard.
Exports are authenticated and contain your raw heartbeat records. Use JSON for backup or scripts, and CSV for spreadsheets or external analysis.
| Format | Good for | Request |
|---|---|---|
| JSON | Backups, applications, programmatic processing | GET /api/export?format=json&range=total |
| CSV | Spreadsheets, BI tools, manual inspection | GET /api/export?format=csv&range=month |
They may include file entities and machine metadata from your editor. Store or share them with the same care as development logs.
Trackam has no public global ranking. Every leaderboard is an invite-only group. Members see aggregate coding time, rank, top language, and heartbeat count for people who explicitly joined.
Choose a name. You become the owner and first member.
Send the generated /app?invite=CODE URL only to friends you want in the group.
Rankings support today, week, month, and quarter views.
Owners can remove members, rotate the invite code, or delete the group. Non-owners can leave at any time.
Team visibility with consent
Companies can understand aggregate engineering activity without turning Trackam into employee surveillance.
An owner creates the workspace and shares an invite. An engineer must sign in and deliberately join before any of their aggregate Trackam activity appears to the company.
The owner names a workspace and receives a private invite code.
Share the consent link with engineers. The configured seat limit is enforced.
Members view aggregate trends for week, month, or quarter.
Total coding time, active engineers, heartbeat count, daily trends, project/language breakdowns, and per-member aggregate totals for the selected period.
Source code, file contents, keystrokes, screenshots, raw heartbeat entities, file paths, API keys, passwords, and activity from engineers who did not join.
| Action | Endpoint | Access |
|---|---|---|
| List or create workspaces | GET/POST /api/companies | Signed in |
| Join with consent | POST /api/companies/join | Signed in + invite |
| Read team analytics | GET /api/companies/:id?range=week | Members |
| Change member role | PATCH /api/companies/:id/members/:userId | Owner |
| Remove a member | DELETE /api/companies/:id/members/:userId | Owner or admin |
The Paystack checkout, subscription, trial, grace-period, suspension, and reconciliation code is fail-closed behind production configuration. Do not advertise paid access until the operator deliberately enables and tests it.
Operate the product
The protected console at /admin gives the Trackam operator a clear view of adoption, usage, account health, and service readiness.
Set OWNER_EMAILS to a comma-separated list of existing Trackam account emails. Sign in through the normal dashboard first, then open /admin.
OWNER_EMAILS=owner@example.com,second-owner@example.com
Existing installations also promote their oldest account once when migration 014 is first applied, preventing the original operator from being locked out.
A reason of up to 500 characters is required.
Cookie sessions and WakaTime API keys receive an account-suspended response.
Admin, target, reason, prior status, and timestamp are recorded.
An owner cannot suspend their own account, and admin accounts cannot be suspended through the console. Reactivation clears the suspension timestamp and reason.
The console never returns passwords, password hashes, raw API keys, session tokens, SMTP credentials, monitoring tokens, database credentials, or billing secrets.
Build with Trackam
Trackam exposes browser-session APIs for the dashboard, WakaTime-compatible ingestion APIs for editors, and protected operator endpoints.
| Method | Use it for | How it is sent |
|---|---|---|
| Session cookie | Dashboard, settings, exports, goals, groups, and companies | Created by POST /api/account/login; include credentials on browser requests |
| WakaTime API key | Heartbeat ingestion and status bar integrations | HTTP Basic auth with the key as the username |
| Monitoring token | Prometheus metrics | Authorization: Bearer <MONITORING_TOKEN> |
/api/v1/users/current/heartbeatsRecord one WakaTime-compatible heartbeat.
/api/v1/users/current/heartbeats.bulkRecord a batch of heartbeats from an editor plugin.
/api/v1/users/current/statusbar/todayReturn the current user's coding total for today.
/api/stats?range=weekRead dashboard totals and breakdowns for an authenticated session.
/api/activity?range=monthRead the daily activity series for the selected range.
/api/projects?range=quarterRead aggregate project activity and drill-down data.
curl -u 'YOUR_TRACKAM_API_KEY:' \
-H 'Content-Type: application/json' \
-d '{"entity":"src/index.ts","type":"file","category":"coding","time":1760000000,"project":"trackam","language":"TypeScript"}' \
https://trackam.click/api/v1/users/current/heartbeats
The example deliberately uses a placeholder. Regenerate a leaked key immediately from account settings.
Analytics endpoints accept the ranges supported by their screen—commonly today, week, month, quarter, six_months, and total. Successful JSON responses use normal HTTP status codes; validation and authentication failures include a readable error field.
Own the whole stack
Run Trackam with Docker Compose for the shortest path, or use Node.js and PostgreSQL directly for local development.
git clone https://github.com/OutstandingVick/trackam.git
cd trackam
cp .env.example .env
# Replace JWT_SECRET and MONITORING_TOKEN in .env
docker compose up -d --build
Compose starts PostgreSQL, applies every numbered migration in order, and starts the app only after the database is healthy and migrations succeed. Open http://localhost:3000.
npm ci
cp .env.example .env
npm run migrate
npm run dev
| Variable | Purpose | Production guidance |
|---|---|---|
DATABASE_URL | PostgreSQL connection string | Use the private URL supplied by your managed database |
JWT_SECRET | Signs dashboard sessions | Generate a long random value and keep it stable |
BASE_URL | Canonical public origin | Set to https://trackam.click or your own HTTPS domain |
MAX_USERS | Registration cap | Use 100 for the closed public beta |
OWNER_EMAILS | Grants owner-console access | Comma-separated existing account emails |
MONITORING_TOKEN | Protects /metrics | Use a separate random secret |
SMTP_* | Verification, reset, and summary email | Configure a transactional email provider |
.env.Keep production values in your host's secret manager. The tracked .env.example contains placeholders and is the authoritative list of supported settings.
Ship without guessing
Trackam includes Railway configuration and a hardened single-host stack. Whichever route you choose, make readiness, backups, and rollback part of every release.
Connect the GitHub repository to an application service and add managed PostgreSQL in the same private environment.
Set DATABASE_URL, BASE_URL, JWT_SECRET, MONITORING_TOKEN, MAX_USERS=100, and OWNER_EMAILS. Add SMTP before public signup.
railway.json builds the Dockerfile, runs migrations before release, starts the server, and gates success on /readyz.
Add your custom domain in Railway, copy its DNS target into your registrar, wait for HTTPS, then update BASE_URL.
/livezProcess liveness. Use it to detect a crashed or unreachable application.
/readyzDeployment gate covering database connectivity and migration readiness.
/healthzSanitized operational health for deeper diagnostics.
/metricsPrometheus metrics protected by the monitoring bearer token.
Alert on readiness failures, repeated 5xx responses, high database latency, disk pressure, TLS expiry, backup age, and approaching the 100-user beta cap. Never expose the monitoring token in a public uptime check.
Capture and verify a database dump.
Apply numbered migrations once.
Wait for readiness before traffic.
Watch errors and core journeys.
Keep encrypted PostgreSQL dumps outside the production account, enforce retention, record checksums, and alert when the newest successful backup is older than 36 hours.
Restore into a disposable database at least monthly. Record recovery time and validate accounts, migrations, summaries, and heartbeat ingestion.
Roll the application image back when readiness or smoke checks fail. Keep schema changes backward-compatible across the rollback window. A database restore is destructive and should only follow an explicit incident decision with a fresh final backup.
Confirm signup, sign-in, editor ingestion, dashboard ranges, email delivery, owner access, and public sharing on staging before promoting the exact tested release to production.
Protect developer trust
Trackam is designed to collect activity metadata—not source code. Keep production secrets outside the repository and expose only the minimum data each feature needs.
Passwords use adaptive hashes, API keys are hashed at rest, and sessions use signed HTTP-only cookies. Raw keys are shown only when generated.
Security headers, origin checks, request-size limits, rate limits, input validation, and production HTTPS guards reduce common attack paths.
Private resources require a session and membership or role checks. Admin access is explicit, and moderation actions are audited.
| Trackam records | Trackam does not need |
|---|---|
| Project, language, editor, operating system, category, timestamp, and heartbeat duration | Source code contents, keystrokes, screenshots, repository credentials, or Git history |
| File entity metadata may be present in private raw exports | Public badges and proof pages never expose raw file paths or individual heartbeats |
| Workspace membership and aggregate activity after explicit joining | Company access to anyone who has not opted into that workspace |
.env, Railway variables, SMTP passwords, database URLs, and Paystack keys out of Git.JWT_SECRET, MONITORING_TOKEN, and billing encryption.Regenerate a user API key, rotate the affected host secret, and invalidate active sessions when relevant.
Delete it from the source and hosting surface. Assume Git history and build logs are permanent copies.
Check access logs, scope affected data, notify users if required, and document prevention steps.
Find the fault quickly
Start with the symptom, then check the smallest relevant layer before changing production configuration.
Confirm the editor's WakaTime plugin is enabled, api_url ends in /api/v1, and the API key belongs to the signed-in Trackam account. Save a file, wait a minute, then inspect the plugin log for 401, 403, or network errors.
Check the selected range, account timezone, and HEARTBEAT_TIMEOUT_SECONDS. Trackam groups nearby heartbeats into sessions and caps gaps at the configured timeout; it does not count the time between every pair without limit.
401 means authentication is absent or invalid. 403 means the account, role, origin, privacy setting, or membership disallows the action. 429 means the rate limit was exceeded—stop retrying rapidly and wait for the response window.
Check spam first. Operators should verify all SMTP_* values, sender authorization, provider delivery logs, and production BASE_URL. Without SMTP, links are logged only in development.
Make sure the signed-in account's exact email is listed in OWNER_EMAILS, restart or redeploy after changing the variable, and confirm the account is active. The URL is /admin.
Open /livez and inspect application and migration logs. Typical causes are an unreachable DATABASE_URL, an unapplied or failed migration, invalid production secrets, or a mismatched BASE_URL. Do not bypass /readyz to force traffic.
Open a GitHub issue with the Trackam version, endpoint or screen, expected result, status code, and sanitized logs. Remove tokens, email addresses, database URLs, file paths, and other personal data first.