diff --git a/README.md b/README.md
index eaf201d..afe7f8e 100644
--- a/README.md
+++ b/README.md
@@ -4,8 +4,8 @@
> ([Claude Code](https://claude.com/claude-code)).
A GTA Online companion that runs in your browser. Keep it open while you play, and it tracks your
-businesses, safes and cooldowns, so you know when stock is full, a safe needs emptying or a heist
-is ready again.
+businesses, safes and cooldowns, so you know when stock is full or a safe needs
+emptying.
> **Status:** early development. Not usable yet; see the [issues](https://github.com/ToothyDev/LSOS/issues) for what's planned.
diff --git a/docs/decisions/021-no-heist-tracker.md b/docs/decisions/021-no-heist-tracker.md
new file mode 100644
index 0000000..bf3523b
--- /dev/null
+++ b/docs/decisions/021-no-heist-tracker.md
@@ -0,0 +1,19 @@
+# 021: No heist cooldown tracker, no Heists tab
+
+2026-10-15, issue #12.
+
+## Decision
+
+- **No heist cooldowns are tracked**, and the Heists tab is removed. An old `#/heists` link
+ opens the default tab.
+- The research (sources on issue #12) found one cooldown worth a timer: Cayo Perico, 144 minutes
+ solo or 48 with a crew, on real time. Every other heist has 48 minutes with a crew and no
+ sourced solo value, or no cooldown at all.
+- **Not modelled:** the weekly completion bonus from The Kortz Center Heist update (more money for
+ the first finale each week), and the 7-day Cayo Perico period with worse loot. The second
+ would need its own separate tracker.
+
+## Why
+
+A list for one real cooldown is not worth a tab. A new issue can bring the tab back if one of the
+items above turns out to be worth tracking.
diff --git a/docs/decisions/README.md b/docs/decisions/README.md
index 2046958..89c5c65 100644
--- a/docs/decisions/README.md
+++ b/docs/decisions/README.md
@@ -31,3 +31,4 @@ free number, add one line below. **Replacing one:** write a new decision, then m
- [018](018-money-fronts.md) Money Fronts: one Car Wash safe card on the Safes tab, paid by the fronts and other businesses, heat per front (est.), missions and legal jobs
- [019](019-owned-value-bonus.md) Money Front value bonus: owning Car Wash or Smoke on the Water adds 35% to Counterfeit Cash or Weed, far value adds the bonuses (est.), Helitours left out
- [020](020-shut-down.md) Shut-down businesses: a Running/Shut down button next to Owned for biker businesses and the Bunker; shutting down clears the stock; no production, card greyed, nightclub goods locked, nothing to the Money Fronts safe
+- [021](021-no-heist-tracker.md) No heist cooldown tracker: only Cayo Perico has one worth a timer; Heists tab removed
diff --git a/index.html b/index.html
index 9455491..4c30756 100644
--- a/index.html
+++ b/index.html
@@ -19,7 +19,7 @@
diff --git a/package.json b/package.json
index 5af73ba..0a1b0c2 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"private": true,
"license": "MIT",
"version": "0.0.0",
- "description": "Los Santos Operating System: a GTA Online business, heist and cooldown tracker that runs in your browser.",
+ "description": "Los Santos Operating System: a GTA Online business and cooldown tracker that runs in your browser.",
"type": "module",
"engines": {
"node": ">=22"
diff --git a/src/lib/tabs.test.ts b/src/lib/tabs.test.ts
index 874fc26..4679b65 100644
--- a/src/lib/tabs.test.ts
+++ b/src/lib/tabs.test.ts
@@ -7,7 +7,7 @@ describe('tabFromHash', () => {
})
it('accepts a hash without the slash', () => {
- expect(tabFromHash('#heists')).toBe('heists')
+ expect(tabFromHash('#safes')).toBe('safes')
})
it('falls back to the default tab for empty or unknown hashes', () => {
diff --git a/src/lib/tabs.ts b/src/lib/tabs.ts
index f34bcc1..5f334f5 100644
--- a/src/lib/tabs.ts
+++ b/src/lib/tabs.ts
@@ -2,7 +2,6 @@ export const TABS = [
{ id: 'overview', label: 'Overview' },
{ id: 'businesses', label: 'Businesses' },
{ id: 'safes', label: 'Safes' },
- { id: 'heists', label: 'Heists' },
{ id: 'weekly', label: 'Weekly' },
{ id: 'settings', label: 'Settings' },
] as const
@@ -11,7 +10,7 @@ export type TabId = (typeof TABS)[number]['id']
export const DEFAULT_TAB: TabId = 'overview'
-/** Maps a location hash like `#/heists` to a tab id, falling back to the default tab. */
+/** Maps a location hash like `#/safes` to a tab id, falling back to the default tab. */
export function tabFromHash(hash: string): TabId {
const id = hash.replace(/^#\/?/, '')
return TABS.find((tab) => tab.id === id)?.id ?? DEFAULT_TAB