← Back to docs

Tools API - Changelog

Tools API - Changelog

Facebook replies now support both “Svara som” and “Kommentera som” labels while still requiring the correct sender and a unique reply field.

Browser commands now preserve the runtime owner when launched administratively, preventing private receipts that later GUI or scheduled runs cannot read. Publication verification also handles verified-page badges and confirms the author’s numeric identity. Automatic-reply reports also show rejected proposal scores and reasons, making an empty selection explainable.

Botstudio adds neutral automatic replies for all group workflows: preview, explicit permission and pause, relevance settings and a shared daily counter per sender. GUI and scheduled runs share duplicate protection and never blindly repeat uncertain submissions. Existing workflows are not enabled automatically.

Run buttons are removed from Tools Cron and browser script administration. Execute through server commands or scheduling; settings and history remain. Botstudio review and publication actions are unchanged.

Link previews can now be verified when Facebook uses temporary links, by matching the article source, title and publisher image.

Publishing now supports Facebook’s fixed Public/Private group audience label after verifying the destination group URL and sender.

Job lists, browser settings and Botstudio run history have clearer boundaries and more spacing between entries.

Botstudio has prominent links from script views and brings together bots, assignments, mood and AI instructions.

Page switching now waits for Facebook to render its profile list before finding the selected sender.

Botstudio can now revisit recorded own interactions, compare visible thread context and show a read-only report without publishing or using AI.

This changelog highlights user-facing improvements across the Tools platform.

From ISO week 36 of 2026 onward, user-facing changes are consolidated into one weekly section instead of one section per platform version or individual dated change. The repository-root CHANGELOG.md remains the comprehensive engineering history.


