Trackam Docs
Browse documentation

Official documentation

Build a coding record you actually own.

Everything you need to connect your editor, understand your analytics, share verified work, manage Trackam, or run it on your own infrastructure.

01

Sign up

02

Copy editor config

03

Start coding

01

Start here

Quick start

Go from a new account to verified coding activity in about five minutes.

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 →

Self-host Trackam

Run the same application and PostgreSQL database on your own machine or server. Your history stays under your control.

Read the self-hosting guide →

Hosted beta setup

  1. 1

    Create your account

    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.

  2. 2

    Verify your email

    Open the verification message Trackam sends you. Verification is required for password recovery and optional weekly coding summaries.

  3. 3

    Copy your editor configuration

    Trackam never displays the raw API key on screen. Use Copy config securely immediately after signup or key regeneration.

  4. 4

    Start coding

    Open a project and edit a file. The official WakaTime plugin sends small heartbeat events to Trackam in the background.

  5. 5

    Confirm the connection

    Return to the dashboard. The “coding now” status should turn on and today’s heartbeat count should begin increasing.

You do not need a Trackam editor extension.

Trackam is compatible with official WakaTime plugins. Only the API URL and API key change.

What Trackam records

Recorded

Event time, project, language, branch, editor, operating system, machine, and file metadata sent by the plugin.

Not recorded

Keystrokes, source-code contents, passwords, clipboard contents, or screenshots.

02

Editor integration

Connect your editor

Keep the official WakaTime plugin and point it to Trackam. Trackam implements the ingestion endpoints the plugin expects.

1. Install the WakaTime plugin

VS Code & Cursor

Install “WakaTime” from the Extensions marketplace.

JetBrains IDEs

Install WakaTime from Settings → Plugins.

Vim & Neovim

Install the official wakatime/vim-wakatime plugin.

Other editors

Any current WakaTime plugin that supports a custom API URL can connect.

2. Add your Trackam configuration

After signup, select Copy config securely. Paste the copied text into the WakaTime configuration file for your operating system.

macOS / Linux~/.wakatime.cfg
Windows%USERPROFILE%\.wakatime.cfg
~/.wakatime.cfg
[settings]
api_url = https://trackam.click/api/v1
api_key = your-one-time-trackam-api-key
The API URL must end in /api/v1.

Do not use the dashboard URL, add a trailing endpoint name, or leave the value as WakaTime’s default host.

3. Verify heartbeat delivery

  • Edit and save a code file for at least one minute.
  • Open Trackam and look for the green “coding now” indicator.
  • Confirm that today’s heartbeats, coding time, project, and language appear.
  • If the editor still points to WakaTime, restart it after changing the configuration.

API-key safety

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.

If a key may have leaked, rotate it.

Open Dashboard → Settings → API key → Regenerate. The previous key stops working immediately, so update every editor that used it.

03

Understand your work

Dashboard & analytics

Trackam turns editor heartbeats into useful coding sessions, trends, streaks, and tool breakdowns without pretending idle time is work.

Live activity

The “coding now” indicator is active when Trackam received a recent heartbeat. It automatically turns off when activity becomes stale.

Coding streak

Consecutive local calendar days with recorded coding time. Your configured timezone determines day boundaries.

Period comparison

Stat cards compare coding time, daily average, and heartbeat count against the immediately preceding period of equal length.

Project drill-down

Open any project to inspect coding time, languages, branches, daily activity, and heartbeat totals for the selected range.

Available date ranges

Dashboard labelPeriodBest used for
TodayYour current local dayLive focus and daily goals
7 daysRolling seven local daysWeekly rhythm and short-term trends
30 daysRolling thirty local daysMonthly review and portfolio updates
QuarterRolling ninety local daysLonger project and skill patterns

How coding time is calculated

Heartbeat A10:00
5 min gap
Heartbeat B10:05
= 5 minutes coding

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.

A heartbeat is not fifteen minutes by itself.

The timeout is only the maximum allowed gap between two events. A single isolated heartbeat contributes no invented block of time.

Breakdowns and daily summaries

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.

ProjectsWhere the time went
LanguagesWhat you worked in
EditorsTools you used
Operating systemsEnvironments you coded on
04

Share your progress

Badges & proof of work

