Menu

About Thottbot Forever

From August 2004 until November 2010, Thottbot was where World of Warcraft players went to look things up. It began life in 2001 as a news aggregator for online role-playing games, was rewritten into a searchable WoW database three months before the game launched, and grew into the site everyone had open in a second window: item stats, quest walkthroughs, drop rates, NPC locations and a comment thread under every single page where players told each other where Mankrik’s wife was.

Its data came from players. A Lua plugin, bundled with the Cosmos UI suite, recorded what you saw in game and let you upload it. Coverage depended on who was playing and who bothered to upload, which is exactly what made it feel like a community project rather than a product. ZAM Network bought Wowhead in 2007, ran the two side by side for three years, and folded Thottbot into Wowhead on November 30, 2010.

Why this site was made

World of Warcraft: Forever was announced at BlizzCon on September 12, 2026 as a third World of Warcraft alongside Modern and Classic. It builds on vanilla-era Azeroth with three new zones, over a thousand new quests, nine new dungeons, two new raids and a new playable Skyborne race, and reporting from the announcement has the level cap staying at 60. A new game deserves a new database, built the way the old one was: fast, plain, dense with facts and driven by the people playing it.

Thottbot Forever keeps the parts that mattered: a page for every item, spell, quest, NPC, zone and object; comments under each of them, rated by the community; data uploaded by players; and URLs like /?i=19019 that still work. It drops the parts that did not: it is fast on a phone, it has a proper JSON API, and it runs on modern infrastructure.

Where the data comes from

The site opens with what the game client itself knows, read from Forever’s own data files: every item and spell the client has, the zones and their maps, the dungeons and raids, the flight points, the factions, the professions, the classes, the races and the item sets. When the game is patched, the new build is loaded over it.

What the client cannot say comes from the people playing: creatures, quests, what drops where, who sells and teaches what, and where everything stands. That part of the database starts empty and fills in as players upload what they see, which is how Thottbot worked in the first place. Some items are kept encrypted in the client, and have no name here until somebody sees one in game. See Contribute for how uploads work.

Platforms

Reading the site

  • Any current browser, on a desktop or a phone. Every page is rendered on the server and works with JavaScript turned off; JavaScript only makes the forms smoother.
  • Dark by default, light when your system asks for it, and built to be read with a keyboard alone or a screen reader.
  • Beyond the pages: a JSON API, Atom feeds of the latest comments, the latest additions and what is different in Forever, and search from your browser’s address bar.

In the game

  • The Thottbot Forever addon, for the World of Warcraft: Forever client, records what you see as you play. You upload the file it saves with the Thottbot Forever Uploader; Contribute says how.
  • Signing in, to comment or upload, is with your Battle.net account. The site never sees your password.

Where it runs

  • On Cloudflare Workers, close to wherever you are reading from, with Cloudflare’s own storage beside it: D1, an SQLite database, for the data; KV for caching; R2 for icons, maps, screenshots and uploads.
  • The same code builds for plain Node.js with a local SQLite file, so the site is not tied to one host.

Made with

Open-source software, each piece under its own license. The main parts are below; the full list is under Licenses.

WhatForLicense
SvelteThe components every page is made ofMIT
SvelteKitRendering pages on the server, routing and formsMIT
TypeScriptThe language the site is written inApache-2.0
Tailwind CSSStylingMIT
ZodChecking what the site is sentMIT
uqrDrawing QR codesMIT
ViteBuilding the siteMIT
VitestUnit testsMIT
PlaywrightTesting the pages in a real browserApache-2.0
axe-coreChecking every page’s accessibilityMPL-2.0
ESLint and PrettierKeeping the code tidyMIT
WranglerRunning and publishing the site on CloudflareMIT OR Apache-2.0
FengariRunning the in-game addon’s Lua in its testsMIT

Reading the game’s files

The site’s first data is read out of the game client with tools built on these, run by hand when a new build of the game comes out. None of them runs on the site.

WhatForLicense
wow.exportReading the game client’s tables, icons and mapsMIT
WoWDBDefsThe layouts of the client’s tablesCC BY-SA 4.0 (definitions), BSD-3-Clause (code)
wow-listfileThe names of the client’s filesNot stated; credited with thanks
sharpConverting icons and map tiles for the webApache-2.0, with libvips under LGPL-3.0-or-later

