Patch Notes

Five years of the developers' own announcements, in the package and ready to query — 232 notes from July 2021 onward. The catalogs tell you what a number is; these tell you when it became that, and what was said about it at the time. Everything here is a plain function call over data that ships with the install, so it works offline and returns the same answer every time.

The Shape Of A Note

Every function on this page returns notes in this shape, so once you can read one you can read all of them.

interface PatchNote {
  id: string           // the announcement's own message id
  postedAt: string     // ISO timestamp of the original post
  version: string | null
  kind: 'update' | 'hotfix' | 'bugfix' | 'note'
  title: string
  body: string         // the note as written, in markdown
}

Find When Something Arrived

whenIntroduced walks the archive from the oldest note forward and hands back the first one that mentions your term — the announcement where a mechanic first appears.

import { whenIntroduced } from 'thetowersdk/knowledge'

const note = whenIntroduced('shockwave')

console.log(note.version)   // '0.1.29'
console.log(note.postedAt)  // '2021-07-15T…'
console.log(note.title)     // 'v0.1.29 is out for everyone now…'

Search Across Every Note

searchPatchNotes matches on title and body and returns newest first, so the top result is the most recent time the developers wrote about it. Pass a limit when you only want the latest few.

import { searchPatchNotes } from 'thetowersdk/knowledge'

for (const note of searchPatchNotes('guardian', 5)) {
  console.log(`${note.postedAt.slice(0, 10)}  ${note.version ?? '—'}  ${note.title}`)
}

Read One Version, Or A Date Range

patchNotesForVersion takes the version with or without its v, and patchNotesBetween takes two ISO dates — useful for "what changed while I was away". patchNoteVersions lists every version the archive names, which makes a version picker a one-liner.

import {
  patchNotesForVersion,
  patchNotesBetween,
  patchNoteVersions,
  recentPatchNotes
} from 'thetowersdk/knowledge'

patchNotesForVersion('26.1.2')      // 'v26.1.2' works too
patchNotesBetween('2024-01-01', '2024-12-31')
patchNoteVersions()                 // every version named, for a dropdown
recentPatchNotes(5)                 // the latest five, newest first

Build A Changelog Page

Put those together and a browsable archive is a short file. This renders the newest notes with their version and date, grouped the way the announcements arrived.

import { recentPatchNotes, patchNoteVersions } from 'thetowersdk/knowledge'

const versions = patchNoteVersions()
const latest = recentPatchNotes(20)

const html = latest
  .map(
    (note) => `
      <article>
        <h3>${note.title}</h3>
        <p><time datetime="${note.postedAt}">${note.postedAt.slice(0, 10)}</time>
           ${note.version ? ` · v${note.version}` : ''} · ${note.kind}</p>
        <div>${note.body}</div>
      </article>`
  )
  .join('')

console.log(`${versions.length} versions covered`)

Pair It With The Catalogs

The archive is at its best next to the numbers. Show a cost curve from the catalogs and the note that changed it, and a reader gets both the value and the reason for it in one view.

import { LAB_CATALOG } from 'thetowersdk/data'
import { searchPatchNotes } from 'thetowersdk/knowledge'

const lab = LAB_CATALOG.find((entry) => entry.name === 'Attack Speed')
const history = searchPatchNotes(lab.name, 3)

console.log(lab.levels.length, 'levels')
console.log(history.map((note) => note.title))

Each note keeps the id of the announcement it came from, so anything you show can be traced back to the original post.

Knowledge Graph → · Catalogs →