code.pablomurad.com

patchwork-turbo

Feeds patchwork with web pages, sites, other feeds, data files, documents, Go APIs and dependencies, written in Go

  1. 9cfa80a
    Fix stale pages, lost pages and retry storms found in review
    
    State and fetching:
    - Validators, sitemap dates and 404 counts are kept per track, and
      stored only after the track's pages are written. Two tracks reading
      one URL no longer starve each other with 304s, and a failed write is
      redone instead of hidden behind a 304.
    - Changing a track's select or ignore converts its pages again.
    - Concurrent state saves take turns, each with its own temp file; run
      no longer fails tracks that finish together.
    - A failed track waits 15 minutes (or its own interval) instead of
      retrying on every 30-second tick.
    - A host that answered 429 or 503 fails at once while it's paused,
      instead of holding one of the four run slots for up to an hour.
    - check reads the real state and never saves it.
    
    Pages:
    - A 404 or 410 keeps the page; the second in a row removes it.
    - A sitemap with no pages on its own host, or none readable, fails and
      keeps the folder. max_pages limits fetching, never which pages stay.
      A page that fails to convert doesn't record its lastmod.
    - Feed items are named with their link's #fragment; items that still
      collide get a hash, whatever order the feed lists them in.
    - Colliding data paths are sorted and suffixed, so the bytes never
      change between runs and no value is lost.
    - A const or var group keeps its name when it grows: adding C to A, B
      is "Changed: const A", not a breaking removal.
    - URL slugs drop .html, .php and similar: /a.html is "a".
    - DOCX: outline level 9 is body text, text boxes no longer split their
      paragraph, and a truncated or broken document is an error instead of
      a mass removal.
    
    Also: mdtext holds the escapes, tables and whitespace helpers the
    converters had copied; sitemaps may be up to 50 MB; go.mod lists x/mod
    as direct; README and the example config describe the actual layout.
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    

    Pablo Murad

  2. c394743
    Import history from the Internet Archive, add the README
    
    - import-wayback lists a url track's captures (one per day at most, only
      when the bytes changed, the newest ones first), converts each with the
      track's selectors and feeds them to `patchwork snapshot` oldest first.
      The newest copy stays in the output folder, so the first live run's
      change becomes a revision with a note.
    - Tracks that follow one thing write out/<name>.md, so their slug is
      the track name.
    - README: what each track reads, how notes are built, politeness rules,
      limits.
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    

    Pablo Murad

  3. 9e470ae
    Track Go APIs and dependencies
    
    - gocode: one page per package of a Go module with every exported
      declaration, its doc comment and no function bodies. Files are chosen
      for linux/amd64 so every machine writes the same pages; main packages,
      tests and nested modules are skipped. The note leads with what can
      break importers: "Breaking: changed func New, removed func Old.
      Changed: type Thing. Added: type Option".
    - deps: go.mod (with replace lines) and package.json dependencies, one
      per line; the note names what was updated, added and removed.
    - summary: the capped "a, b and 3 more" phrases shared by the notes.
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    

    Pablo Murad

  4. 9e6502c
    Track data files and office documents
    
    - datamd: JSON, YAML and CSV become one list item per field, sorted, so
      patchwork's diff reads as field-level changes. Lists of objects are
      keyed by id, slug, key, name or title when one is unique, so adding an
      element doesn't renumber the rest. The revision note names the fields:
      "plans[Pro].price 49 → 59; added plans[Max].price".
    - officemd: DOCX and ODT headings, paragraphs, lists and tables. DOCX
      headings come from the style's outline level, which works whatever
      language the style names are in.
    - Pages can bring their own change summary; data tracks use it.
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    

    Pablo Murad

  5. e02d112
    Add the skeleton and web tracks
    
    patchwork-turbo turns things that aren't Markdown pages into Markdown
    pages, written into a folder that a normal `patchwork serve` watches.
    The two never import each other.
    
    - config: turbo.yaml with strict keys and defaults; one source per track.
    - out: writes a page only when its content changed, atomically, with a
      revision note that names the time and what changed, so every real
      change becomes a revision and re-fetching costs nothing.
    - fetch: polite HTTP (robots.txt, per-host spacing, conditional GET,
      Retry-After, 2 MB cap).
    - htmlmd: HTML to Markdown blocks with selectors to pick and to ignore.
    - url, sitemap and feed tracks; once, run, check and init commands.
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    

    Pablo Murad