Skip to main content

Quietly preserve the web things you love, forever — a patient, Internet-Archive-only archiving queue.

Project description

Internet Historian 🏛️

tests

Quietly preserve the web things you love, forever.

Internet Historian saves the web pages you care about into the free Internet Archive and keeps trying until each one is safely tucked away — then it re-checks nothing and bothers you about nothing. You point it at pages (or just name a thing you love, and it finds the real pages for you); it runs by itself in the background and makes sure those pages don't quietly disappear from the internet.


Quickstart

Copy-paste this. Three lines and you're archiving:

pipx install internet-historian            # installs the `internet-historian` command onto your PATH
internet-historian setup                   # connects your free Archive account + starts the background job
internet-historian discover "Chiikawa"     # finds the real pages for a thing you love, and offers to save them
  • Line 1 installs the tool with pipx (keeps it isolated; plain pip install internet-historian works too). You need macOS, Python 3.11+, and a free archive.org account.
  • Line 2 walks you through getting your free API keys (it opens the right page), saves them to your macOS Keychain, and installs a launchd job that quietly does the archiving every 10 minutes. You never run anything on a schedule yourself.
  • Line 3 is the fun part: type the name of anything — a show, a band, a webcomic, a fandom — and discover looks it up on Wikipedia/Wikidata, gathers its official site, its Wikipedia article, and its real external links, shows you the list, and queues the ones you pick. No account or API key needed for discovery; it's just Wikipedia.

Swap "Chiikawa" for whatever you want to keep. That's the whole setup.

Prefer to hand it exact links? internet-historian add <url> <url> ... works too (see the command reference).

Import your browser bookmarks

Already have a pile of links saved in your browser? Export them and hand the file over:

internet-historian add --bookmarks ~/Downloads/bookmarks.html

Every browser (Chrome, Firefox, Safari, Edge…) can export bookmarks to an HTML file — that's the file you point at. Internet Historian reads it, skips anything it's already tracking, tells you "N new, M already tracked," and asks before queuing anything. Add --folder "Name" to import just one bookmarks folder (and everything nested under it), and --collection NAME to tag them:

internet-historian add --bookmarks ~/Downloads/bookmarks.html --folder "Keep forever" --collection keepers

Prettier status (optional)

Install the pretty extra and status / diagnose render in color — a one-line summary, a per-collection table with state chips, and a little header:

pipx install "internet-historian[pretty]"   # or, if already installed: pipx inject internet-historian rich
internet-historian status

Pretty status output

It's purely cosmetic and completely optional — without rich installed, everything prints as plain text exactly as before. No new required dependencies.

If you use Claude Code

Internet Historian also grows a natural-language interface if you use Claude Code. Install the skill once:

internet-historian install-skill

Then, in any Claude Code session, just say what you want — no commands to remember:

You: archive Chiikawa stuff

Claude: searches the web for the real, official ちいかわ pages, checks they're live, shows you the list, and queues them to a chiikawa collection — then the background job preserves them, patiently, on its own.

You: how's my archive doing?

Claude: reads back what's preserved, what's still queued, and anything that's stuck.

You: why hasn't that shop page saved yet?

