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.
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.
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.
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
Tools platform version: 1.28.0 Tools platform version: 1.36.2
Previous Tools platform version: 1.36.1
/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./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.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.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.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.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./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./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./docs, so it appears with the changelog/history documentation instead of falling back to the general Tools category.Tools platform version: 1.36.1
Previous Tools platform version: 1.36.0
Tools platform version: 1.36.0
/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.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
Tools platform version: 1.35.5
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
Tools platform version: 1.35.4
Previous Tools platform version: 1.35.3
Tools platform version: 1.35.3
Previous Tools platform version: 1.35.2
Tools platform version: 1.35.2
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
Tools platform version: 1.35.1
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
Tools platform version: 1.35.0
gpt-image-1 remains the default when no model is named.Previous Tools platform version: 1.34.1
Tools platform version: 1.34.1
Previous Tools platform version: 1.34.0
Tools platform version: 1.34.0
Previous Tools platform version: 1.33.0
Tools platform version: 1.33.0
GET /api/reputation and POST /api/reputation/reports endpoints. Existing /api/socialgpt/reputation endpoints remain compatible aliases with the same authentication and response contract./reputation and /admin/reputation, while existing /trust routes remain available for compatibility.Previous Tools platform version: 1.32.1
Tools platform version: 1.32.1
/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.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
Tools platform version: 1.32.0
Previous Tools platform version: 1.31.1
Tools platform version: 1.31.1
Previous Tools platform version: 1.31.0
Tools platform version: 1.31.0
/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./admin/appearance.Previous Tools platform version: 1.30.1
Tools platform version: 1.30.1
/me/mail and /me/spamassassin keep My Profile navigation visible while preserving the older administrator compatibility workflow.Previous Tools platform version: 1.30.0
Tools platform version: 1.30.0
/api/ai/openai/respond endpoint, forcing web search, stronger research instructions and source-aware evidence checks.Previous Tools platform version: 1.29.1
Tools platform version: 1.29.1
/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
Tools platform version: 1.29.0
Previous Tools platform version: 1.28.2
Tools platform version: 1.28.2
Previous Tools platform version: 1.28.1
Tools platform version: 1.28.1
/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
Tools platform version: 1.28.0
/me/appearance.Previous Tools platform version: 1.27.2
Tools platform version: 1.27.2
Previous Tools platform version: 1.27.1
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 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.
/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.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.
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.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.
/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.: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.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.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.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.elliptic, webpack-notifier, node-notifier, and the remaining old uuid dependency while preserving existing asset paths and development/HMR workflows.books plus standalone bbvote, connie, pv, and simhouse tables.needs_reauth state, and visibility directly from the user profile. Terminal refresh failures therefore stop recurring as though a broken connection were still healthy.gitsync --repair was also expanded to safely rebuild broken submodule metadata without discarding local content./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..gitmodules entries, runtime permissions, and log preservation. Admins can also see the active PHP/Laravel runtime versions in the footer.filestorage schema remains compatibility/import data and is not written by new uploads./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.geoip:maxmind-sync, and scheduled updating. Country, ASN, and network-owner data are diagnostic enrichment rather than an independent security authority.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./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.$key rendering crash on the personal API keys page was fixed.The earlier Tools release history through platform version 1.27.1 remains preserved in the pre-existing archive.