Repository navigation
Releases: jameskomo/docswatcher
Release list
v0.5.2
A quiet release, in the literal sense.
- No more warnings on every run. The binaries and
docswatcher.jarprinted fourWARNING: A restricted method in java.lang.System has been calledlines each time they ran. The tree-sitter parser loads its native library, and Java 24 and later warn about that unless the program says it is allowed. Both now say so: the binaries are built with--enable-native-access=ALL-UNNAMED, and the jar's manifest carriesEnable-Native-Access. Your CI log shows only DocsWatcher's own output.
Nothing else changes; results are identical to 0.5.1. Binaries for Linux x64, macOS arm64 and Windows x64, with checksums.txt. The v0 tag moves to this release, so uses: jameskomo/docswatcher@v0 picks it up with no change.
v0.5.1
A fix release. If a repository's scan failed with a regex error, this is the one to take.
-
A bracket in a .gitignore no longer stops the scan. Frameworks such as Next.js name route
folders with brackets,[slug]or[[...path]], and those names end up in.gitignorefiles. A
line likesrc/app/[[...path]]/page.tsput a bare[inside a character class. The Java engine
reads that as a nested class, so the pattern did not compile and the whole scan of that repository
failed, in the CLI, the GitHub Action, the App and the MCP server alike. The browser engine accepted
the same line, so the two engines also disagreed about it.Both engines now read
[and&inside a class the way git does. A line that still cannot
compile, such as the backwards range[z-a], now matches nothing instead of ending the scan, so one
odd line in someone's ignore file can no longer hide everything else. New shared cases pin both
engines to git's own reading, checked againstgit check-ignore. -
A new Shopify record. The
metafieldIntegercollection source condition is removed in Admin
API 2027-01. The detector finds it both where it is sent (metafieldInteger: { ... }) and where it
is read back (... on CollectionSourceInclusionConditionMetafieldInteger), and leaves its
replacement,metafieldInt, alone. The knowledge watch spotted Shopify's announcement the day it
was published. 316 change records across 27 providers. -
Records expire on their date, and a failure that comes from the date is seen the same day.
Three more records crossed their effective dates and are expired. The nightly CI run now keeps one
rolling issue open while it fails and closes it when it passes, so a failure no commit explains is
noticed the morning it happens. -
Quieter knowledge watch. A forum post's own timestamp (
Jun 22, 2023, 5:23:11 AM 6/22/23) is
no longer reported as deprecation news. A date that comes with anything else still is. -
The fix workflow opens a draft for review. The pull request a fix dispatch opens is now a
labelled draft that says an agent wrote it and could not run your tests, so it is reviewed before
it is merged. -
The calendar fits a phone. A long API name, such as a GraphQL schema coordinate, wraps instead
of pushing the page sideways.
Binaries for Linux x64, macOS arm64 and Windows x64, with checksums.txt. Each is smoke-tested
outside the repository before publication and must report its own version. The v0 tag moves to
this release, so uses: jameskomo/docswatcher@v0 picks it up with no change.
v0.5.0
A correctness release. Nothing new to learn, several things that were quietly wrong and are now right.
-
The watch stopped crying wolf. A source counted as deprecation news if a line held a
deprecation word or a date. Provider pages stamp themselves daily, so every watched page looked
like a shutdown announcement every morning: one issue a day, each claiming twenty-odd sources had
changed, when the lines it had matched wereLast updated 2026-10-01 UTC.and bare dates. A date
on its own is no longer a signal — it is what a page prints when it reprints itself. A date
carried alongside anything else still is, because a table row of model and date is how most
providers actually publish a shutdown. The watch now keeps one rolling issue it rewrites, instead
of opening one a day, and a second run on the same day updates the existing one. -
Records expire when their date arrives. Five records crossed their effective dates between
September 28 and 30 while still marked active, which the validator correctly refuses — a shutdown
that has already happened is not pending. CI had been red for three days with no commit to blame,
and the warning was real but buried inside the daily noise above. Both halves are fixed: the
records are expired, and the signal that would have surfaced them is legible again. -
Six new records, and the fixtures that prove them. Four Gemini 3.8 preview deprecations —
tts, lite-tts, live and live-extended-thinking, shutdown dates still pending — plus the Shopify
POSstaffMemberIdremoval and the Theme CLI 3.83.x password-store cutoff. The knowledge base is
now 315 change records across 27 providers, with 113 fixtures, andvalidatereports no errors. -
The site says what it actually does. Every built feature is named, linked and presented as
available rather than coming-soon. The Teams page links the GitHub App's install page directly,
explains what an ingest token is and when you need one, and says why Send a test is unavailable
instead of simply disabling it. -
A documentation claim that was the wrong way round.
docs/08-features.mdsaid the fix
dispatch carries "the evidence with snippets". It carries structural locators only — path, line,
column — and deliberately so: that payload crosses into another repository's CI, and the snippet
is attacker-controlled text when the scanned repository is public. The code was already right;
the docs would have invited someone to reintroduce the snippets.
Binaries for Linux x64, macOS arm64 and Windows x64, with checksums.txt. Each one is smoke-tested
outside the repository before publication and must report its own version, which is the check that
caught a release claiming to be its predecessor once before.
v0.4.0
- Warned before the date. Teams set where alerts go on the organisation dashboard: up to ten
email addresses and a Slack incoming webhook, 30 and 7 days ahead by default. A daily job sends
each organisation one digest per channel about open findings that just came within a threshold,
with the repositories and links to the lines. Nothing is sent twice, a missed day is caught up
once, and a failed channel is retried. Writers change the settings and can send a test; everyone
who sees the organisation can read them (docs/adr/0010-alerts-before-the-date.md). - Email alerts from the calendar, for anyone. An address and an optional provider; confirmed by
email before anything is sent; 30 and 7 days before each tracked shutdown; one-click unsubscribe
in every email; plain text with no tracking. New public routesPOST /subscribe,
/subscribe/confirmand/unsubscribe. Email is sent through Brevo; without
docswatcher.brevo.api-keythe app starts and says email alerts are off. - What actually runs. The organisation dashboard shows, per repository, which deprecated
calls production made (endpoint, provider, calls, last seen, and the finding each confirms or
the provider's Sunset header) and which open endpoint findings production has never been seen
making. Telemetry comes from the customer's own OpenTelemetry Collector with a per-repository
ingest token, created and revoked on the dashboard by anyone with write access; only its hash
is stored, it can write only its own repository, and the owner token keeps working (migration
V6). A setup guide on the teams page and in the dashboard gives the Collector config, SDK
header capture for Java, Python and Node, and what is sent and kept.
docs/13-runtime-observation.mdno longer suggestshttp/jsonfor the Java and Python SDKs,
which cannot send it. - The App scans in a process of its own. Each scan runs in a separate JVM started from the
App's own jar, with a heap cap (docswatcher.scan.process.heap-mb, 1024), a wall-clock limit
(max-secondsplus a minute, after which it is killed) and none of the App's environment. A
crash in the native parser, a hang or a scan that runs out of memory now fails that scan run
with a plain message, and webhooks, the API and sign-in carry on. It adds a process start of
about 0.6 to 1.5 s per scan;docswatcher.scan.isolation: in-processrestores the old behaviour.
The results are the same either way: one scan function runs in both, and a test compares every
fixture. See ADR 0011. - Runs left running are recovered. A scan run still
runninglong after its time limit (a
restart or a crash stopped it) is failed with an error startingabandoned:and queued again
once, at startup and every five minutes. - The App's configured scan limits now apply to scans that read a team's own API records too;
those used the engine's defaults, which are the same values unless they were changed. - GitLab, beside the GitHub App. Sign in with GitLab (gitlab.com or a self-managed instance, with
theread_apiscope only) and see your GitLab groups on the organisation dashboard, limited to
the projects GitLab lets you read. A maintainer connects a group or project with an access token
(Maintainer role,apiscope) on/app. DocsWatcher stores the token AES-256-GCM encrypted
under a key from a secret file, never in plain text. Each push to the default branch is scanned
with the same engine and limits. Each finding opens an issue, which closes when the code is
gone, and the commit gets aDocsWatcherstatus. The snooze, not-in-prod and not-affected
labels, closing and reopening work as on GitHub. There is no fix pull request on GitLab yet.
Webhooks go to/webhooks/gitlab, authenticated by a per-connection secret token that
DocsWatcher keeps only as a hash. New settings:GITLAB_BASE_URL,GITLAB_CLIENT_ID, and the
secret filesdocswatcher.gitlab.client-secretanddocswatcher.gitlab.token-key. Migration
V7__gitlab.sql. Seedocs/adr/0012-gitlab.mdand "Connecting GitLab" in
docs/07-getting-started.md. GitHub behaviour is unchanged./auth/mealso says which sign-ins
exist (providers) and which one a session used (provider). - GitLab CI template.
include:ci/gitlab/docswatcher.gitlab-ci.ymlfrom a release tag.
The job downloads the Linux binary, checks it against the release'schecksums.txtand fails
closed like the Action does. It fails the pipeline on a breaking finding and writes a Code
Quality report, so findings show in merge requests with their file and line. Variables:
DOCSWATCHER_PATH,DOCSWATCHER_FAIL_ON,DOCSWATCHER_EXCLUDE,DOCSWATCHER_VERSIONand more
(docs/11-ci-integration.md). The old GitLab snippet usedalpine:3, where the glibc binary
cannot run. - The site scans GitLab projects. Paste a gitlab.com project URL, nested groups included, or a
self-managed instance's full URL where the site's policy allows that host. Share links are
?repo=gitlab.com/group/project, and GitHub links are unchanged. - Your own APIs. Describe your internal services' deprecations in a
.docswatcher/directory,
in the knowledge base's format withinternal-ids, and every scan of that repository finds
calls to them. Share them across an organisation through a repository named.docswatcher: the
GitHub App reads it for every repository of the owner and rescans them when it changes, and the
CLI and the Action take it as--knowledge-extraand the newknowledgeinput.
docswatcher validate .docswatcherchecks them. Invalid records are always reported: the CLI
exits 3 and names every error. Seedocs/19-your-own-apis.md. - A
.docswatcher/directory is no longer scanned as code. - Twelve new providers (knowledge 2026.09.26: 27 providers, 309 change records, 111 fixtures):
- Square: the v1 Payments API, OAuth RenewToken, Transactions API writes and the Labor shift
endpoints. - Paystack: the deprecated Check Authorization endpoint.
- X (Twitter) API: v1.1 media upload, search, statuses/filter and oEmbed, and the Account
Activity replay route. - LinkedIn Marketing API: the sunset of every monthly
Linkedin-Versionfrom 202206 to 202609,
and the legacy Lead Sync APIs. - YouTube Data API:
relatedToVideoId,comments.markAsSpam,commentThreads.updateand the
v2 GData feeds. - Discord API: API and Gateway v6, v7 and v8, Create Guild for apps, and the old pin routes.
- Mailchimp: Marketing API 2.0 and Export API 1.0.
- Google Maps Platform: the Legacy Places, Directions and Distance Matrix web services, and
Maps JavaScript API removals (Drawing library, heatmap layer,Marker,KmlLayerand more). - Firebase: Dynamic Links, the legacy FCM APIs, and the Admin SDK's removed send methods.
- Salesforce: API versions 21.0 to 30.0, and SOAP
login(). - HubSpot: Contact Lists v1, HubDB v2, Owners v2, Pipelines v1, and the end of numbered API
versions. - Cohere: model retirements (Embed v2.0, Rerank v2.0, Aya 8B, legacy Command models) and the
deprecated v1 endpoints.
- Square: the v1 Payments API, OAuth RenewToken, Transactions API writes and the Labor shift
Full Changelog: v0.3.1...v0.4.0
v0.3.1
- Native download for Windows x64 (
docswatcher-windows-x64.exe). The Action runs on Windows
runners too, and checks the download againstchecksums.txtlike the others. The 0.3.0 Windows
build left its grammar libraries out of the image; the resource patterns no longer use a
backslash, which the Windows build mangled. - Intel Macs still use
docswatcher.jarwith Java 25: GraalVM Community no longer builds for
macOS x64.
Upgrading from v0.2.1 or earlier? Read the 0.3.0 notes: the Action never failed a build on those releases. https://github.com/jameskomo/docswatcher/blob/main/CHANGELOG.md
Full Changelog: v0.3.0...v0.3.1
v0.3.0
Upgrade if you use the GitHub Action or the native binary
- The Action never failed a build on v0.2.1 and earlier. The Linux native binary printed
{}
for every finding in JSON output, so the Action counted zero breaking findings and passed.
Anyone onjameskomo/docswatcher@v0gets the fix automatically, becausev0now points at
v0.3.0. If you pinversion:tov0.2.1or earlier, remove the pin or setv0.3.0. The Action
now refuses a report whose findings carry no severity, instead of counting it as clean. - The native binary crashed on some repositories (any finding found in more than one place),
exiting with an error instead of reporting. Fixed.
If your pipeline ran DocsWatcher with v0.2.1 or earlier, run it once more on v0.3.0: findings it
should have failed on were passed.
New
- Native downloads for macOS on Apple silicon (
docswatcher-macos-arm64). The Action picks the
file for its runner and checks it against the release'schecksums.txtbefore running it.
Windows and Intel Macs usedocswatcher.jarwith Java 25 for now. - Shopify: GraphQL fields are detected, with records for the
automaticDiscountsand
marketCurrencySettingsUpdateremovals,includeRestOfWorld: trueerroring in 2027-01, and the
script tag changes (docs/adr/0007). - Google: Gemini 2.5 models are limited to users who already used them.
match --report <file>and--inventory <file>give every output from one scan; the Action
now scans once.- The Agents page: try DocsWatcher with your own Claude, OpenAI or Gemini key.
Faster and safer
- Large repositories scan in seconds rather than minutes (llama_index: 8.5 minutes to about 12 s),
with identical results. - Parsing and querying each file is time-bounded, so an unusual file cannot hold up a scan.
- The GitHub App uses REST API version 2026-03-10, sends repository paths correctly, and drops a
cached installation token as soon as the installation changes. knowledge/VERSIONis the one knowledge base version everywhere.
Full Changelog: v0.2.1...v0.3.0