Claude: tells you plainly: just throttled by a busy Archive (leave it — it'll retry) or a genuinely dead link.

The skill just calls the same commands you could run yourself; it's a convenience, not a requirement.

Command reference

Every action is a plain CLI call. (A shorter historian alias is installed too.)

Command What it does
setup Connect your Archive account + install the background job (run once)
discover "TERM" [--collection NAME] Find a subject's official/real pages via Wikipedia & Wikidata, then queue the ones you pick
add URL [URL ...] [--collection NAME] Queue one or more URLs for preservation
add --file urls.txt [--collection NAME] Queue a whole text file of URLs
add --bookmarks export.html [--folder NAME] [--collection NAME] Import URLs from a browser's exported bookmarks HTML
status See what's preserved, queued, or dead
diagnose Plain-English "why isn't this archived yet?" — throttled vs. genuinely dead
pause / resume Stop/restart a single URL or a whole --collection
check Raw Internet Archive capacity right now
install-skill Install the Claude Code skill into ~/.claude/skills

Collections are just tags — group your Chiikawa pages, your webcomics, your blogs. No setup needed.

Why this exists

Web pages die. Fan sites go offline, shops close, links rot. The Internet Archive can preserve almost any public page — but only if someone asks it to, at the right time, and keeps asking when the Archive is too busy to answer. That "keep patiently asking" part is tedious to do by hand. Internet Historian does it for you, forever, in the background.

It was built for one purpose: saving ちいかわ (Chiikawa) pages before they vanish — official sites, the anime, the shops, the wikis. But it works for anything: a band, a webcomic, a favorite blog, a fandom, a single irreplaceable page.

It optimizes for never losing a URL, not for speed. The Wayback Machine throttles when it's busy — Internet Historian treats that as normal weather, waits, and tries again. And again. For as long as it takes.

  • 🗃️ A patient queue, not a scraper. Add URLs once; it preserves them and remembers what's done.
  • 🔁 Throttle-proof. Built around the Internet Archive's real rate limits. Being throttled is expected, not an error.
  • 💀 Knows dead from busy. A 404 or a vanished domain gets flagged as dead — but only after real confirmation. A busy Archive never counts against a page.
  • 🔎 Finds pages for you. discover (and the Claude Code skill) turn a subject's name into its real, official pages — no manual link-hunting.
  • 🔒 Your keys stay yours. API keys live in your macOS Keychain, never in this repo.

How it works (the 60-second version)

  you ──add──▶ queue.db (SQLite) ◀──drain── launchd (every 10 min)
                                              │
                                              ▼
                                   Internet Archive "Save Page Now"
  • historian.py is the whole engine: a queue + an Internet Archive client, in one file.
  • queue.db remembers every URL and its state (queued → submitted → archived / dead).
  • launchd is the heartbeat: it runs internet-historian drain on a timer so you don't have to.
  • Captures use server-side dedup (if_not_archived_within=30d), so already-saved pages aren't needlessly recaptured — they're just recorded as preserved.

Failures are classified carefully: rate-limits and timeouts retry forever with backoff; only a page whose own server keeps answering badly (404, dead DNS, blocked) is marked dead, and only after 3 confirmations spaced a day apart. Being throttled by a busy Archive never kills a URL.

What it does NOT do (by design, for now)

  • One backend: the Internet Archive. No archive.today, no local copies yet. (Local snapshots via monolith are a planned future backend.)
  • No auto-discovery. You add pages (or ask the skill to find them); it doesn't crawl the web hunting for new ones on its own.
  • Social media is best-effort. X/Twitter and Instagram hide content behind login walls, so the Archive often captures a login page instead. Internet Historian will still try, but flags these — it's expected, not a bug.

Related projects

Internet Historian's niche is being a persistent, patient background queue with a conversational control surface: you add things once (or just ask the skill), and it keeps working for weeks without you. Other excellent tools in this space, and how they differ:

  • agude/wayback-machine-archiver — submits the URLs in a sitemap to the Wayback Machine. A one-shot batch script; no persistent queue, backoff, or state that survives between runs.
  • overcast07/wayback-machine-spn-scripts — capable Bash scripts around Save Page Now (outlinks, retries, cross-platform). You run and babysit a session; Internet Historian runs itself indefinitely via launchd.
  • Mearman/mcp-wayback-machine — an MCP server exposing archive/retrieve/search as on-demand tool calls. Ideal for one-off actions inside an agent; it has no durable queue that keeps retrying throttled captures for you.
  • internetarchive/internet-archive-skills — the Internet Archive's official Claude Code skill for uploading, downloading, and searching archive.org items. Complementary: it manages Archive items, not patient web-page (SPN2) capture with backoff.
  • bellingcat/auto-archiver — heavy-duty archiving of links (including media) from a spreadsheet to many backends, built for OSINT/evidence workflows. Far more powerful, and far more to set up; Internet Historian is deliberately tiny, IA-only, and personal.

Windows / Linux

Not yet — but it's close. The engine (historian.py: the queue, the SQLite store, the Archive client) is pure Python and already cross-platform. Only two pieces are macOS-specific:

  1. Key storage uses the macOS Keychain (via the security command). There's already an env-var fallback — set IA_ACCESS_KEY / IA_SECRET_KEY and the engine works anywhere.
  2. The background heartbeat uses launchd. On Linux you'd use a systemd timer or cron; on Windows, Task Scheduler — each just needs to run internet-historian drain (equivalently python -m historian drain) on a timer.

Porting means swapping those two. Contributions very welcome — that's the whole to-do list.

Configuration

Knobs live in config.toml (no secrets there). Sensible defaults ship in the box: 10-minute drain interval, 2 capture slots left free for your own browsing, 30-day dedup window, and a conservative per-URL daily attempt cap. Tweak if you like; the defaults are fine.

Periodic recapture (opt-in). By default a page is archived once and then left alone. To keep a collection fresh — re-snapshotting pages that change over time, like a shop or a news hub — give it a refresh window:

[collections]
chiikawa = { refresh_days = 30 }

Any archived page in that collection older than refresh_days is quietly re-queued on the next drain; its last good snapshot stays on record until a new one lands. Collections you don't list never recapture. The Internet Archive's own 30-day dedup still applies, so a very short refresh_days just re-confirms the existing snapshot rather than spamming captures.

License

MIT — do what you like. Preserve the web things you love.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

internet_historian-0.2.0.tar.gz (39.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

internet_historian-0.2.0-py3-none-any.whl (34.7 kB view details)

Uploaded Python 3

File details

Details for the file internet_historian-0.2.0.tar.gz.

File metadata

  • Download URL: internet_historian-0.2.0.tar.gz
  • Upload date:
  • Size: 39.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for internet_historian-0.2.0.tar.gz
Algorithm Hash digest
SHA256 50685797bf6199382ea0efd4ad358479654d5b648e156c6106fd31de13606ec3
MD5 22935b2ddf8242965a8f3b2258ba88d5
BLAKE2b-256 50e08ec03a7dabebcfb3cae5855ed3f969a571de1c0171e5b3ef232dd73b63b8

See more details on using hashes here.

File details

Details for the file internet_historian-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for internet_historian-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bf8e99f991ea7b8a03b1393f9a8dbcb75c45803adade6b9e0187e14859a1bbca
MD5 8b43b7492ddd029e21c7e1d04f343308
BLAKE2b-256 529895505abbbe8109f97f405a92ed4055a5066b92d12bc772adf81cd4751452

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page