๐๐ก TypeScript Astrodynamics Software for Non-Engineers. 3D Visualization of satellite data and the sensors that track them.
See the code
Professional satellite tracking for everyone
KeepTrackโข brings real orbital mechanics to students and educators. Used by EPFLโs Cosmos Archaeology, StarTalk, the 18th Space Defense Squadron, and ethicallyHackingspace, among many others.
Key Features:
Try it live | Installation | Join Discord | Screenshots
Welcome to KeepTrack, an ambitious project aiming to make orbital analysis tools accessible to all. KeepTrack provides a simplified and streamlined experience for learning and interacting with satellites and space debris. Built from the ground up with custom WebGL 2.0 shaders, an internal orbital mechanics library, and a high-performance render loop, this is a lot more than just dots around a globe.
What makes KeepTrack unique:
KeepTrack is used in operations centers, classrooms, and outreach programs around the world.
Browser Requirements: WebGL 2.0 support
KeepTrack is automatically deployed to production and development environments:
To build KeepTrack locally, you need:
# Clone the repository
git clone https://github.com/thkruz/keeptrack.space
cd keeptrack.space
# Install dependencies (this repo uses pnpm; `corepack enable` will provide it)
pnpm install
# Build the project
pnpm run build
# Start development server
pnpm start
Then open: http://localhost:5544 in your browser.
First time setup? The app will download the satellite catalog (~5 MB) on first load. This takes approximately 30 seconds.
| Command | Description |
|---|---|
pnpm start | Start dev server at localhost:5544 |
pnpm run build | Production build to /dist |
pnpm run lint | Check code style |
pnpm run lint:fix | Auto-fix linting issues |
pnpm test | Run test suite |
pnpm run sonar:up | Start a local offline SonarQube server (Docker) |
pnpm run sonar | Run tests with coverage, then analyze against local SonarQube |
pnpm run sonar:down | Stop the local SonarQube server |
Run pnpm run for the full list. Two groups in it are not contributor tasks, and both say so when you run them rather than failing with a stack trace:
pnpm run pro dispatches the commercial edition's tooling, which lives outside this repository, so the command just explains itself here. Nothing in the open-source build depends on it.upload:sourcemaps, release) push to infrastructure this project owns. They stop with a note about the missing credential. Point them at your own Cloudflare account if you want to run your own deployment.pnpm run mesh-viewer is worth knowing about: it serves a standalone viewer that renders any OBJ+MTL through the engine's exact mesh pipeline (layout, scale, shader, log depth), which is how models are checked before they ship. scripts/mesh-viewer/capture-meshes.ts and capture-angles.ts take headless verification shots through the same viewer.
Run the same static analysis we use, fully offline and self-hosted, with only Docker installed. No account setup, token juggling, or cloud service. See docs-local/sonarqube.md for details. The whole thing is one command:
pnpm run sonar # starts SonarQube, runs tests + coverage, scans, opens the dashboard
It auto-starts a local SonarQube server, mints an analysis token for you, enables anonymous access so the dashboard needs no login, runs the scan, and opens http://localhost:9000/dashboard?id=keeptrack. Run pnpm run sonar:down to stop the server when you're done.
Port 5544 already in use?
The development server will automatically select an alternative port and display it in the terminal.
Build errors?
node --versionpnpm store prunenode_modules and reinstall: rm -rf node_modules && pnpm installBlank screen or WebGL errors?
Catalog not loading?
api.keeptrack.space is accessibleKeepTrack is transitioning from a monolithic structure to a clean, layered architecture that separates the rendering engine from application-specific features.
src/
โโโ engine/ # Core rendering engine (satellite-agnostic)
โ โโโ core/ # Dependency injection, event bus
โ โโโ plugins/ # Plugin system base classes
โ โโโ rendering/ # WebGL pipeline, shaders
โ โโโ input/ # Camera, mouse, keyboard controls
โ โโโ ootk/ # Git Submodule of the OOTK Library
โ โโโ utils/ # Utilities and helpers
โ
โโโ app/ # Application layer (satellite-specific)
โ โโโ data/ # Catalog management, TLE parsing
โ โโโ sensors/ # Ground station calculations
โ โโโ ui/ # UI components and menus
โ โโโ utils/ # App-specific utilities
โ
โโโ plugins/ # Feature modules (optional functionality)
โ โโโ sensor/ # Sensor management UI
โ โโโ analysis/ # Orbit analysis tools
โ โโโ screen-recorder/ # Recording functionality
โ โโโ ... # 50+ modular plugins
โ
โโโ webworker/ # Background computation
โ โโโ positionCruncher.ts # Real-time position updates
โ โโโ orbitCruncher.ts # Orbit line generation
โ
โโโ settings/ # Configuration management
engine/rendering/)engine/camera/)engine/plugins/)app/data/)webworker/)The engine should be satellite-agnostic and reusable for other space applications:
The app layer contains domain-specific logic:
Plugins are optional features that can be enabled/disabled:
For contributors: Keep engine code generic. Put satellite-specific logic in the app layer or plugins.
We welcome contributions! Whether you're fixing bugs, adding features, improving documentation, or creating new plugins, your help is appreciated.
git clone https://github.com/YOUR-USERNAME/keeptrack.spacegit checkout -b feature/my-awesome-featurepnpm run lint (auto-fix with pnpm run lint:fix)git push origin feature/my-awesome-featuredevelop branch (not main)NOTE: Please avoid auto-formatting code outside of your requested changes. Format the line(s) you wish to edit, not the whole file.
pnpm run lint (Biome check) before committingpnpm test and refer to the Regression Testing DocumentationThe easiest way to add features is via the plugin system. Plugins are:
Example plugin structure:
import { KeepTrackPlugin } from '@app/engine/plugins/base-plugin';
import myIcon from './icon.png';
export class MyAwesomePlugin extends KeepTrackPlugin {
readonly id = 'MyAwesomePlugin';
dependencies_ = ['SomeOtherPlugin']; // Optional dependencies
bottomIconImg = myIcon;
bottomIconLabel = 'My Feature';
addHtml() {
// UI elements (optional)
}
addJs() {
// Feature initialization
EventBus.getInstance().on(EventBusEvent.KeyDown, (key: string, _code: string, isRepeat: boolean) => {
if (key === 'A' && !isRepeat) {
this.createAnAlert_();
}
});
}
private createAnAlert_() {
// Your logic here
alert('Hello World!!!');
}
}
Place your plugin in src/plugins/my-awesome-plugin/ and register it in the plugin loader.
For changes to the engine, rendering pipeline, or core architecture:
Good PRs include:
Fixes #123)PR Review Process:
develop branchmain in the next releaseThe feature set rivals those of expensive commercial toolkits, and includes:
KeepTrack uses automated deployment via Cloudflare:
main branch (.env.app config) -> keeptrack.spacedevelop branch (.env.app config) -> dev.keeptrack.spacemain branch with (.env.embed config) -> embed.keeptrack.spaceSpecial thanks to all contributors who have helped make KeepTrack better:
Want to be listed? Submit a PR and add yourself!
KeepTrack is based on the original Things in Space by James Yoder, released under the MIT License. While the codebase has been completely 100% rewritten with new architecture, we acknowledge and appreciate the foundational concept.
KeepTrack is proud to have been used by:
Using KeepTrack in your project? Let us know!
KeepTrackโข and KeepTrack.spaceโข are trademarks of Kruczek Labs LLC.
Copyright (C) 2025 Kruczek Labs LLC
KeepTrack is licensed under the GNU Affero General Public License v3.0 or later.
This means you can:
Under these conditions:
And you can't:
You fork KeepTrack, add custom plugins for your astronomy course, and host it on your university's public website for students.
Allowed - You must make your modified source code available (e.g., via GitHub) and clearly state what you changed. Include AGPL license and credit original authors.
You modify KeepTrack, rebrand it as "SatTracker Pro," and offer it as a paid subscription service without sharing your source code.
Not allowed - Running modified AGPL software as a network service counts as distribution. You must provide source code to all users, even paying customers. The AGPL specifically prevents this "SaaS loophole." If this license obligation is violated, Kruczek Labs LLC may take legal action to enforce its intellectual property rights.
You add a new debris collision analysis plugin, publish it on GitHub under AGPL-3.0, and submit a pull request to the main repository.
Allowed and encouraged! - Your plugin is properly licensed, source is available, and you've contributed back to the community. This is exactly what the AGPL is designed to enable.
For more details, see the Full License or visit https://www.gnu.org/licenses/agpl-3.0.html.
The AGPL ensures that improvements to KeepTrack remain open source, even when used as a web service. If you run a modified version, you must make your source code available to users.
Need a different license? Contact Kruczek Labs about commercial licensing options.
KeepTrack uses AI-assisted development tools to maintain a large codebase with an international audience:
Why? Managing 50,000+ lines of code, 50+ plugins, and 12 languages as a solo developer is unsustainable without assistance. These tools enable faster releases, better internationalization, and more features while maintaining quality.
Could KeepTrack exist without AI? Yes - it did for years. But as the project grew to serve commercial, military, and educational institutions worldwide, AI became the most cost-effective way to maintain quality at scale.
For contributors: You are NOT required to use AI tools. Whether you code with Vim or Copilot, contributions are equally valued. We care about code quality, not your workflow.
Disagree with this approach? You're free to fork and maintain your version of KeepTrack however you prefer. We respect all development philosophies.
Made with โค๏ธ by Theodore Kruczek and contributors
Website โข Discord โข Issues โข Discussions โข Contact
Overall
Maintained
Code review
Latest release
Releases this year
43 followers ยท starred Jun 2026
114 followers ยท starred Sep 2024
312 followers ยท starred Dec 2023
๐๐ก TypeScript Astrodynamics Software for Non-Engineers. 3D Visualization of satellite data and the sensors that track them.
See the code
Professional satellite tracking for everyone
KeepTrackโข brings real orbital mechanics to students and educators. Used by EPFLโs Cosmos Archaeology, StarTalk, the 18th Space Defense Squadron, and ethicallyHackingspace, among many others.
Key Features:
Try it live | Installation | Join Discord | Screenshots
Welcome to KeepTrack, an ambitious project aiming to make orbital analysis tools accessible to all. KeepTrack provides a simplified and streamlined experience for learning and interacting with satellites and space debris. Built from the ground up with custom WebGL 2.0 shaders, an internal orbital mechanics library, and a high-performance render loop, this is a lot more than just dots around a globe.
What makes KeepTrack unique:
KeepTrack is used in operations centers, classrooms, and outreach programs around the world.
Browser Requirements: WebGL 2.0 support
KeepTrack is automatically deployed to production and development environments:
To build KeepTrack locally, you need:
# Clone the repository
git clone https://github.com/thkruz/keeptrack.space
cd keeptrack.space
# Install dependencies (this repo uses pnpm; `corepack enable` will provide it)
pnpm install
# Build the project
pnpm run build
# Start development server
pnpm start
Then open: http://localhost:5544 in your browser.
First time setup? The app will download the satellite catalog (~5 MB) on first load. This takes approximately 30 seconds.
| Command | Description |
|---|---|
pnpm start | Start dev server at localhost:5544 |
pnpm run build | Production build to /dist |
pnpm run lint | Check code style |
pnpm run lint:fix | Auto-fix linting issues |
pnpm test | Run test suite |
pnpm run sonar:up | Start a local offline SonarQube server (Docker) |
pnpm run sonar | Run tests with coverage, then analyze against local SonarQube |
pnpm run sonar:down | Stop the local SonarQube server |
Run pnpm run for the full list. Two groups in it are not contributor tasks, and both say so when you run them rather than failing with a stack trace:
pnpm run pro dispatches the commercial edition's tooling, which lives outside this repository, so the command just explains itself here. Nothing in the open-source build depends on it.upload:sourcemaps, release) push to infrastructure this project owns. They stop with a note about the missing credential. Point them at your own Cloudflare account if you want to run your own deployment.pnpm run mesh-viewer is worth knowing about: it serves a standalone viewer that renders any OBJ+MTL through the engine's exact mesh pipeline (layout, scale, shader, log depth), which is how models are checked before they ship. scripts/mesh-viewer/capture-meshes.ts and capture-angles.ts take headless verification shots through the same viewer.
Run the same static analysis we use, fully offline and self-hosted, with only Docker installed. No account setup, token juggling, or cloud service. See docs-local/sonarqube.md for details. The whole thing is one command:
pnpm run sonar # starts SonarQube, runs tests + coverage, scans, opens the dashboard
It auto-starts a local SonarQube server, mints an analysis token for you, enables anonymous access so the dashboard needs no login, runs the scan, and opens http://localhost:9000/dashboard?id=keeptrack. Run pnpm run sonar:down to stop the server when you're done.
Port 5544 already in use?
The development server will automatically select an alternative port and display it in the terminal.
Build errors?
node --versionpnpm store prunenode_modules and reinstall: rm -rf node_modules && pnpm installBlank screen or WebGL errors?
Catalog not loading?
api.keeptrack.space is accessibleKeepTrack is transitioning from a monolithic structure to a clean, layered architecture that separates the rendering engine from application-specific features.
src/
โโโ engine/ # Core rendering engine (satellite-agnostic)
โ โโโ core/ # Dependency injection, event bus
โ โโโ plugins/ # Plugin system base classes
โ โโโ rendering/ # WebGL pipeline, shaders
โ โโโ input/ # Camera, mouse, keyboard controls
โ โโโ ootk/ # Git Submodule of the OOTK Library
โ โโโ utils/ # Utilities and helpers
โ
โโโ app/ # Application layer (satellite-specific)
โ โโโ data/ # Catalog management, TLE parsing
โ โโโ sensors/ # Ground station calculations
โ โโโ ui/ # UI components and menus
โ โโโ utils/ # App-specific utilities
โ
โโโ plugins/ # Feature modules (optional functionality)
โ โโโ sensor/ # Sensor management UI
โ โโโ analysis/ # Orbit analysis tools
โ โโโ screen-recorder/ # Recording functionality
โ โโโ ... # 50+ modular plugins
โ
โโโ webworker/ # Background computation
โ โโโ positionCruncher.ts # Real-time position updates
โ โโโ orbitCruncher.ts # Orbit line generation
โ
โโโ settings/ # Configuration management
engine/rendering/)engine/camera/)engine/plugins/)app/data/)webworker/)The engine should be satellite-agnostic and reusable for other space applications:
The app layer contains domain-specific logic:
Plugins are optional features that can be enabled/disabled:
For contributors: Keep engine code generic. Put satellite-specific logic in the app layer or plugins.
We welcome contributions! Whether you're fixing bugs, adding features, improving documentation, or creating new plugins, your help is appreciated.
git clone https://github.com/YOUR-USERNAME/keeptrack.spacegit checkout -b feature/my-awesome-featurepnpm run lint (auto-fix with pnpm run lint:fix)git push origin feature/my-awesome-featuredevelop branch (not main)NOTE: Please avoid auto-formatting code outside of your requested changes. Format the line(s) you wish to edit, not the whole file.
pnpm run lint (Biome check) before committingpnpm test and refer to the Regression Testing DocumentationThe easiest way to add features is via the plugin system. Plugins are:
Example plugin structure:
import { KeepTrackPlugin } from '@app/engine/plugins/base-plugin';
import myIcon from './icon.png';
export class MyAwesomePlugin extends KeepTrackPlugin {
readonly id = 'MyAwesomePlugin';
dependencies_ = ['SomeOtherPlugin']; // Optional dependencies
bottomIconImg = myIcon;
bottomIconLabel = 'My Feature';
addHtml() {
// UI elements (optional)
}
addJs() {
// Feature initialization
EventBus.getInstance().on(EventBusEvent.KeyDown, (key: string, _code: string, isRepeat: boolean) => {
if (key === 'A' && !isRepeat) {
this.createAnAlert_();
}
});
}
private createAnAlert_() {
// Your logic here
alert('Hello World!!!');
}
}
Place your plugin in src/plugins/my-awesome-plugin/ and register it in the plugin loader.
For changes to the engine, rendering pipeline, or core architecture:
Good PRs include:
Fixes #123)PR Review Process:
develop branchmain in the next releaseThe feature set rivals those of expensive commercial toolkits, and includes:
KeepTrack uses automated deployment via Cloudflare:
main branch (.env.app config) -> keeptrack.spacedevelop branch (.env.app config) -> dev.keeptrack.spacemain branch with (.env.embed config) -> embed.keeptrack.spaceSpecial thanks to all contributors who have helped make KeepTrack better:
Want to be listed? Submit a PR and add yourself!
KeepTrack is based on the original Things in Space by James Yoder, released under the MIT License. While the codebase has been completely 100% rewritten with new architecture, we acknowledge and appreciate the foundational concept.
KeepTrack is proud to have been used by:
Using KeepTrack in your project? Let us know!
KeepTrackโข and KeepTrack.spaceโข are trademarks of Kruczek Labs LLC.
Copyright (C) 2025 Kruczek Labs LLC
KeepTrack is licensed under the GNU Affero General Public License v3.0 or later.
This means you can:
Under these conditions:
And you can't:
You fork KeepTrack, add custom plugins for your astronomy course, and host it on your university's public website for students.
Allowed - You must make your modified source code available (e.g., via GitHub) and clearly state what you changed. Include AGPL license and credit original authors.
You modify KeepTrack, rebrand it as "SatTracker Pro," and offer it as a paid subscription service without sharing your source code.
Not allowed - Running modified AGPL software as a network service counts as distribution. You must provide source code to all users, even paying customers. The AGPL specifically prevents this "SaaS loophole." If this license obligation is violated, Kruczek Labs LLC may take legal action to enforce its intellectual property rights.
You add a new debris collision analysis plugin, publish it on GitHub under AGPL-3.0, and submit a pull request to the main repository.
Allowed and encouraged! - Your plugin is properly licensed, source is available, and you've contributed back to the community. This is exactly what the AGPL is designed to enable.
For more details, see the Full License or visit https://www.gnu.org/licenses/agpl-3.0.html.
The AGPL ensures that improvements to KeepTrack remain open source, even when used as a web service. If you run a modified version, you must make your source code available to users.
Need a different license? Contact Kruczek Labs about commercial licensing options.
KeepTrack uses AI-assisted development tools to maintain a large codebase with an international audience:
Why? Managing 50,000+ lines of code, 50+ plugins, and 12 languages as a solo developer is unsustainable without assistance. These tools enable faster releases, better internationalization, and more features while maintaining quality.
Could KeepTrack exist without AI? Yes - it did for years. But as the project grew to serve commercial, military, and educational institutions worldwide, AI became the most cost-effective way to maintain quality at scale.
For contributors: You are NOT required to use AI tools. Whether you code with Vim or Copilot, contributions are equally valued. We care about code quality, not your workflow.
Disagree with this approach? You're free to fork and maintain your version of KeepTrack however you prefer. We respect all development philosophies.
Made with โค๏ธ by Theodore Kruczek and contributors
Website โข Discord โข Issues โข Discussions โข Contact
Overall
Maintained
Code review
Latest release
Releases this year
43 followers ยท starred Jun 2026
114 followers ยท starred Sep 2024
312 followers ยท starred Dec 2023