Licenses

The addon

The in-game addon, Thottbot Forever, is under the MIT License.

Fonts

  • Open Sans, which sets the text you are reading, is copyright 2020 The Open Sans Project Authors and licensed under the SIL Open Font License, Version 1.1.
  • Friz Quadrata, which sets the headings and the navigation, was designed by Ernst Friz and Victor Caruso in 1966.

Game content

The names, text, icons and maps of World of Warcraft: Forever are copyright Blizzard Entertainment, Inc., and are shown here as a reference for players. Comments and screenshots belong to the people who posted them.

Every package

Every package installed to build and test the site, and to read the game’s files, with the license it declares. The lists are made from the project’s lockfiles each time the site is built.

The site: 342 packages

MIT (248) · Apache-2.0 (39) · MPL-2.0 (15) · LGPL-3.0-or-later (10) · ISC (9) · BSD-2-Clause (6) · MIT OR Apache-2.0 (4) · Apache-2.0 AND LGPL-3.0-or-later (3) · BSD-3-Clause (3) · 0BSD (1) · Apache-2.0 AND LGPL-3.0-or-later AND MIT (1) · BlueOak-1.0.0 (1) · CC0-1.0 (1) · MIT-0 (1)

The site
PackageLicense
@cacheable/memoryMIT
@cacheable/utilsMIT
@cloudflare/kv-asset-handlerMIT OR Apache-2.0
@cloudflare/unenv-presetMIT OR Apache-2.0
@cloudflare/workerd-darwin-64Apache-2.0
@cloudflare/workerd-darwin-arm64Apache-2.0
@cloudflare/workerd-linux-64Apache-2.0
@cloudflare/workerd-linux-arm64Apache-2.0
@cloudflare/workerd-windows-64Apache-2.0
@cloudflare/workers-typesMIT OR Apache-2.0
@cspotcode/source-map-supportMIT
@emnapi/coreMIT
@emnapi/runtimeMIT
@emnapi/wasi-threadsMIT
@esbuild/aix-ppc64MIT
@esbuild/android-armMIT
@esbuild/android-arm64MIT
@esbuild/android-x64MIT
@esbuild/darwin-arm64MIT
@esbuild/darwin-x64MIT
@esbuild/freebsd-arm64MIT
@esbuild/freebsd-x64MIT
@esbuild/linux-armMIT
@esbuild/linux-arm64MIT
@esbuild/linux-ia32MIT
@esbuild/linux-loong64MIT
@esbuild/linux-mips64elMIT
@esbuild/linux-ppc64MIT
@esbuild/linux-riscv64MIT
@esbuild/linux-s390xMIT
@esbuild/linux-x64MIT
@esbuild/netbsd-arm64MIT
@esbuild/netbsd-x64MIT
@esbuild/openbsd-arm64MIT
@esbuild/openbsd-x64MIT
@esbuild/openharmony-arm64MIT
@esbuild/sunos-x64MIT
@esbuild/win32-arm64MIT
@esbuild/win32-ia32MIT
@esbuild/win32-x64MIT
@eslint-community/eslint-utilsMIT
@eslint-community/regexppMIT
@eslint/config-arrayApache-2.0
@eslint/config-helpersApache-2.0
@eslint/coreApache-2.0
@eslint/jsMIT
@eslint/object-schemaApache-2.0
@eslint/plugin-kitApache-2.0
@humanfs/coreApache-2.0
@humanfs/nodeApache-2.0
@humanfs/typesApache-2.0
@humanwhocodes/module-importerApache-2.0
@humanwhocodes/retryApache-2.0
@img/colourMIT
@img/sharp-darwin-arm64Apache-2.0
@img/sharp-darwin-x64Apache-2.0
@img/sharp-freebsd-wasm32Apache-2.0
@img/sharp-libvips-darwin-arm64LGPL-3.0-or-later
@img/sharp-libvips-darwin-x64LGPL-3.0-or-later
@img/sharp-libvips-linux-armLGPL-3.0-or-later
@img/sharp-libvips-linux-arm64LGPL-3.0-or-later
@img/sharp-libvips-linux-ppc64LGPL-3.0-or-later
@img/sharp-libvips-linux-riscv64LGPL-3.0-or-later
@img/sharp-libvips-linux-s390xLGPL-3.0-or-later
@img/sharp-libvips-linux-x64LGPL-3.0-or-later
@img/sharp-libvips-linuxmusl-arm64LGPL-3.0-or-later
@img/sharp-libvips-linuxmusl-x64LGPL-3.0-or-later
@img/sharp-linux-armApache-2.0
@img/sharp-linux-arm64Apache-2.0
@img/sharp-linux-ppc64Apache-2.0
@img/sharp-linux-riscv64Apache-2.0
@img/sharp-linux-s390xApache-2.0
@img/sharp-linux-x64Apache-2.0
@img/sharp-linuxmusl-arm64Apache-2.0
@img/sharp-linuxmusl-x64Apache-2.0
@img/sharp-wasm32Apache-2.0 AND LGPL-3.0-or-later AND MIT
@img/sharp-webcontainers-wasm32Apache-2.0
@img/sharp-win32-arm64Apache-2.0 AND LGPL-3.0-or-later
@img/sharp-win32-ia32Apache-2.0 AND LGPL-3.0-or-later
@img/sharp-win32-x64Apache-2.0 AND LGPL-3.0-or-later
@jridgewell/gen-mappingMIT
@jridgewell/remappingMIT
@jridgewell/resolve-uriMIT
@jridgewell/sourcemap-codecMIT
@jridgewell/trace-mappingMIT
@jsquash/webpApache-2.0
@keyv/bigmapMIT
@keyv/serializeMIT
@napi-rs/wasm-runtimeMIT
@oxc-project/typesMIT
@polka/urlMIT
@poppinss/colorsMIT
@poppinss/dumperMIT
@poppinss/exceptionMIT
@resvg/resvg-wasmMPL-2.0
@rolldown/binding-android-arm-eabiMIT
@rolldown/binding-android-arm64MIT
@rolldown/binding-darwin-arm64MIT
@rolldown/binding-darwin-x64MIT
@rolldown/binding-freebsd-x64MIT
@rolldown/binding-linux-arm-gnueabihfMIT
@rolldown/binding-linux-arm64-gnuMIT
@rolldown/binding-linux-arm64-muslMIT
@rolldown/binding-linux-ppc64-gnuMIT
@rolldown/binding-linux-s390x-gnuMIT
@rolldown/binding-linux-x64-gnuMIT
@rolldown/binding-linux-x64-muslMIT
@rolldown/binding-openharmony-arm64MIT
@rolldown/binding-win32-arm64-msvcMIT
@rolldown/binding-win32-x64-msvcMIT
@rolldown/pluginutilsMIT
@shuding/opentype.jsMIT
@sindresorhus/isMIT
@speed-highlight/coreCC0-1.0
@standard-schema/specMIT
@sveltejs/acorn-typescriptMIT
@sveltejs/adapter-cloudflareMIT
@sveltejs/adapter-nodeMIT
@sveltejs/kitMIT
@sveltejs/load-configMIT
@sveltejs/vite-plugin-svelteMIT
@tailwindcss/nodeMIT
@tailwindcss/oxideMIT
@tailwindcss/oxide-android-arm64MIT
@tailwindcss/oxide-darwin-arm64MIT
@tailwindcss/oxide-darwin-x64MIT
@tailwindcss/oxide-freebsd-x64MIT
@tailwindcss/oxide-linux-arm-gnueabihfMIT
@tailwindcss/oxide-linux-arm64-gnuMIT
@tailwindcss/oxide-linux-arm64-muslMIT
@tailwindcss/oxide-linux-x64-gnuMIT
@tailwindcss/oxide-linux-x64-muslMIT
@tailwindcss/oxide-wasm32-wasiMIT
@tailwindcss/oxide-win32-arm64-msvcMIT
@tailwindcss/oxide-win32-x64-msvcMIT
@tailwindcss/viteMIT
@tybys/wasm-utilMIT
@types/chaiMIT
@types/deep-eqlMIT
@types/esrecurseMIT
@types/estreeMIT
@types/json-schemaMIT
@types/nodeMIT
@typescript-eslint/eslint-pluginMIT
@typescript-eslint/parserMIT
@typescript-eslint/project-serviceMIT
@typescript-eslint/scope-managerMIT
@typescript-eslint/tsconfig-utilsMIT
@typescript-eslint/type-utilsMIT
@typescript-eslint/typesMIT
@typescript-eslint/typescript-estreeMIT
@typescript-eslint/utilsMIT
@typescript-eslint/visitor-keysMIT
@vitest/mockerMIT
@vitest/spyMIT
acornMIT
acorn-jsxMIT
ajvMIT
aria-queryApache-2.0
assertion-errorMIT
axe-coreMPL-2.0
axobject-queryApache-2.0
balanced-matchMIT
base64-jsMIT
blake3-wasmMIT
brace-expansionMIT
cacheableMIT
camelizeMIT
chaiMIT
chokidarMIT
clsxMIT
color-nameMIT
cookieMIT
cross-spawnMIT
css-background-parserMIT
css-box-shadowMIT
css-color-keywordsISC
css-gradient-parserMIT
css-to-react-nativeMIT
cssescMIT
debugMIT
deep-isMIT
deepmergeMIT
detect-libcApache-2.0
devalueMIT
emoji-regex-xsMIT
enhanced-resolveMIT
error-stack-parser-esMIT
es-module-lexerMIT
esbuildMIT
escape-htmlMIT
escape-string-regexpMIT
eslintMIT
eslint-config-prettierMIT
eslint-plugin-svelteMIT
eslint-scopeBSD-2-Clause
eslint-visitor-keysApache-2.0
esm-envMIT
espreeBSD-2-Clause
esqueryBSD-3-Clause
esrapMIT
esrecurseBSD-2-Clause
estraverseBSD-2-Clause
estree-walkerMIT
esutilsBSD-2-Clause
expect-typeApache-2.0
fast-deep-equalMIT
fast-json-stable-stringifyMIT
fast-levenshteinMIT
fdirMIT
fengariMIT
fflateMIT
file-entry-cacheMIT
find-upMIT
flat-cacheMIT
flattedISC
fseventsMIT
glob-parentISC
globalsMIT
graceful-fsISC
harfbuzzjsMIT
hasheryMIT
hex-rgbMIT
hookifiedMIT
ignoreMIT
imurmurhashMIT
is-extglobMIT
is-globMIT
is-referenceMIT
isexeISC
jitiMIT
json-schema-traverseMIT
json-stable-stringify-without-jsonifyMIT
keyvMIT
kleurMIT
known-css-propertiesMIT
levnMIT
lightningcssMPL-2.0
lightningcss-android-arm64MPL-2.0
lightningcss-darwin-arm64MPL-2.0
lightningcss-darwin-x64MPL-2.0
lightningcss-freebsd-x64MPL-2.0
lightningcss-linux-arm-gnueabihfMPL-2.0
lightningcss-linux-arm64-gnuMPL-2.0
lightningcss-linux-arm64-muslMPL-2.0
lightningcss-linux-x64-gnuMPL-2.0
lightningcss-linux-x64-muslMPL-2.0
lightningcss-win32-arm64-msvcMPL-2.0
lightningcss-win32-x64-msvcMPL-2.0
lilconfigMIT
linebreakMIT
locate-characterMIT
locate-pathMIT
magic-stringMIT
miniflareMIT
minimatchBlueOak-1.0.0
mriMIT
mrmimeMIT
msMIT
nanoidMIT
natural-compareMIT
obugMIT
optionatorMIT
p-limitMIT
p-locateMIT
pakoMIT
parse-css-colorMIT
path-existsMIT
path-keyMIT
path-to-regexpMIT
patheMIT
picocolorsISC
picomatchMIT
playwrightApache-2.0
playwright-coreApache-2.0
postal-mimeMIT-0
postcssMIT
postcss-load-configMIT
postcss-safe-parserMIT
postcss-scssMIT
postcss-selector-parserMIT
postcss-value-parserMIT
prelude-lsMIT
prettierMIT
prettier-plugin-svelteMIT
prettier-plugin-tailwindcssMIT
punycodeMIT
qifiedMIT
readdirpMIT
readline-syncMIT
rolldownMIT
sadeMIT
satoriMPL-2.0
semverISC
sharpApache-2.0
shebang-commandMIT
shebang-regexMIT
sirvMIT
source-map-jsBSD-3-Clause
sprintf-jsBSD-3-Clause
std-envMIT
string.prototype.codepointatMIT
supports-colorMIT
svelteMIT
svelte-checkMIT
svelte-eslint-parserMIT
tailwindcssMIT
tapableMIT
tiny-inflateMIT
tinybenchMIT
tinyexecMIT
tinyglobbyMIT
tmpMIT
totalistMIT
ts-api-utilsMIT
tslib0BSD
type-checkMIT
typescriptApache-2.0
typescript-eslintMIT
undiciMIT
undici-typesMIT
unenvMIT
unicode-trieMIT
uqrMIT
uri-jsBSD-2-Clause
util-deprecateMIT
viteMIT
vitefuMIT
vitestMIT
wasm-feature-detectApache-2.0
whichISC
why-is-node-runningMIT
word-wrapMIT
workerdApache-2.0
wranglerMIT OR Apache-2.0
wsMIT
yamlISC
yocto-queueMIT
youchMIT
youch-coreMIT
zimmerframeMIT
zodMIT
The game-data tools: 34 packages

