Seismic is a developer time tracking platform. It records editor activity from a VS Code extension, sends heartbeat events to a Go API, and displays coding activity, stats, and leaderboard views in an Angular web app.
apps/
api/ Go/Fiber API, PostgreSQL storage, auth, stats, leaderboard, Swagger docs
web/ Angular dashboard, login, settings, leaderboard, and stats UI
vscode/ VS Code extension that tracks coding activity and sends heartbeats
bruno/ Bruno API request collections for local API testing
- API: Go, Fiber, PostgreSQL, pgx, JWT, Swagger
- Web: Angular, Bun, RxJS, lucide-angular
- VS Code extension: TypeScript, Bun, VS Code Extension API
- API testing: Bruno collections
| Service | URL |
|---|---|
| API | http://localhost:5024 |
| Web app | http://localhost:4200 |
| API health | http://localhost:5024/health |
| Swagger docs | http://localhost:5024/api/docs/ |
The published API URL currently used by the web app and extension is:
https://correct-wolverine-majoramari-6049fd71.koyeb.app
- Go 1.25+
- Bun 1.3+
- PostgreSQL
- VS Code, for extension development
- Bruno, optional for API collection testing
cd apps/api
cp .env.example .envUpdate .env with your local values:
DATABASE_URL=postgresql://user:password@localhost:5432/seismic
JWT_SECRET=replace-this-with-a-long-random-secret
PORT=5024
APP_URL=http://localhost:4200
ALLOWED_ORIGINS=http://localhost:4200
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=user@example.com
SMTP_PASS=passwordRun the API:
go run .The API runs migrations on startup.
cd apps/web
bun install
bun run startDevelopment configuration points the web app at:
http://localhost:5024
Production configuration points the web app at:
https://correct-wolverine-majoramari-6049fd71.koyeb.app
Build the web app:
bun run buildcd apps/vscode
bun install
bun run buildOpen apps/vscode in VS Code and launch the extension host from the debugger.
The extension sends heartbeats to:
http://localhost:5024while running in VS Code extension development modehttps://correct-wolverine-majoramari-6049fd71.koyeb.appwhen installed/published
Users can override the API URL with the seismic.apiUrl VS Code setting.
Seismic: Set API KeySeismic: Open DashboardSeismic: Enable TrackingSeismic: Disable Tracking
seismic.apiKey: API key used to authenticate heartbeat requestsseismic.apiUrl: API server URLseismic.enabled: enables or disables trackingseismic.statusBarEnabled: shows or hides today's tracked time in the status bar
The extension also stores shared editor configuration in ~/.seismic.cfg so other editor integrations can reuse the same API key and API URL.
| Method | Route | Description |
|---|---|---|
GET |
/health |
Health check |
POST |
/api/auth/magic-link |
Request a login magic link |
GET |
/api/auth/verify |
Verify magic link |
POST |
/api/auth/complete-signup |
Complete signup |
POST |
/api/auth/refresh |
Refresh access token |
GET |
/api/auth/apikey |
Get the user's editor API key |
POST |
/api/auth/apikey/regenerate |
Regenerate editor API key |
POST |
/api/heartbeat |
Receive editor heartbeat events |
GET |
/api/stats/summary |
Summary stats |
GET |
/api/stats/languages |
Language stats |
GET |
/api/stats/heatmap |
Activity heatmap |
GET |
/api/leaderboard |
Leaderboard data |
POST |
/api/admin/process-sessions |
Manually process sessions |
Install the VS Code extension publishing tool:
npm install -g @vscode/vsceBuild and package the extension:
cd apps/vscode
bun run build
vsce packageTest the generated .vsix locally:
code --install-extension seismic-0.1.0.vsixPublish after logging in with the Marketplace publisher ID:
vsce login <publisher-id>
vsce publishThe Marketplace publisher display name can be Muhannad H., but the publisher field in apps/vscode/package.json must be the publisher ID from Visual Studio Marketplace. Publisher IDs are stable identifiers and usually do not contain spaces or punctuation.
API:
cd apps/api
go test ./...Web:
cd apps/web
bun run testVS Code extension:
cd apps/vscode
bun test- Keep secrets out of Git. Use
.envlocally and platform environment variables in production. - The extension only tracks real file documents and ignores untitled or non-file VS Code documents.
- Failed heartbeat requests are queued locally by the extension and retried later.
- The web and extension API URLs should stay aligned when the production API host changes.