2026-W37 - September 7 to September 13

  • Android SocialGPT sign-in (#1041): Android Preferences can now sign in with the user's Tools account and receive a dedicated owner-bound SocialGPT credential without copying a bearer token. The account-session JWT remains separate, and browser-pairing credentials are not reused. Token creation, reuse and rotation are structured-audited and operational failures remain visible without exposing credentials. The flow is covered by focused deterministic backend and Android checks; no live-provider call is required.
  • Scheduled Job Search provider recovery (#1878): Scheduled searches now recover from short-lived OpenAI TPM/rate-limit responses with bounded retries, honoring the provider-requested wait when it is available and using bounded backoff otherwise. Incomplete max_output_tokens responses get one low-reasoning recovery attempt so structured listing output can finish. Permanent authentication, billing and exhausted-credit/quota failures still stop and report the run. Scheduled searches continue to bypass interactive per-user Job Search budget/cooldown guards because they are system work for enabled profiles; provider capacity limits remain external constraints.

Group-name aliases now produce stable numeric post permalinks after publication. A missing or foreign permalink is an uncertain result and never triggers an automatic resend.

AI draft generation now gives reasoning models enough bounded output capacity to finish structured reply suggestions. An incomplete response still stops before publication.

  • Group scan reliability: Botstudio now recognizes Facebook group-name permalinks, filters hidden text and ambiguous shared posts, and expands the sender list when switching profiles.

Botstudio feed selection adds AJAX article selection/removal and schedules only the articles you choose. Sender/destination changes require renewed selection; duplicates and uncertain sends remain blocked.

  • Bot identities and assistants: Discover available Facebook identities without switching, verify a chosen sender, and prepare bounded group-reply drafts with configurable AngryGPT or factual-helper instructions. Hourly discovery is documented; sending remains explicit and new accounts are not automatically activated.

  • Feed thumbnails: Browser social scripts now check a loaded source-linked thumbnail before publishing and after reload. Missing previews stop the run; previous text-only verification did not confirm images.

  • Botstudio and shared bot memory: Administrators can configure server-script workflows, preview exact AI/custom text and inspect publication history. Shared link reservations prevent the same bot or another owner bot from posting the same URL to the same group again. Page/image configurations are stored as future drafts; actual image and own-page publishing remain disabled.

  • Scripted social workflows: Operators can run configured Facebook Page/group jobs from Bash, publish eligible feed articles with custom or ToolsAPI OpenAI text, and prepare tailored replies. Persistent receipts prevent blind duplicate retries; a daily cap and explicit test labels support controlled testing. Cron examples are documented but recurring publication is not enabled automatically.

  • Idempotent AI prefetch close (#1845): Closing a SocialGPT prefetch session is now safe to repeat. If the session was already closed, expired, does not exist, or is not owned by the caller, Tools returns HTTP 200 with an already-closed result instead of an expected 404. Another user's session is never deleted or disclosed, while a live owned session still uses the normal protected cleanup path. This removes noisy cleanup warnings for stale client session ids without changing authentication or the unversioned API URL.

  • Statuspage production route recovery (#1837): The canonical public GUI remains /status and /status/{slug}, but it no longer shares its URL with a physical public/status web-root directory. The verified standalone Statuspage 0.1.3 production bundle now lives under /status-client/, while Laravel serves the SPA shell on /status and tenant selection still uses the /status pathname prefix. Deploy cleanup removes only a verified clean retired Statuspage mount and fails closed on local changes or unverifiable repository state. /services, /me/statuspage, /admin/statuspage, ownership, administrator authorization, audit and operational diagnostics are preserved, and status data still uses the unversioned GET /api/statuspage/{slug} endpoint. No external-provider contract changed, so no live-provider verification is required.

  • Independent browser profiles (initial foundation): Administrators can prepare separate persistent Chrome profiles for automated workflows. Each profile keeps its own sessions and rejects overlapping use while other profiles remain available. This foundation does not activate social posting or a general AI browser agent; account verification and workflow setup are still required.

  • Statuspage production and GUI recovery (#1837): /status now uses the standalone React client's verified production bundle instead of mounting its Vite/TypeScript source tree, removing the deployment layout that could produce an HTTP 403. Canonical tenant URLs continue at /status/{slug} and status data still comes from the unversioned GET /api/statuspage/{slug} endpoint. /services now exposes explicit Public status and account-management links, while /me/statuspage and /admin/statuspage use structured responsive Tools styling for page settings, components and incidents instead of browser-default controls. Ownership, administrator authorization, audit and operational diagnostics are unchanged.

  • Whisper upload recovery (#1291): Local browser media uploads now make one safe automatic retry when the connection fails before the file has finished sending. The retry is shown in the Whisper UI and the normal Tools operational diagnostic remains visible. If the browser already finished sending the request body, Tools does not resend it merely because the response was lost, avoiding duplicate transcription jobs. Current Tools platform version: 1.38.1

  • Reusable platform image targets (#1034): Administrators can now bind generated covers, headers, thumbnails and social preview images to stable Tools resources through /admin/image-generator/targets. Targets reuse the normal queued Image Generator pipeline, keep a stable public image URL across successful regeneration, preserve the previous working asset when regeneration fails, support requested output dimensions and reference images, and keep private targets out of the public media route. /docs cards can use public docs/page/{slug}/thumbnail targets without changing pages that do not have a generated thumbnail.

  • Votech owner workspace layout (#1828): The signed-in /me/votech workspace now renders its overview counters, section tabs, owner forms, badges and action buttons with scoped Tools styling instead of depending on Bootstrap layout classes that are not loaded by the page shell. The four overview counters stay compact on desktop, multi-column forms retain their intended layout, and the workspace collapses cleanly on smaller screens. Existing routes, permissions, AJAX behavior and the unversioned Votech API contract are unchanged. The presentation is protected by focused deterministic render regression coverage; no external provider verification is involved.

  • Votech poll authoring, themes and administration (#1838): Poll creation now uses a structured owner workflow for basics, audience/results, schedule/security and presentation, while slug and raw JSON stay under Advanced. Owners can choose the built-in Classic, Clean, Bold or Dark theme and see that theme in preview and on the public poll. The Votech admin navigation now leads to real protected Overview, Content, Voting, Security, Moderation, Media, Legacy and Platform surfaces instead of disabled placeholders, and administrators get direct links to My Votech and Create poll. Existing owner AJAX/CSRF, authorization, participation behavior and the unversioned Votech API URLs remain unchanged; focused deterministic route/render/theme/admin regressions cover the change.


2026-W36 - August 31 to September 6

Current Tools platform version: 1.38.1

  • OpenAI quota alert throttling (#1424): Repeated credit-exhaustion failures now stay quiet for the normal one-hour operator-notification cooldown after a successful SMS queue instead of sending another email/SMS for every failed request. Scheduled Web Search Alerts also use a bounded 30-minute provider cooldown after the first real quota failure: later scheduled jobs defer without calling OpenAI or creating fake results, while manual/immediate runs still bypass the cooldown and stale runs are still recovered. Failed SMS delivery keeps the short retry path. This is covered deterministically; no OpenAI request or authentication contract changed.

  • Whisper diarization rerun recovery (#1814): Completed transcripts no longer stay falsely locked after a speaker-diarization attempt has already ended. Terminal completed, failed, unavailable, or skipped results clear the old rerun queue marker, existing stale jobs are repaired forward-only, and the saved transcript remains untouched. Pending/running diarization still blocks duplicate requests.

  • Whisper local runtime self-healing (#1816): Tools maintenance now preserves the executable bits of the managed local Whisper CLI and bundled Node/Deno yt-dlp runtimes. A normal full deployment also validates WHISPER_BIN, so an already-installed local runtime with damaged permissions is repaired instead of being accepted only because Python imports still work. Remote worker runtimes are unchanged.

  • DNS CNAME conflict reporting (#1766): Adding an A or AAAA record in the DNS editor now detects an existing CNAME at the same owner name before a local authoritative write. Tools returns HTTP 409 with reason="cname_conflict" and identifies the existing CNAME target instead of presenting the conflict as a misleading post-write 502 verification failure. Provider-backed zones and genuine post-write authoritative verification keep their existing behavior.

  • Whisper live remote progress (#1811): Remote workers can now send bounded live transcript text and timestamped segments while Whisper is still running, so the job page can show real transcript evidence, meaningful progress and throughput before final completion. Runtime logs record stage/progress milestones without logging every heartbeat. Remote completion now relies on the authoritative database transcript instead of a redundant TXT artifact, and transient job-detail polling network failures receive the same short retry treatment as the queue poll.

  • SocialGPT per-browser account sessions (#1800): SocialGPT 1.2.19 can now connect a browser by opening a Tools sign-in/approval page instead of asking the user to copy a bearer token. Every browser receives its own non-rotating ai.socialgpt credential, so the same Tools account can be connected from several browsers without one connection replacing another. My Profile -> SocialGPT sessions lists those browser sessions and can revoke one immediately without disabling the others. The pairing exchange is one-time, expires after ten minutes, and an approved pairing that expires before exchange never mints an active credential.

  • Whisper URL staging handoff (#1764): URL-sourced remote Whisper jobs now keep one shared Tools media namespace between background staging and HTTP worker claims. A completed staging download can therefore be handed directly to the next authenticated remote worker instead of falling back into a repeated waiting_for_tools_media_staging loop. If the configured media root is unavailable, Tools now exposes the real operational failure instead of silently separating staging and claim work into different host-specific storage fallbacks.

  • Whisper remote completion and transcript evidence (#1804): Remote Whisper completions now keep a valid completed database transcript even if only the auxiliary transcript TXT file cannot be written; that storage degradation is reported separately instead of discarding the worker result. Whisper job details also show a separate transcript-status card that distinguishes ordinary progress, transcript text actually received, the worker moving into post-transcription speaker diarization, and a final transcript actually stored. A high progress percentage by itself is no longer presented as proof that the transcript exists in Tools.

  • ModeratorFactory policy layer (#1710): Tools now has an internal moderation policy layer that consumes SpamFactory assessments and bounded owner-profile/application rules and produces allow, review, hide, or quarantine. State changes are owner/admin authorized, owner-bound automation is application-scoped, transitions are reversibly audited, and operational failures remain visible through the independent Tools diagnostics path. ModeratorFactory has no standalone public API or GUI; application adapters provide their own controls.

  • SpamFactory profiles (#1709): Signed-in users can create reusable owner-only scoring profiles at /me/spam/profiles and explicitly select one in the testbench. Profiles can tune engine weights, probability thresholds, deterministic floors and AI model/use, plus bounded site context and classification guidance. Server clients may select an owned profile with optional profile_id on POST /api/spam/analyze. Profiles never activate themselves for an application, and another user's profile cannot be read or used.

  • Whisper durable worker presence and executor identity (#1775): Recent authenticated remote-worker presence now survives ordinary application cache refreshes and deployments within the configured freshness window, so remote-first scheduling does not temporarily fall back to Tools local just because the cache was cold. Whisper queue and job details now identify the actual executor as Tools local or the exact remote worker id instead of using an opaque local process runner as the primary label.

  • Whisper remote-first execution (#1790): Automatic Tools-local transcription now stays on standby whenever any configured remote worker has fresh authenticated presence, including while that worker is already running or transcribing another job. Tools may still download and stage URL media for lease-bound remote transfer, but staging returns the job to the remote queue instead of starting local Whisper. The worker card distinguishes Available, Running, Transcribing and Offline, while Tools local shows Standby when remote workers are online. An administrator can still explicitly target Tools local as an operator override, and job details keep the scheduling target separate from the actual executor.

  • SpamFactory SpamAssassin framing and diagnostics (#1781): SpamFactory now wraps submitted plain text in the same minimal mail envelope used by the SpamAssassin scan API before sending it to spamd, so the two paths no longer drift. When SpamAssassin backends fail, operator diagnostics expose only safe aggregated failure categories such as connection, timeout, read/write or protocol failure while keeping backend addresses, submitted text and raw transport output private. Deterministic framing and transport regressions cover the change; live spamd reachability is not claimed by this update.

  • Statuspage platform backend (#613): Tools now manages owner-scoped status pages at /me/statuspage with administrator oversight at /admin/statuspage. Published pages are available to the standalone public status client through the unversioned GET /api/statuspage/{slug} endpoint, while internal incident notes, unpublished updates and audit data remain private. /statuspage stays as a compatibility route to the standalone /status client.

  • Whisper speaker separation on compressed audio (#1776): Speaker diarization now prepares a stable PCM audio stream before pyannote processes compressed or variable-bitrate media. This prevents exact-chunk sample-count mismatches from discarding speaker labels after an otherwise successful transcription. The temporary audio is removed after the attempt, and a diarization failure still leaves the completed transcript available.

  • SpamFactory testbench (#1703): Signed-in users can now open /me/spam to analyze text and inspect the combined spam probability together with SpamAssassin raw/required/normalized scoring, matched rules and bounded AI evidence. The testbench is discoverable from the dashboard, /services and My Profile, stores no submitted body in its audit metadata, and never performs moderation actions. AI scoring from the web testbench uses only the signed-in user's own non-global provider_openai credential; missing personal AI access simply leaves that engine unavailable/degraded while SpamAssassin can still score.

  • Dependency security maintenance (#1746): The frontend build dependency chain now locks the transitive fast-uri package to patched version 3.1.6, closing the current host-confusion/URI-normalization advisory set while keeping application behavior and public APIs unchanged.

  • Image Generator public by default (#1691): New signed-in Image Generator results are now published by default with their prompt and references/sources, so they appear in the public image archive and can be selected by the existing latest-public-image homepage widget when that widget is enabled. /me/image-generator/profile keeps an explicit owner setting that starts enabled and can be turned off to keep future owned Image Generator results private. Existing images are not changed retroactively, and guest, Slack and unrelated integration images keep their separate defaults.

  • Standalone SpamFactory API (#1702): Authenticated server clients can now call the unversioned POST /api/spam/analyze endpoint with a non-global user-bound API key carrying spam.analyze. The response keeps degraded/unavailable scoring explicit instead of inventing a zero score, filters backend/provider internals before returning per-engine evidence, records safe structured audit metadata, and routes operational scoring failures through the independent Tools diagnostics path without storing submitted content or credentials. AI evidence for API calls can use only the token owner's active non-global provider_openai credential; Tools global/environment OpenAI credentials are never an API fallback.

  • Forced exact Whisper remote-worker execution (#1732): Selecting a named remote worker for an existing Whisper job now means an exact force attempt. The selected worker is prioritized on its next valid current-contract poll across ordinary model or diarization mismatches, so the job either runs or reaches the normal retry/failure path instead of waiting indefinitely. If that remote path cannot consume an external URL directly, Tools downloads and verifies the source first and then serves the staged media to the worker through its authenticated lease instead of forcing the worker to fetch the URL. URL-capable workers can still fetch directly. Automatic scheduling stays capability-gated, Tools local keeps its local safety settings, and authentication, worker-contract, lease, retry and source/media integrity boundaries are never bypassed.

  • Whisper execution-worker compatibility (#1727): An administrator selecting an exact runner for an existing Whisper job now sees whether that runner can currently claim the job. Fresh workers with a known model, diarization or other claim-capability mismatch are marked incompatible with the reason shown and cannot be newly saved, while offline configured workers remain preselectable. Exact targets still never fall back to another runner, and an older incompatible target stays visible so it can be changed.

  • Homepage widget placement (#1685): Featured widgets on the public / homepage now appear directly below the news or fundraiser section, keeping announcements ahead of featured content while preserving the existing widget configuration and publication/privacy rules.

  • Dynamic DNS account routing (#869): Dynamic DNS management now has the canonical personal route /me/dyndns, and it is discoverable from My Profile. Existing /dyndns links and form actions remain compatible, while /admin/dyndns and /api/dyndns stay unchanged. The personal surface is strictly owner-scoped even for administrators, and updater clients continue to use the dedicated owner-bound Dynamic DNS token rather than ordinary Tools API-key scopes.

  • Editable owned guestbooks (#1664): Trusted server-side clients such as Tornevall Tools for WordPress can now update an existing guestbook they own, including its globally unique slug, theme, publishing state and site context, instead of creating a duplicate. Updates require both Guestbook scopes and remain bound to the Tools user that owns the API key.

  • Editable owned guestbooks (#1664, #1677): Trusted server-side clients such as Tornevall Tools for WordPress can now update an existing guestbook they own, including its globally unique slug, theme, publishing state and site context, instead of creating a duplicate. Updates require both Guestbook scopes and remain bound to the Tools user that owns the API key. Partial embed_settings updates preserve existing options that the client does not send.

  • Whisper diarization default (#1669): New Whisper jobs now request speaker diarization by default. The web form keeps an explicit Disable speaker diarization for this job opt-out, which is unchecked by default. API clients can omit disable_diarization to keep diarization enabled and use a truthy value only to skip it. Guest Whisper jobs follow the same default.

  • RSS encoding and mojibake repair (#1573, #1720): RSS Watch now handles repeated high-confidence mojibake in bounded reversible passes, normalizes confirmed RSS/Atom worker payloads before inbound storage, and keeps uncertain or mixed-Unicode text unchanged. Presentation repair remains non-destructive, while signed-in administrators can explicitly repair a damaged stored row from the article/site card; the mutation is text-only, refreshes content hashes when article text changes, and preserves links and permalink identity. /rss/encoding remains a read-only detector and preview tool.

  • Whisper local model limits (#1622): Administrators can choose which Whisper models the main Tools host may execute locally. The local allowlist defaults to small; jobs using other models stay queued for a compatible remote worker instead of falling back to the Tools server, while remote workers keep their own advertised model support.

  • Whisper runner status and performance (#1652): The signed-in /whisper queue now shows remote-worker heartbeat availability together with the local Tools runner, recent observed x realtime throughput, a recent median and a same-model comparison against Tools. The local entry is shown as Disabled rather than as a fallback when local Whisper execution is turned off, and each runner/model keeps its own bounded recent history so a busier runner cannot hide another runner's measurements.

  • Live Whisper worker status (#1656): The signed-in /whisper worker card now refreshes remote-worker presence every 15 seconds while the tab is visible instead of aging only the page-load snapshot. Manual refresh uses the same AJAX request without reloading the page, hidden tabs pause automatic status requests, and a transient refresh failure keeps the latest valid runner list including the scheduled local Tools fallback and its performance summary.

  • Whisper diarization reanalysis (#1587, #1590): When a diarization rerun succeeds and discovers more speakers than before, an existing completed transcript analysis is regenerated automatically from the speaker-aware transcript. Existing translated analysis variants refresh through the normal analysis path, unchanged or failed diarization does not loop, and follow-up hardening keeps raw provider/transport exception text out of operational diagnostics.

  • Slack image option delivery (#1580): Slack image conversations can now turn Assistant-labelled image choices such as A, B and C into real image jobs when the user replies with a compact selection such as A+B+C. The labelled choices must belong to the active image request; ordinary labelled choices such as deployment targets remain normal conversation, and a newer unrelated labelled choice set prevents fallback to older image options. A later instruction such as Upload here now. Widescreen can reuse only a selection made after the currently active image-option set while both remain in bounded context. Selected concepts are uploaded as real Slack files in the same thread, and Tools only counts delivery as successful after Slack confirms a file id, so a generated image that was stored in Tools but not delivered to Slack is reported as a delivery failure instead of a successful upload.

  • Slack image execution recovery (#1621, #1628): If the bot has already committed to create or upload labelled image files such as A.png, B.png and C.png, a later direct execution or delivery demand can recover the nearest matching committed image descriptions even when the earlier compact A+B+C selection has fallen out of bounded Slack context. Direct requests such as Create a random image now also enter the real image-generation path. Generic labelled choices, non-image file promises and mismatched labels remain normal conversation, and Slack delivery still counts as successful only after confirmed file ids are returned.

  • Image Generator completion push (#1581): Authenticated web Image Generator jobs now notify their owner through the existing Tools push channel when generation completes, is rejected, or fails. Android app targets are preferred with browser push as fallback, successful notifications can open the generated image directly, notification failures cannot change a completed image job, and optional email/SMS/callback delivery remains additive.

  • API key scope layout (#1567): The administrator API-key editor now keeps scope checkboxes next to their scope names and descriptions instead of stretching them across the form. Scope choices use a compact responsive card grid in both edit and add flows, and the Global/AI-capable controls follow the same aligned layout on desktop and mobile.

  • RSS admin toolbar spacing (#1572): The /rss editor now keeps its heading and action buttons fully below the fixed admin navbar, including when the navigation wraps or changes height.

  • RSS administration discovery (#1639): /rss now links directly to the existing RSS AI and analytics configuration, and cached category-analysis cards use the clearer Configure AI & analytics label instead of the generic Open Feed Admin. /admin also has a dedicated RSS and Home feed administration group with links to RSS sources, AI/analytics, posting queue when authorized, XPath Lab, cleanup/maintenance, and the separately labelled Home/public-news presentation control.

  • RSS editor cards and AJAX administration (#1504): /rss now groups sources into compact category cards with category contents and individual feed editors collapsed by default. Feed fields save in place with visible status, source creation and deletion refresh the card list without a full page reload, and categories can be renamed directly from the category card. Global category renames update the exact category term across affected feeds and keep related RSS analytics, settings, AI rules, question-category settings and audit history synchronized. The existing Auto source discovery, XPath controls, Authors mappings, hidden/public-hash controls and pagination remain available.

  • RSS AI report lifecycle (#1490): Daily, weekly, monthly and yearly category/site AI reports are managed by the period buckets they actually cover, with independent keep_all or overwrite retention, exact previous-period comparison, reusable report instructions and the administrator surface at /admin/rss-reports. Overwrite cleanup runs only after the replacement report is ready, so a failed generation cannot delete the latest working report. Historical regeneration cannot select a newer or future bucket as comparison context, and stored context is reused only when it matches the exact expected preceding bucket. Magazine pages intentionally show one selected AI report regardless of retained history and select fallback by report coverage rather than late generation time. Operational failures remain observable even if audit persistence fails.

  • RSS AI category schema repair (#1577): Existing installations now receive a forward-only repair for missing RSS category-analysis variant metadata. This fixes AI report generation that could fail with Unknown column 'variant_key' when the historical migration had been recorded without creating its columns. Existing report data is retained and backfilled as the default Swedish variant where needed.

  • Stable RSS category links (#1638): RSS categories now keep a stable explicit slug that can be edited independently from the display name in /rss. Renaming a category preserves its current slug by default, changing the slug keeps previous slugs as aliases, and historical rename records can recover older selectors so existing /feed/c/..., Cards and /api/rss/feed/... links continue to resolve after category renames.

  • Whisper public share controls (#1532): Creating or disabling a public transcript share link on the signed-in Whisper job page now happens in place with AJAX, so the job page no longer reloads. The share URL, timestamps, visit count and referrer summary refresh immediately, while the existing CSRF-protected forms remain available as a no-JavaScript fallback.

  • RSS junk-normalizer safety (#1524): Renderer consent copy is now ignored only when surrounding embed/consent markup identifies it as machine-owned helper content, so ordinary article prose with similar wording remains a real revision. Quoted JSON-like cache timestamps are normalized alongside unquoted machine metadata to prevent another class of junk-only RSS versions.

  • Runtime defaults (#1546): Administrators can now change registered operational defaults at /admin/config-defaults without editing .env or deploying. The new database-backed registry uses environment values only for the first bootstrap of matching keys, audits every changed value, and applies updates immediately. OpenAI's default and recovery output-token budgets are the first consumers, so large workloads are no longer constrained by the previous hard-coded 8,000-token runtime ceiling.

  • RSS junk-normalizer safety (#1524, #1537): Renderer consent copy is ignored only when surrounding consent/external-content markup identifies it as machine-owned helper content; generic third-party metadata alone is not enough to discard visible prose, so ordinary article wording remains a real revision. Quoted JSON-like cache timestamps are normalized alongside unquoted machine metadata to prevent another class of junk-only RSS versions.

  • Hidden-feed RSS magazine links (#1476): Per-site Cards links now keep hidden feeds on their existing public-hash path instead of exposing a numeric feed id that could only lead to a 404.

  • Magazine analysis controls (#1476): Switching between the selected analysis and all analysis variants now preserves the current pagination and history query controls instead of resetting the magazine view.

  • Whisper public-share magazine view (#1530, #1552): Public transcript links now open in a reading-first magazine layout with the stored analysis at the top, the human-friendly transcript directly below it and the raw transcript collapsed until requested. Owner and visitor AI questions remain below the transcript, followed by comments and the existing share/source/statistics details. Adding ?full to the same share URL opens the previous detailed layout. Magazine cards now also use the configured card foreground together with the card background, so custom Appearance palettes remain readable.

  • Whisper owner AI waiting state (#1533): Ask AI now keeps the submitted question as the compact visible line while the real answer is pending, with an indeterminate progress bar and elapsed waiting time. The full question/instruction context stays behind Show instruction, and completed history titles use the owner's actual question instead of the internal Whisper/source context wrapper.

Previous Tools platform version: 1.36.0


2026-08-31

Tools platform version: 1.28.0 Tools platform version: 1.36.2

  • RSS generated-noise protection (#1478): RSS version comparison now recognizes classes of structurally generated embed, cache and runtime metadata instead of handling only one oEmbed key shape. Changing cache/embed identifiers, request/session metadata, nonces, runtime UUID values and cache timestamps can be ignored when they are clearly machine-owned, while real visible word, number, time, punctuation and ordinary URL changes remain distinct strict revisions.
  • Consistent release history (#1448): The public and canonical Tools changelogs now follow one corrected release sequence after several concurrent merges had duplicated, skipped and reused recent version markers. The valid Tools 1.29.1 release is restored, the never-finalized 1.29.2 marker is retired, and its Whisper completion-report improvements are recorded under the valid Tools 1.32.1 release.
  • Stable public changelog rendering (#1448): The public changelog now renders the canonical current release together with one corrected recent-release archive instead of combining overlapping release fragments and archives that could duplicate or reorder versions. Older archive files remain preserved as historical snapshots.

Previous Tools platform version: 1.36.1

  • Payments and Google Play: PaymentFactory introduced one shared Shop payment path so providers can verify purchases before they reach the AI Credit ledger, with idempotent handling and compensating transactions for refunds or reversals. Google Play purchases are verified server-side before credit is granted, pending purchases grant nothing, completed purchases cannot be credited twice or claimed by another account, Real-time Developer Notifications trigger a fresh state check, and consumable purchases are finalized only after the entitlement has been stored safely.
  • Menstrual Tracking and personal mail: Period duration and existing notes can be edited directly in Menstrual Tracking history with AJAX while cycle length remains based on registered period starts. Personal mail settings have a home under /me/mail, SpamAssassin has the canonical personal path /me/spamassassin, profile navigation stays visible, and regular users remain bound to their own mailbox while the retained administrator flow is explicitly admin-only.
  • Appearance: /me/appearance applies valid theme and color changes live and saves them in the background. Custom colors can be reset immediately, readable foreground colors are chosen automatically when no explicit text color is set, personal styles can be saved and reused, and /admin/appearance provides the equivalent global-style workflow for the site default. Follow-up maintenance preserves compatibility with already saved Appearance settings.
  • Whisper: Completed jobs can be re-transcribed with another supported model while retained source media exists, with the previous pass kept as read-only revision history including its transcript-dependent analysis, translations, diarization, and speaker edits. Re-transcription fails closed when required media/state is unavailable, URL jobs reuse retained media, and the authenticated API exposes additive unversioned revision/re-transcription endpoints. Browser re-transcription remains session-authenticated and CSRF-protected, while the machine POST /api/whisper/jobs/{jobId}/retranscribe mutation now uses JWT/API identity only and does not let a simultaneous browser session override the bearer caller. Deleting a job removes its revision history, completion/failure mail uses the public Tools job URL and reports diarization details safely, operational diagnostics cover local/remote re-transcription without leaking sensitive context, and audit history gained operator-friendly aliases for easier troubleshooting.
  • Reputation: Reputation became a standalone Tools service with canonical unversioned GET /api/reputation and POST /api/reputation/reports endpoints. Existing SocialGPT reputation paths and older /trust links remain compatibility aliases, while the neutral public/admin paths are /reputation and /admin/reputation. Reputation remains scoped to public content, posts, URLs, and domains rather than people or personal profiles, and private Fact Verify cards are not exposed through public reputation records.
  • DNSBL and Fact Verify: The admin Online Users view can show typed DNSBL/FraudBL category badges for listed visitor IPs while the public online view remains masked. Resolver failover and short-lived caching keep incomplete lookups separate from clean results. Fact Verify Deep Research can finish substantially longer revisions with a 12,000-token default workbench allowance and bounded 32,768-token ceiling, and deeper checks run in place with status/error feedback and revision history instead of requiring a full page navigation.
  • Slack image requests: Short follow-ups such as try again can reuse the most recent explicit image request, retries keep the previous size unless a new format is requested, and supported OpenAI image models can be selected explicitly while gpt-image-1 remains the default when none is named. Slack image delivery now follows Slack's external raw-byte upload flow, can fall back to an authenticated Tools link after the image has been stored safely, recognizes natural model phrases such as GPT Image 1.5, and reports failures through safe operational diagnostics without logging prompts, message bodies, credentials, temporary upload URLs, raw provider errors, or generated image data.
  • RSS Watch: Manual noisy-history cleanup compares meaningful visible text so punctuation-only or URL-only revisions can be collapsed while real wording/number changes stay separate. Cleanup runs with AJAX and keeps a form fallback, and very large histories are read progressively instead of loading every stored body into memory. Per-site magazine Cards views were added alongside category magazines; hidden feeds retain their public-hash links, and switching analysis variants preserves current pagination/history controls. The RSS Add URL Auto flow can now accept a person, publication, organization or subject as plain text: mandatory OpenAI web search must establish a clearly relevant public source before normal WordPress/RSS/Atom/XPath analysis continues. Source discovery is shown in separate source-search, source/feed-check and completion stages, and any RSS/Atom candidate suggested during the search is verified before use. The editor's source-resolution request now uses the authenticated unversioned POST /api/rss/resolve-source JSON endpoint and explicitly rejects browser redirects, preventing a login/HTML redirect from cascading into a misleading URL required analyzer error.
  • Image Generator: Publication management now saves image, prompt, reference/source, and category visibility changes in the background and reflects them without a reload. Bulk publication uses the same live flow with normal form submission as fallback. A personal profile at /me/image-generator/profile can optionally make future owned Image Generator results public automatically; it is off by default and does not alter existing images, guest generations, or unrelated integrations. Follow-up maintenance preserves this behavior and strengthens its automated checks.
  • Facebook Shares: /fb-shares can resolve Facebook's own visible reshare list directly for a signed-in Tools administrator and also keeps Facebook's older shares/view route as an explicit second choice instead of making the two paths mutually exclusive. The page again exposes the numeric Facebook post ID as a first-class result: administrators can resolve and copy it without opening the browser-backed reshare dialog, successful native lookups show it as well, and a native lookup failure still keeps the already-resolved ID visible. Native results are rendered with visible sharers and shared-post links while the original post and legacy share-view link remain available. The prepared Facebook browser profile is serialized across the web lookup, Socdemo playback, recording and profile maintenance so competing Chromium sessions cannot corrupt or invalidate it. Share-count detection accepts abbreviated/localized labels such as 1.2K shares, 1M shares and 1 tn delningar, and large Facebook pages are searched without an arbitrary control-count cutoff. Reshare actor/profile/privacy metadata is bound to the reshare story itself, and matching actor fragments are progressively enriched so an ID-only fragment can gain the matching name and profile URL from later representations without borrowing data from a conflicting actor or the embedded original story. The administrator lookup still requires explicit page request protection, the old public URL-conversion response remains compatible, audit history is forward-only, and failures stay on the normal sanitized operational diagnostics path without exposing Facebook session credentials.
  • Documentation navigation: The preserved historical release archive through Tools 1.36.1 is now classified under Overview in /docs, so it appears with the changelog/history documentation instead of falling back to the general Tools category.
  • Release history and weekly reporting: Concurrent merges had reused or reordered recent Tools version markers. The corrected public history restores the valid 1.29.1 sequence, keeps the never-finalized 1.29.2 marker retired, and records its Whisper completion-report work under valid release 1.32.1. All valid Tools releases shipped on August 31, from 1.29.0 through 1.36.2, are now represented by this single English/Swedish ISO-week report pair instead of separate per-version or dated update files.

2026-08-31

Tools platform version: 1.36.1

  • Ko-fi payment visibility and transfer reconciliation (#1374): Support administrators can see real Ko-fi payments matched to an individual Tools user, including support-only donations. Membership payments keep their configured AI Credit and project-support allocation, while external cash transfers can be reconciled separately without replaying payment processing or changing AI Credits.
  • Image Generator maintenance (#1477): The live publishing and automatic publication behavior introduced in 1.36.0 is unchanged. This maintenance follow-up aligns release metadata and verification coverage with the behavior already shipped.

Previous Tools platform version: 1.36.0


2026-08-31

Tools platform version: 1.36.0

  • Live Image Generator publishing (#1463): The image publication manager saves individual image, prompt, reference/source and category visibility changes over AJAX and applies bulk publication changes without reloading the page. The returned stored state is reflected immediately in the controls.
  • Automatic publication profile (#1463): Signed-in users can opt into automatic publication from /me/image-generator/profile. The setting is off by default, affects only future owned Image Generator results and does not change existing, guest or unrelated integration images.
  • Per-site RSS magazine cards (#1473): Expanded RSS Watch site cards include a Cards action that opens a magazine view scoped to the selected site while preserving pagination, article history and diffs.

Previous Tools platform version: 1.35.5


2026-08-31

Tools platform version: 1.35.5

  • Reliable Slack image delivery (#1453): Slack AI Bot follows Slack's documented external raw-byte upload flow. If Slack still cannot complete delivery after Tools has stored an image, the bot can provide an authenticated Tools link to the saved result.
  • Natural Slack image model names (#1453): Image requests can use names such as image 1.5, GPT Image 1.5 and image 2 in addition to canonical gpt-image-* IDs, while the normal Tools/OpenAI access policy remains authoritative.

Previous Tools platform version: 1.35.4


2026-08-31

Tools platform version: 1.35.4

  • Large RSS history cleanup (#1458): Noisy duplicate cleanup streams the selected article history instead of loading every stored title, description and content body into memory at once, reducing memory pressure for very large histories while keeping the same meaningful-text comparison and AJAX workflow.

Previous Tools platform version: 1.35.3


2026-08-31

Tools platform version: 1.35.3

  • RSS noisy history cleanup (#1456): Entry-level noisy duplicate purge uses the noise-tolerant meaningful text hash it advertises, so punctuation-only and URL-only churn can be removed while real text changes remain separate.
  • AJAX RSS purge (#1456): Purging noisy duplicates reports the result inline and refreshes the entry/history card without a page reload. The normal POST/redirect path remains available when JavaScript is unavailable.

Previous Tools platform version: 1.35.2


2026-08-31

Tools platform version: 1.35.2

  • Whisper audit diagnostics: Whisper audit history exposes operator-friendly event, status, message and meta_json fields alongside the existing structured audit fields so recent job events can be inspected without column-name failures.

Previous Tools platform version: 1.35.1


2026-08-31

Tools platform version: 1.35.1

  • Slack image retry format override (#1445): Follow-up image retries such as Try again in portrait format and Generate it again square remain in image generation, reuse the previous prompt and apply the newly requested size. Retries without a new size keep the previous dimensions.

Previous Tools platform version: 1.35.0


2026-08-31

Tools platform version: 1.35.0

  • Conversational Slack image retries (#1437): Slack AI Bot can reuse the most recent explicit image request from bounded conversation context for short retry follow-ups instead of falling back to ordinary text generation.
  • Slack image model selection (#1437): Slack image requests and retries can explicitly name another supported OpenAI image model while gpt-image-1 remains the default when no model is named.

Previous Tools platform version: 1.34.1


2026-08-31

Tools platform version: 1.34.1

  • DNSBL maintenance and release consistency (#1438): The typed DNSBL/FraudBL behavior from 1.34.0 remains unchanged while the displayed platform version and public release history are kept aligned.
  • Whisper re-transcription runtime diagnostics (#1414): Local and authenticated remote-worker failures during a re-transcription pass are reported through the dedicated operational diagnostics path with safe job, model, revision and correlation context. Retryable failures remain visible, while successful manual recovery is not reported as a false runtime failure.

Previous Tools platform version: 1.34.0


2026-08-31

Tools platform version: 1.34.0

  • Typed DNSBL badges in Online Users (#1412): The authenticated administrative Online Users view shows one badge per current DNSBL/FraudBL reputation category returned for a visitor IP. The public online view remains masked and does not expose DNSBL details.
  • Shared DNSBL lookup reliability (#1412): Online-session enrichment and registration/user-editor checks share resolver failover and short-lived caching, and incomplete resolver responses are not treated or cached as clean results.
  • Longer Fact Verify research output (#1389): Fact Verify deepening keeps a larger bounded output allowance through finalization while mandatory web search and source evidence remain required.
  • AJAX Fact Verify workbench (#1389): Deepening, follow-up and translation actions show running, error and success state in place and refresh the updated fact-check without a full page navigation.

Previous Tools platform version: 1.33.0


2026-08-31

Tools platform version: 1.33.0

  • Standalone ReputationFactory API (#1419): Reputation is exposed through the canonical unversioned GET /api/reputation and POST /api/reputation/reports endpoints. Existing /api/socialgpt/reputation endpoints remain compatible aliases with the same authentication and response contract.
  • Neutral reputation surfaces (#1419): New public and administrative links use /reputation and /admin/reputation, while existing /trust routes remain available for compatibility.
  • Reputation boundaries preserved (#1419): Community reports remain non-authoritative, people and profiles remain invalid targets, and public records continue to hide pending/rejected reports and private Fact Verify material.

Previous Tools platform version: 1.32.1


2026-08-31

Tools platform version: 1.32.1

  • Bearer-authenticated Whisper mutations (#1413): JWT/bearer clients can use the existing unversioned /api/whisper/* mutation endpoints without a browser CSRF token. Browser/session mutations remain CSRF-protected and normal Whisper authentication, permission and ownership checks still apply.
  • Whisper revision cleanup on deletion (#1413): Deleting a Whisper job removes the archived re-transcription revisions owned by that job in the same transaction.
  • Whisper completion reports (#1394): Completion and failure emails use the public Tools job link instead of a worker-local localhost address and include the requested/final speaker-diarization state, provider, detected speaker and labelled-segment counts when available, plus safe warnings or errors.

Previous Tools platform version: 1.32.0


2026-08-31

Tools platform version: 1.32.0

  • Whisper re-transcription with another model (#468): Owners of completed Whisper jobs can queue another transcription pass from retained source media using another model available in the configured runtime. URL-based jobs do not silently download the external source again.
  • Read-only transcript revision history (#468): Before a new pass starts, the completed transcript and related transcript state are archived as a readable revision and remain available from the job page and additive unversioned API endpoints.
  • Owner and concurrency safeguards (#468): Re-transcription remains owner-only, concurrent requests cannot archive the same completed pass twice, and pending translation or diarization blocks a new pass until that work reaches a safe state.

Previous Tools platform version: 1.31.1


2026-08-31

Tools platform version: 1.31.1

  • Appearance maintenance (#1408): Existing saved themes, colors and reusable appearance styles continue to work while the maintenance follow-up keeps compatibility and verification aligned with the live Appearance editor introduced in 1.31.0.

Previous Tools platform version: 1.31.0


2026-08-31

Tools platform version: 1.31.0

  • Live Appearance editor (#1397): /me/appearance applies valid theme and color changes to the page and preview immediately while saving them to the signed-in account in the background. Resetting custom colors follows the same immediate save behavior.
  • Automatic readable foreground colors (#1397): When custom page, card, navigation or primary-action backgrounds change, Tools derives a readable foreground color unless the corresponding text color was explicitly selected.
  • Reusable personal and global styles (#1397): Users can save, apply and delete named personal styles, while administrators can manage site-default custom colors and reusable global styles from /admin/appearance.

Previous Tools platform version: 1.30.1


2026-08-31

Tools platform version: 1.30.1

  • Personal SpamAssassin list handling (#1396): Browser list requests require the signed-in session. Regular users remain bound to their own mailbox, while the retained legacy administrator surface can target another mailbox only for an authenticated administrator.
  • Persistent My Profile mail shell (#1396): /me/mail and /me/spamassassin keep My Profile navigation visible while preserving the older administrator compatibility workflow.
  • Google Play Billing hardening (#1405): RTDN voided-purchase handling performs a fresh authoritative Google lookup before reversal, persists later-cancelled pending purchases as rejected and refuses to rewrite immutable product or AI Credit grant facts after a purchase has been recorded.

Previous Tools platform version: 1.30.0


2026-08-31

Tools platform version: 1.30.0

  • Google Play Billing for Shop AI Credits (#1020): Android clients can submit completed Google Play one-time purchases to the unversioned Shop API. Tools verifies the purchase with Google before crediting, uses durable idempotent purchase identity and prevents cross-user purchase claims.
  • Google Play RTDN, recovery and reversals (#1020): Pub/Sub notifications trigger authoritative Android Publisher lookup before accounting changes; pending purchases can reconcile later, and refunds/revocations use compensating immutable ledger transactions.
  • Deep Research mode for the OpenAI runtime (#1390): Internal OpenAI clients can request research mode through the existing unversioned /api/ai/openai/respond endpoint, forcing web search, stronger research instructions and source-aware evidence checks.
  • Deep Research in Fact Verify (#1390): Fact Verify's existing deepening action uses the research-aware runtime while preserving revisions, captured context and web-search citations.

Previous Tools platform version: 1.29.1


2026-08-31

Tools platform version: 1.29.1

  • Editable Menstrual Tracking history (#1392): Period duration and existing notes can be edited in place and saved with AJAX while retaining the same owner/admin scoping as the rest of Menstrual Tracking.
  • Personal mail configuration in My Profile (#1393): /me/mail shows the account mailbox and links to personal SpamAssassin settings, with /me/spamassassin as the canonical personal address while the older settings address remains available for compatibility.

Previous Tools platform version: 1.29.0


2026-08-31

Tools platform version: 1.29.0

  • Provider-neutral PaymentFactory backend (#1268): Shop funding providers use one shared orchestration contract before reaching canonical Shop accounting. Unknown or disabled providers are rejected before accounting and refunds/reversals use compensating immutable ledger transactions.
  • Payment diagnostics and audit boundary (#1268): PaymentFactory failures that could otherwise lose money or double-credit are reported through the always-on operational diagnostics path independently of structured payment audit records, with safe provider/resource/correlation context and no credentials.

Previous Tools platform version: 1.28.2


2026-08-30

Tools platform version: 1.28.2

  • Forced Tools funding without a reservation (#1385): OpenAI requests that explicitly use the Tools-funded contract keep their preflight funding source through usage accounting even when prepaid enforcement is disabled and no reservation row is created.

Previous Tools platform version: 1.28.1


2026-08-30

Tools platform version: 1.28.1

  • Personal custom colors in Dark mode (#1383): Personal color overrides from /me/appearance apply with the same theme selector specificity as the built-in Dark palette, so saved colors are no longer hidden when Dark is selected.

Previous Tools platform version: 1.28.0


2026-08-30

Tools platform version: 1.28.0

  • Personal themes and custom colors (#1381): Authenticated users can follow the administrator-selected site default or choose Light, Dark or Forum Green and store validated personal page, text, card, border, navigation and accent-color overrides from /me/appearance.

Previous Tools platform version: 1.27.2


2026-08-30

Tools platform version: 1.27.2

  • Request-scoped AI Credit reservation cleanup (#1378): Finishing or cleaning up one Tools-funded AI request can no longer release another overlapping request's prepaid reservation.
  • Forced Tools funding stays billable (#1378): When a client contract explicitly requires Tools-funded AI, the funding source selected during preflight is preserved through usage accounting and settlement.

Previous Tools platform version: 1.27.1


2026-08-23

  • Web Search Alerts 403 verification fallback (#724): Public search results are no longer discarded solely because a publisher rejects Tools' direct verifier with HTTP 403 when the configured verification fallback can confirm the same public URL. Private/local destinations and unsafe redirects remain blocked.

  • Week 34 recaps are preserved as project history: ToolsAPI now keeps both a full development recap and a shorter straight-to-the-point recap for week 34 in Swedish and English. The recaps explain not only what changed, but why the Laravel 13 modernization, GitHub Actions workflow and larger service changes were made, while clearly marking work that still needs real provider or production verification as new problems are discovered.

  • Facebook Bug Bounty Lab 0.3.10 keeps the 0.3.9 persistent-control fixes and reduces stale-tab error noise after an unpacked extension reload or update. The live panel is now the single warning-level reporter for the expected invalidated content-script context, while bridge, diagnostics and React-linked cleanup still stop safely without creating duplicate Chrome extension warnings. Reload the Facebook tab afterwards to inject the fresh extension context.

  • The /services catalogue is now grouped into functional categories instead of mixing public, personal, delegated, integration, DNS and administrative entries in long grids. The Guestbook and DNSBL Proxy Registry are part of the catalogue itself; the dashboard quick-link block no longer appears above the Services page. Existing backend authorization remains unchanged.

Job Search Alert bridge recovery

Job Search now recovers when an older shared Alert Engine mirror was left running, so later searches can continue linking their results and notification state normally. Bridge failures also include safer operational diagnostics without interrupting the primary job search.

  • Job Search can now propose negative keywords from an irrelevant listing. Suggestions must be selected explicitly before they are saved to that listing's own search profile, while keyword exclusions can still be entered manually in the configuration. Visible listings that still match a saved negative keyword in the title, employer, or location now show a "Negativ: ..." badge. The badge is hidden while the listing is dismissed and shown again if the listing is restored.

  • Web Search Alerts exact-name search parity (#605): Production alerts now use the same proven deep web-search model contract as the real OpenAI release smoke. Exact multi-word names and explicit publisher/date qualifiers are preserved as search constraints, and the primary search is instructed to refine same-surname or wrong-subject results before returning an empty result set. The live smoke now verifies an exact-name search instead of only a simple documentation lookup.

  • Web Search Alerts now publish genuinely new verified hits to the normal Tools Notifications inbox and shared notification engine. Zero-new runs stay quiet, and the same completed Alert run cannot publish the shared notification twice.

  • Web Search Alerts now bound built-in provider web-search calls and can recover an incomplete primary response when that required search already exposed usable source metadata. Recovery classifies only those retrieved sources with web search disabled; an incomplete response without usable sources remains a failure. The Alert-specific request budget does not replace Job Search's own provider settings.

  • Web Search Alerts now recover cleanly from interrupted runs (#717): A scheduled alert no longer fails the whole Alert schedule just because the same alert still has an active run. Fresh overlaps are skipped safely, while an older unfinished run can be closed as failed so a later scheduled search can continue instead of leaving the alert permanently stuck.

2026-08-24

  • Platform Jobs service cadence: Administrators can centrally adjust automatic scheduling for Job Search and Web Search Alerts from Platform Jobs. Job Search can keep its daily schedule or use a recurring interval from 5 minutes through 7 days, while Web Search Alerts keep their per-alert intervals and existing owner permission limits.

2026-08-25

  • The public Tools front page now starts with a compact product introduction instead of duplicating service catalogues. /services is the central discovery page and retains entry points that previously lived only in the homepage shortcuts, including SoundCloud, public online sessions and the relevant RSS, DNS and social administration links. Guests get login/account actions directly in the intro, Chrome extensions and the upcoming mobile app are mentioned, and the external news section now uses News from Tornevall Networks while the old WordPress setup placeholder is hidden.

2026-08-27

  • Guestbook submission reliability (#1129): Public guestbook submissions now allow normal browser bursts instead of being blocked after only four requests per minute. The public routes remain rate-limited, but the limit has been raised to 60 submissions per minute so ordinary signing no longer gets stuck behind repeated HTTP 429 responses.

  • Slack traffic diagnostics (#476): RSS entry clicks now use their own configurable Slack log category and known crawler traffic is suppressed. External HTTP referers can be routed through a separate category, while sensitive token-like query values are redacted before forwarding.

  • The global footer now always shows the main Tools platform version as Tools v1.10.0, including for guests.

  • 1.10.0 is the corrected formal baseline for the current post-modernization platform: the Laravel framework replacement was substantial internally but did not intentionally break the public Tools API contract.

  • Existing PHP and Laravel runtime details remain administrator-only diagnostics.

  • The main platform version uses semantic increments: patch for compatible fixes/maintenance, minor for backwards-compatible features, and major for intentionally incompatible public contract changes.

  • Version increments follow the released external contract rather than commit count. API and route URLs remain unversioned.

  • Client apps can read the same public platform version from GET /api/platform; framework/runtime diagnostics are not exposed there.

  • Clients should treat platform metadata as non-critical and cache it instead of adding a version lookup to every ordinary API request.

2026-08-22

  • SoundCloud Profile Insights now renders calculated growth predictions even when their confidence is 0%. The prediction payload explicitly distinguishes calculated results from insufficient-data results, so a flat or poor-fit series no longer falls into the missing-message error path.
  • Web Search Alerts and Job Search now tolerate nested OpenAI Responses metadata where type is non-scalar. Source-aware parsing keeps descending into nested response data without Array to string conversion failures while preserving web_search_call and url_citation detection.

2026-08-21

  • Slack AI Bot direct messages and addressed channel mentions can now generate images through the existing ToolsAPI image service, upload them into the same Slack thread, and answer image-capability questions accurately. Image delivery uses the current files:write Slack upload flow and records secret-safe image lifecycle audit events.

  • Job Search owner email and SMS for genuinely new listings now use the shared Alert Engine delivery ledger. Failed deliveries can retry without rerunning the search, SMS eligibility is rechecked before retry, zero-new runs stay quiet for the owner, and compatibility guards prevent the legacy and generic paths from sending the same result set twice.

  • Job Search profiles now participate in the shared Alert Engine run/result lifecycle while keeping the existing Job Search schedule, profile UI, and owner notification behavior. Searches still execute once, profile notification preferences stay synchronized, and profile transfers keep earlier alert history with the previous owner.

  • SocialGPT → Web Search Alerts (#541): A fact verification in SocialGPT can now be turned into an owned Web Search Alert from both the floating Verify result and the browser side panel. Tools prepares an editable monitoring instruction from the current verification and any follow-up question, and the user explicitly chooses the monitoring duration and check interval before creation. New SocialGPT-created alerts start with email notifications enabled and SMS disabled, while the handoff reuses the user's existing personal SocialGPT access instead of requiring broad Alert management permissions.

  • Web Search Alerts source recovery (#605): Search queries now keep response-format instructions separate from the search intent, request the complete web-search source list, and can recover candidates from already-retrieved sources when the structured result list is empty. Recovery does not perform a second web search, and recovered candidates still pass normal filtering, public-link verification, deduplication and notification rules. Audit distinguishes structured candidates, exposed sources and recovered candidates.

  • Personal SoundCloud connections that are expired, failed, or need reauthentication now show a direct Reauthorize SoundCloud action. It restarts OAuth with the existing app profile and replaces stale tokens without requiring the account to be disconnected first.

  • Web Search Alert form validation now stays in the form instead of being rendered as a service-unavailable HTTP 500 page. A duplicate alert name, for example, returns the normal validation message, preserves the submitted input for correction, and shows the feedback inside the Web Search Alerts view above the alert manager without duplicating the global page message.

  • Slack AI Bot workspace settings now save without a full page reload, report safe metadata-only changes to the configured Slack diagnostics channel, and record a dedicated structured audit event. The polling fallback now checks already known conversations about every 10 seconds while full conversation discovery stays bounded on a slower cadence, reducing the previous up-to-one-minute fallback wait while preserving native Event Subscriptions as the preferred immediate path.

  • Web Search Alert form validation now stays in the form instead of being rendered as a service-unavailable HTTP 500 page. A duplicate alert name, for example, returns the normal validation message and preserves the submitted input for correction.

  • The Guestbook API can now list the current Tools user's owned guestbooks for server-side clients and create new books remotely when a token has both guestbook.write and guestbook.moderate. Ownership always comes from the user behind the token, and WordPress clients can supply site URL, description, and language as context.

  • The public X-bot thread tree now exposes a permission-protected Force reply action for unanswered posts. It reuses the existing review flow and generates a reply candidate without publishing automatically.

  • Scheduled Job Search runs now isolate failures per profile. One broken profile no longer stops the rest of the batch, while Laravel/Slack receive actionable user, profile, run, and error context and the command still reports failure if any profile failed.

  • Documentation views were repaired after Blade compilation failures in production. The Template integrity gate now compiles the full Blade view cache, PHP-lints compiled views, and runs documentation lifecycle tests so the same class of syntax failure is caught before deployment.

  • Slack log routing now separates Tools/audit activity, API request logs, and Laravel/system logs more clearly. API thresholds follow HTTP status, Laravel categories expose only meaningful levels, and the UI uses explicit "and above" wording where a threshold actually applies.

  • Failed x-bot:poll-mentions runs now log the real cause through Laravel before the scheduler command returns an error. The log includes safe context such as account, stage, HTTP status, and rate-limit metadata without tokens, auth headers, or raw X payloads.

2026-08-20

  • Trust became a standalone public product at /trust with separate administration at /admin/trust, moderated reports, and authoritative statuses. Public results count only accepted community reports, unsafe URL schemes are rejected, and multiple targets can be checked in one run. Trust was also moved out of the global navbar into Services, Dashboard, and Admin.
  • The Guestbook platform expanded substantially: hosted books with their own slugs and themes, auto-refreshing embeds, DNSBL status indicators, full Miazma read-only previews, purge/delete controls, user-owned guestbooks with owner isolation, and site-context metadata. Token rotation no longer orphans historical entries because authorization follows the Tools user rather than one exact historical API key.
  • Slack gained instant-save log routing, severity thresholds, bot-first delivery with webhook fallback, an active outbound delivery test, and an :eyes: acknowledgement when a mention begins processing. The AI bot can be installed in multiple workspaces, use preferred source URLs, and optionally make conservative spontaneous replies in allowlisted channels. Direct mentions can also fall back to ordinary channel-message events when app_mention delivery is missing.
  • Deployment continued to stabilize after the Laravel modernization: runtime registry checks get one bounded local repair pass, remaining registry drift becomes a degraded warning before runtime reload and HTTP health verification, CLI and HTTP share one bootstrap-cache fallback, and Composer security audits run against the locked production dependency set before runtime mutation. Deployment results can be reported to Slack even when Laravel itself cannot boot.
  • Storage gained a cleaner user-facing legacy archive and a separate detailed administrator diagnostic view. Legacy import now has a real read-only dry run, browser-based admin workflow, idempotency, and a clearer distinction between verified locations and historical lookup hints instead of inventing clickable URLs.
  • The public X-bot conversation archive moved from a flat timeline to reply trees with parent relationships, branch expand/collapse controls, and more efficient database-backed pagination. Several production failures in statistics and thread views were contained with standalone Blade views and explicit controller data.
  • DNSBL gained per-token/per-user request statistics, machine-readable proxy/Tor TXT metadata, separate Tools-owned source TXT, reporting-site provenance, and ingestion of explicitly opt-in WordPress telemetry. Telemetry is aggregate-only and rejects data such as visitor IPs, comments, email addresses, and raw DNS responses. Visit tracking was also decoupled from a foreign key that could inherit lock contention from token rows.
  • A token-scoped SpamAssassin content-scan API was added with direct spamd protocol support, backend failover, and an admin tester. The implementation and tests existed, but the weekly recap explicitly marked real production traffic against spamd as not yet end-to-end verified at this point.
  • Documentation gained current, deprecated, and historical lifecycle states plus a safe Confluence archive workflow with dry-run and deny-by-default allowlisting. NetCurl 6.1 also received maintained English/Swedish documentation where recovered Confluence details were checked against current code before publication.
  • Admin gained a persistent action inbox/Notifications dropdown for pending DNSBL token requests, OpenAI access requests, and public suggestions. Microsoft To Do now treats transient Graph timeouts as retry/deferred events instead of generating repeated scheduler errors, and a production DynDNS page HTTP 500 was fixed.

2026-08-19

  • Deployment was further hardened after the Laravel 13 migration against stale bootstrap/package caches, incomplete vendor installs, package discovery failures, and HTTP 5xx responses after reload. Runtime permission repair now shows progress and preserves log files instead of risking truncation. The final routine-deploy behavior no longer automatically enables Laravel maintenance mode.
  • The frontend dependency chain moved from Laravel Mix to direct Webpack 5. This removed vulnerable transitive paths including elliptic, webpack-notifier, node-notifier, and the remaining old uuid dependency while preserving existing asset paths and development/HMR workflows.
  • Security Advisory Watch was added as a scheduled internal monitor using OpenAI web search, deduplicated advisories, CVE/source-URL identity, email/SMS thresholds, and an opt-in public RSS feed. The feature was still new and remained subject to practical verification.
  • The Laravel-native Guestbook gained public signing, private email fields, themes, a Shadow DOM embed, admin moderation, scoped server-client API access, live MySQL import with read-only preview, and DNSBL moderation. Import support then expanded to multiple historical books plus standalone bbvote, connie, pv, and simhouse tables.
  • OpenAI Images gained multiple numbered reference images, custom final formats including 4:3, 16:9, 9:16, 4K, and Spotify 3000x3000, a public image archive/publication manager, privacy controls for images/prompts/sources, and direct continuation editing from archived images. Reject/retry, callback flows, and deeper moderation diagnostics also began landing and were still under practical evaluation.
  • SocialGPT gained the first reputation backend for domains, URLs, posts, and public content while explicitly excluding person/profile reputation. URL canonicalization was centralized so known query parameters, including selected Facebook group parameters, can be removed before reputation identity is calculated.
  • SoundCloud OAuth gained PKCE, better refresh-token rotation, a clear needs_reauth state, and visibility directly from the user profile. Terminal refresh failures therefore stop recurring as though a broken connection were still healthy.
  • The official Meta/Facebook/Messenger integration was added with OAuth, Page connections, webhook signature verification, Messenger ingestion/send support, and a data-deletion callback. The weekly recap explicitly marked real Meta traffic as still untested at this point.
  • Online views now separate people from bots/crawlers and show local MaxMind-backed country flags without exposing IP/ASN details publicly. Admin navigation was centralized more clearly under the Admin hub, and BBVote archive routing was restored before Laravel when the web server forwards archive paths to the front controller.
  • yt-dlp deployment moved toward the official standalone binary instead of depending on system Python 3.10. gitsync --repair was also expanded to safely rebuild broken submodule metadata without discarding local content.

2026-08-18

  • ToolsAPI was modernized directly from Laravel 8 to Laravel 13 with PHP 8.3+ and updated framework integrations. The upgrade exposed stale bootstrap/provider caches in production and caused a significant outage involving old Ignition provider references. Cache, autoload, package discovery, runtime, and error-reference handling were hardened during the same release window.
  • Error references became useful even when ordinary Laravel logging is unavailable: safe technical details can be shown publicly, full context remains in operator logs, and the missing maintenance error view was restored so rendering an error does not trigger another error.
  • Slack gained an installable OpenAI bot at /slack-bot with encrypted workspace tokens, a signed Events endpoint, workspace-specific settings, thread replies, and DM support through the existing OpenAI Engine. OAuth completion was fixed so cookie-based session fallback still completes workspace installation correctly.
  • Whisper gained admin-controlled default models and a separate guest-transcription path with Turnstile, one-time email verification, media preflight, lower queue priority, token-protected results, and completion notifications.
  • The X-bot public archive gained a mini-X mode that groups and displays stored conversations where the bot actually published replies. Recalled historical X context can also link back to the public Tools mentions archive.
  • The DNSBL proxy/Tor flow became self-cleaning: ordinary proxies use a configurable failure threshold, checker-owned TXT contains verified endpoint/protocol/anonymity details, and authoritative Tor Project snapshots add/remove Tor exits without treating an unavailable feed as an empty snapshot.
  • Job Search became opt-in at the database-schema level for new accounts and profiles. Scheduled runs can also send separate administrator reports even when a healthy search finds zero new listings, while the owner's existing quiet zero-result behavior is preserved.
  • Unverified accounts gained scheduled reminders, automatic disabling, and final deletion with configurable timing. Verification before deletion can reactivate an account disabled specifically by this policy.
  • Shopify gained an initial Tools-hosted redirect system with merchant/admin UI, AJAX/API CRUD, 301/302/307/308 support, query preservation, expiry, and hit counters.
  • Submodule and deployment handling received multiple safety fixes for broken gitlinks, stale .gitmodules entries, runtime permissions, and log preservation. Admins can also see the active PHP/Laravel runtime versions in the footer.

2026-08-17

  • StorageAPI launched as a modern storage layer with canonical files, multiple locations, image variants, AI analyses, legacy import/reconciliation, metadata editing, soft delete/restore, and granular API scopes. The old filestorage schema remains compatibility/import data and is not written by new uploads.
  • Storage routes and interfaces were fully exposed: /storage, /admin/storage, and /storage/public became reachable with private, unlisted, and public semantics plus stable UUID links. Storage also became discoverable from Dashboard and Services.
  • Geo/network information moved from the initial Cloudflare/RIPEstat approach to local MaxMind GeoLite2 City/ASN databases with caching, geoip:maxmind-sync, and scheduled updating. Country, ASN, and network-owner data are diagnostic enrichment rather than an independent security authority.
  • DNSBL V5 proxy checking was rebuilt around real end-to-end HTTP/SOCKS verification, Tor Project exit checks, normalized proxy hosts/endpoints/history, scoped proxy-sync, public /dnsbl/proxies, a five-minute sweep, and an admin editor. MaxMind data is enrichment only and cannot by itself cause listing or delisting.
  • The BBVote/Votech archive gained index-friendly queries, 2011/2012 views, restored news links, Votech link markers, feature history, and verified historical screenshots. Migrations received additional compatibility for native MySQL prepares and old zero-date defaults without rewriting historical data.
  • Whisper can now receive an initial AI question when a transcription job is created, shows clearer progress for later AI questions, and permits owner-AI prompts up to 12,000 characters.
  • Job Search gained both immediate administrator assignment and user-initiated profile transfers that require recipient approval. Empty profile shells no longer count as active, new profiles start disabled, and administrators can rename/manage profiles without the earlier unrelated MCU permission dependency.
  • /admin/jobs became a platform-wide overview of Laravel scheduler and queue executions with status, duration, latest runs, and retention instead of only representing the custom scheduled_jobs table.
  • Dynamic DNS became discoverable from Services/DNS editor, while its admin view gained improved host/zone management and wildcard-certificate status. DNS admin was also rebuilt with a responsive card layout.
  • DNSBL's RFC1918 purge gained visible progress, the proxy checker became reachable from Admin/Dashboard/Services, and an earlier $key rendering crash on the personal API keys page was fixed.

2026-08-16

  • Let's Encrypt administration can now delete obsolete certificate records together with SAN/domain rows and the stored PEM bundle, with file restoration protection if the database deletion fails. Owner API tokens are retained because they may still be used by other certificates.
  • Scheduled Job Search behavior continued to become quieter for owners: empty/zero-result runs should not create unnecessary user mail, while later administrator reporting provides separate operational visibility.
  • Direct Admin and Let's Encrypt links were removed from the main navbar again; those functions remain reachable through their intended Admin/Services surfaces instead of consuming global navigation space.
  • Online-session views gained country/region and network-owner/ASN enrichment with bot grouping and caching. This first Cloudflare/RIPEstat implementation was replaced the following day by the local MaxMind stack.

2026-08-15

  • Public Whisper shares became resilient to missing interaction tables and Turnstile config caching. GET requests for comments/visitor AI degrade to empty lists instead of HTTP 500 when the migration is absent, and a dedicated repair migration can create missing tables even when an earlier migration was already recorded as executed.
  • Whisper shares gained public visit statistics, full-width form controls, and clearer disabled-state styling for Turnstile-gated actions.
  • Guest Whisper AI gained named rate limiters: signed-in visitors are scoped by account/share, while guests are scoped by session/share with a broader IP/share safety bucket. Separate legitimate guest sessions behind the same NAT therefore no longer share the small six-request bucket.
  • Job Search administrators can move an existing profile's configuration to another user transactionally, with profile-name conflict protection while historical runs/listings remain with the original user.

2026-08-14

  • X-bot reply context now requires complete same-thread ancestry to the conversation root, or a provably complete local chain, before AI reply generation. Missing ancestors and temporary X read failures defer processing instead of producing a reply from incomplete context.
  • Cross-thread memory became a separate AI decision with fail-closed rules. The current reply chain remains authoritative unless the user explicitly asks about another conversation, and technical/image-sensitive requests normally stay inside the current thread. Legacy memory is also filtered at provider level when cross-thread scope was not proven.
  • X image references now follow verified reply ancestry so the nearest real ancestor image wins over unrelated images from a larger forwarded list. A request that only asks to see or link an existing image can no longer accidentally trigger new image generation.
  • Image provenance moved to a shared layer for GUI, API, X, and internal image jobs. Prompt history, effective prompts, provider-revised prompts, reference images, source URLs, external IDs, and derived context can be stored separately from the result image, while historical backfills are explicitly marked partial instead of claiming complete provenance.
  • Whisper became a persistent transcription workbench: owner AI history survives multiple follow-up questions, transcript segments can be edited line-by-line with tags/notes, and edits update the canonical transcript used by later AI. Existing public share links show the current edited version.
  • Public Whisper shares can expose owner AI history, maintain separate visitor AI per signed-in user or guest session, and accept public comments. Interaction POSTs use Turnstile, CSRF, and throttling while visitor-AI history stays isolated between visitors.

Earlier changes

The earlier Tools release history through platform version 1.27.1 remains preserved in the pre-existing archive.