Apache-2.0 (14) · LGPL-3.0-or-later (10) · MIT (4) · Apache-2.0 AND LGPL-3.0-or-later (3) · 0BSD (1) · Apache-2.0 AND LGPL-3.0-or-later AND MIT (1) · ISC (1)

The game-data tools
PackageLicense
@emnapi/runtimeMIT
@img/colourMIT
@img/sharp-darwin-arm64Apache-2.0
@img/sharp-darwin-x64Apache-2.0
@img/sharp-freebsd-wasm32Apache-2.0
@img/sharp-libvips-darwin-arm64LGPL-3.0-or-later
@img/sharp-libvips-darwin-x64LGPL-3.0-or-later
@img/sharp-libvips-linux-armLGPL-3.0-or-later
@img/sharp-libvips-linux-arm64LGPL-3.0-or-later
@img/sharp-libvips-linux-ppc64LGPL-3.0-or-later
@img/sharp-libvips-linux-riscv64LGPL-3.0-or-later
@img/sharp-libvips-linux-s390xLGPL-3.0-or-later
@img/sharp-libvips-linux-x64LGPL-3.0-or-later
@img/sharp-libvips-linuxmusl-arm64LGPL-3.0-or-later
@img/sharp-libvips-linuxmusl-x64LGPL-3.0-or-later
@img/sharp-linux-armApache-2.0
@img/sharp-linux-arm64Apache-2.0
@img/sharp-linux-ppc64Apache-2.0
@img/sharp-linux-riscv64Apache-2.0
@img/sharp-linux-s390xApache-2.0
@img/sharp-linux-x64Apache-2.0
@img/sharp-linuxmusl-arm64Apache-2.0
@img/sharp-linuxmusl-x64Apache-2.0
@img/sharp-wasm32Apache-2.0 AND LGPL-3.0-or-later AND MIT
@img/sharp-webcontainers-wasm32Apache-2.0
@img/sharp-win32-arm64Apache-2.0 AND LGPL-3.0-or-later
@img/sharp-win32-ia32Apache-2.0 AND LGPL-3.0-or-later
@img/sharp-win32-x64Apache-2.0 AND LGPL-3.0-or-later
detect-libcApache-2.0
pendMIT
semverISC
sharpApache-2.0
tslib0BSD
yauzlMIT

Contact

To reach the administrators about something broken on the site, abuse, your account, a security problem or a legal matter, write to them here, signed in, and they answer on the site; or, without an account, email contact@thottbot-forever.com. A comment that breaks the rules has a Report button of its own, which goes to the moderators; missing or wrong game data belongs in the page’s comments or an upload.

Legal

World of Warcraft, Warcraft and Blizzard Entertainment are trademarks or registered trademarks of Blizzard Entertainment, Inc. in the U.S. and/or other countries. Thottbot Forever is a fan project and is not affiliated with or endorsed by Blizzard Entertainment. Comments are the property of their authors.