Publish aggregate evidence of your coding activity without exposing email, API keys, filenames, or raw heartbeat events.

Public sharing is opt-in.

GitHub badges and portfolio publishing have separate privacy switches. Private previews work while public access remains disabled.

GitHub README badges

Open Dashboard → GitHub badges. Choose a type and range, preview the result, enable public badges, then copy the generated Markdown into a GitHub profile or project README.

BadgeSupported rangeEndpoint
Coding timetoday, 7d, 30d, total/api/badges/:username/coding-time.svg
Current streakCurrent consecutive coding days/api/badges/:username/streak.svg
README.md
![Trackam coding time](https://trackam.click/api/badges/your-username/coding-time.svg?range=7d)

Portfolio widget

The responsive widget is designed for developer portfolios. Choose a period and theme, preview it privately, turn on portfolio publishing, and paste the generated iframe into your site.

Periods30 days · quarter · six monthsThemeslight · dark · violetFormatresponsive iframe
portfolio.html
<iframe
  src="https://trackam.click/embed/your-username?range=30d&theme=dark"
  title="My Trackam coding activity"
  loading="lazy"
  style="width:100%;height:250px;border:0"
></iframe>

Generated proof-of-work page

A proof page is a shareable webpage covering a selected period. It contains aggregate coding time, active days, streaks, projects, languages, tools, daily totals, and a verification ID. Use it for monthly reviews, applications, client updates, or a portfolio case study.

Public webpageGET /proof/:username?range=quarter

Ranges: 30d, quarter, or six_months.

Build your own component

The public portfolio JSON endpoint sends aggregate data with CORS enabled, so a custom portfolio frontend can render Trackam activity without embedding the built-in widget.

JavaScript
const stats = await fetch(
  "https://trackam.click/api/portfolio/your-username?range=30d"
).then(response => response.json());
Public output includes

Username, selected range, aggregate totals, project and language names, editors, operating systems, streak, active days, and verification ID.

Public output excludes

Email, password data, API keys, file paths, raw entities, source contents, individual heartbeats, and company memberships.

05

Build consistency together

Goals, exports & friends

Set targets for yourself, keep a portable copy of your raw data, and share private competition with people you choose.

Coding goals

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 minutes

Rolling 7-day target

10 hrs4h 48m of 10 hours

Contribution heatmap

The 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.

Export your data

Exports are authenticated and contain your raw heartbeat records. Use JSON for backup or scripts, and CSV for spreadsheets or external analysis.

FormatGood forRequest
JSONBackups, applications, programmatic processingGET /api/export?format=json&range=total
CSVSpreadsheets, BI tools, manual inspectionGET /api/export?format=csv&range=month
Treat exports as sensitive files.

They may include file entities and machine metadata from your editor. Store or share them with the same care as development logs.

Private friend leaderboards

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.

  1. 1

    Create a group

    Choose a name. You become the owner and first member.

  2. 2

    Share the invite link

    Send the generated /app?invite=CODE URL only to friends you want in the group.

  3. 3

    Compare a range

    Rankings support today, week, month, and quarter views.

  4. 4

    Manage membership

    Owners can remove members, rotate the invite code, or delete the group. Non-owners can leave at any time.

Owner
  • Rotate invite code
  • Remove members
  • Delete the group
Member
  • View group rankings
  • Use all date ranges
  • Leave the group
06

Team visibility with consent

Company workspaces

Companies can understand aggregate engineering activity without turning Trackam into employee surveillance.

Every engineer opts in.

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.

Workspace lifecycle

1Create

The owner names a workspace and receives a private invite code.

2Invite

Share the consent link with engineers. The configured seat limit is enforced.

3Review

Members view aggregate trends for week, month, or quarter.

Roles and permissions

Owner
  • Full workspace management
  • Rotate invite code
  • Remove members
  • Promote or demote admins
  • Manage billing and delete workspace
Admin
  • View all workspace analytics
  • Rotate invite code
  • Remove engineers
  • Cannot remove or replace owner
Engineer
  • View the workspace they joined
  • See the same aggregate team data
  • Leave the workspace at any time
  • Manage their own Trackam privacy

What companies can see

Aggregate workspace data

Total coding time, active engineers, heartbeat count, daily trends, project/language breakdowns, and per-member aggregate totals for the selected period.

Always private

Source code, file contents, keystrokes, screenshots, raw heartbeat entities, file paths, API keys, passwords, and activity from engineers who did not join.

Company API overview

ActionEndpointAccess
List or create workspacesGET/POST /api/companiesSigned in
Join with consentPOST /api/companies/joinSigned in + invite
Read team analyticsGET /api/companies/:id?range=weekMembers
Change member rolePATCH /api/companies/:id/members/:userIdOwner
Remove a memberDELETE /api/companies/:id/members/:userIdOwner or admin
Company billing is not enabled for the public beta.

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.

07

Operate the product

Owner console

The protected console at /admin gives the Trackam operator a clear view of adoption, usage, account health, and service readiness.

Grant owner access

Set OWNER_EMAILS to a comma-separated list of existing Trackam account emails. Sign in through the normal dashboard first, then open /admin.

Production environment
OWNER_EMAILS=owner@example.com,second-owner@example.com
This value belongs in the hosting environment—not Git.

Existing installations also promote their oldest account once when migration 014 is first applied, preventing the original operator from being locked out.

Overview

  • Total, new, verified, active, and suspended users
  • Current developers coding in the last five minutes
  • 7/30/90-day coding and signup trends
  • Top languages and projects
  • 100-user beta capacity and remaining places

Users

  • Search by username or email
  • Filter active and suspended accounts
  • View verification, join date, last activity, and 30-day totals
  • Suspend with a mandatory reason
  • Reactivate access immediately

System

  • Release, uptime, Node version, and memory
  • Database latency, migration version, and size
  • Request counts, 5xx totals, and in-flight requests
  • Feature-readiness flags and storage counts
  • Recent moderation audit events

Suspension behavior

Owner confirms

A reason of up to 500 characters is required.

Account is blocked

Cookie sessions and WakaTime API keys receive an account-suspended response.

Action is audited

Admin, target, reason, prior status, and timestamp are recorded.

Built-in safeguards

An owner cannot suspend their own account, and admin accounts cannot be suspended through the console. Reactivation clears the suspension timestamp and reason.

Secrets stay hidden

The console never returns passwords, password hashes, raw API keys, session tokens, SMTP credentials, monitoring tokens, database credentials, or billing secrets.

08

Build with Trackam

API reference

Trackam exposes browser-session APIs for the dashboard, WakaTime-compatible ingestion APIs for editors, and protected operator endpoints.

Authentication

MethodUse it forHow it is sent
Session cookieDashboard, settings, exports, goals, groups, and companiesCreated by POST /api/account/login; include credentials on browser requests
WakaTime API keyHeartbeat ingestion and status bar integrationsHTTP Basic auth with the key as the username
Monitoring tokenPrometheus metricsAuthorization: Bearer <MONITORING_TOKEN>

Core endpoints

POST/api/v1/users/current/heartbeats

Record one WakaTime-compatible heartbeat.

POST/api/v1/users/current/heartbeats.bulk

Record a batch of heartbeats from an editor plugin.

GET/api/v1/users/current/statusbar/today

Return the current user's coding total for today.

GET/api/stats?range=week

Read dashboard totals and breakdowns for an authenticated session.

GET/api/activity?range=month

Read the daily activity series for the selected range.

GET/api/projects?range=quarter

Read aggregate project activity and drill-down data.

Send a heartbeat

curl
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
Never put a real API key in client-side code or a public repository.

The example deliberately uses a placeholder. Regenerate a leaked key immediately from account settings.

Ranges and responses

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.

200–201Read or creation succeeded
400Invalid input or unsupported range
401Missing or invalid authentication
403Account, role, or privacy restriction
404Resource does not exist
429Rate limit exceeded
09

Own the whole stack

Self-hosting & configuration

Run Trackam with Docker Compose for the shortest path, or use Node.js and PostgreSQL directly for local development.

Node.js24 LTS or newer
DatabasePostgreSQL 16+
Container pathDocker + Compose
LicenseMIT

Docker Compose

Terminal
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.

Local development

Terminal
npm ci
cp .env.example .env
npm run migrate
npm run dev

Essential configuration

VariablePurposeProduction guidance
DATABASE_URLPostgreSQL connection stringUse the private URL supplied by your managed database
JWT_SECRETSigns dashboard sessionsGenerate a long random value and keep it stable
BASE_URLCanonical public originSet to https://trackam.click or your own HTTPS domain
MAX_USERSRegistration capUse 100 for the closed public beta
OWNER_EMAILSGrants owner-console accessComma-separated existing account emails
MONITORING_TOKENProtects /metricsUse a separate random secret
SMTP_*Verification, reset, and summary emailConfigure a transactional email provider

How the pieces fit

Editor pluginsWakaTime heartbeats
Trackam appExpress + static UI
PostgreSQLAccounts, summaries, activity
Do not commit .env.

Keep production values in your host's secret manager. The tracked .env.example contains placeholders and is the authoritative list of supported settings.

10

Ship without guessing

Production operations

Trackam includes Railway configuration and a hardened single-host stack. Whichever route you choose, make readiness, backups, and rollback part of every release.

Deploy on Railway

  1. 1

    Create the services

    Connect the GitHub repository to an application service and add managed PostgreSQL in the same private environment.

  2. 2

    Add production variables

    Set DATABASE_URL, BASE_URL, JWT_SECRET, MONITORING_TOKEN, MAX_USERS=100, and OWNER_EMAILS. Add SMTP before public signup.

  3. 3

    Deploy from main

    railway.json builds the Dockerfile, runs migrations before release, starts the server, and gates success on /readyz.

  4. 4

    Attach the domain

    Add your custom domain in Railway, copy its DNS target into your registrar, wait for HTTPS, then update BASE_URL.

Health and monitoring

GET/livez

Process liveness. Use it to detect a crashed or unreachable application.

GET/readyz

Deployment gate covering database connectivity and migration readiness.

GET/healthz

Sanitized operational health for deeper diagnostics.

GET/metrics

Prometheus 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.

Release path

01Back up

Capture and verify a database dump.

02Migrate

Apply numbered migrations once.

03Gate

Wait for readiness before traffic.

04Observe

Watch errors and core journeys.

Backups and recovery

Back up automatically

Keep encrypted PostgreSQL dumps outside the production account, enforce retention, record checksums, and alert when the newest successful backup is older than 36 hours.

Prove restoration works

Restore into a disposable database at least monthly. Record recovery time and validate accounts, migrations, summaries, and heartbeat ingestion.

Rollback rules

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.

A deployment is complete only after verification.

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.

11

Protect developer trust

Security & privacy

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.

Credentials

Passwords use adaptive hashes, API keys are hashed at rest, and sessions use signed HTTP-only cookies. Raw keys are shown only when generated.

Web controls

Security headers, origin checks, request-size limits, rate limits, input validation, and production HTTPS guards reduce common attack paths.

Access control

Private resources require a session and membership or role checks. Admin access is explicit, and moderation actions are audited.

Data boundaries

Trackam recordsTrackam does not need
Project, language, editor, operating system, category, timestamp, and heartbeat durationSource code contents, keystrokes, screenshots, repository credentials, or Git history
File entity metadata may be present in private raw exportsPublic badges and proof pages never expose raw file paths or individual heartbeats
Workspace membership and aggregate activity after explicit joiningCompany access to anyone who has not opted into that workspace

Secret-handling rules

  • Keep .env, Railway variables, SMTP passwords, database URLs, and Paystack keys out of Git.
  • Use different random values for JWT_SECRET, MONITORING_TOKEN, and billing encryption.
  • Never embed a Trackam API key in a public portfolio, browser bundle, screenshot, issue, or support message.
  • Restrict database and metrics access to private networks or authenticated clients.
  • Review dependency, secret-scanning, and container findings before each production release.

If a key or secret leaks

1
Revoke or rotate immediately

Regenerate a user API key, rotate the affected host secret, and invalidate active sessions when relevant.

2
Remove the exposure

Delete it from the source and hosting surface. Assume Git history and build logs are permanent copies.

3
Investigate and record

Check access logs, scope affected data, notify users if required, and document prevention steps.

12

Find the fault quickly

Troubleshooting

Start with the symptom, then check the smallest relevant layer before changing production configuration.

No coding activity appears

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.

The dashboard total looks different

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.

An API request returns 401, 403, or 429

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.

Verification or reset email never arrives

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.

The owner console says access denied

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.

A deployment fails its readiness check

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.

Still stuck?

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.