← Back to docs

Tools API - Ändringslogg

Language: SV | EN | SV

Tools API - Ändringslogg

Den här ändringsloggen sammanfattar användarsynliga förbättringar i Tools-plattformen.


2026-04-24

Brandvägg - live-styrning för barn med tabeller, Tools-editor, API och fwmaker-output

  • Tools har nu ett dedikerat live-lager för barns nätstyrning under /firewall/live, separat från den äldre generiska editorn för brandväggstabeller, där operatören kan hantera barn, deras IP-adresser, host block lists, upplösta blockmål och live-regler från ett och samma ställe.
  • Barnvyn i editorn har nu också en barncentrerad multi-select/listbox för host block lists, så selektiv internetspärr kan sparas direkt som “vilka listor ska just detta barn spärras mot?” i stället för att bara bygga på generella enable/disable-flöden för regelrader.
  • Tools exponerar nu en första /api/firewall/*-yta för funktionen, inklusive listning/uppdatering av barn, hantering av barns IP-adresser, hantering av host block lists, live-regler, snabb blockering/upplåsning av barn samt en sync-endpoint för brandväggsomskrivning.
  • GET /api/firewall/children kan nu också innehålla additiva selected_host_block_list_ids, och Tools accepterar nu PUT /api/firewall/children/{child}/host-block-lists så klienter kan spara det barncentrerade selektionsläget direkt.
  • Uppdatering av host block lists gör nu också en best-effort-uppslagning mot RDAP/nätregister för hostnamnsupplösta IP-adresser, så Tools kan lagra CIDR-liknande servicenät när registersvaret visar dem i stället för att bara spara en enda upplöst hostadress.
  • Snabb blockering av barn och synk av selektiva host block lists kan nu riktas mot antingen alla barnets IP-adresser eller bara utvalda barn-IP:n, och firewall-API:t accepterar nu additiva target_scope samt child_ip_address_ids[] för dessa flöden.
  • GET /api/firewall/children och GET /api/firewall/live-child-rules kan nu returnera additiv target-metadata som selected_host_block_list_target_scope, selected_host_block_list_child_ip_address_ids, target_child_ip_address_ids, target_ip_addresses och target_scope_summary så klienter säkert kan rendera exakt per-IP-omfång.
  • Det nya live-state:t lagras nu i dedikerade tabeller i firewall-databasen (child, child_ip_addresses, host_block_lists, host_block_list_addresses, live_child_rules) i stället för att försöka pressa in funktionen i de äldre brandväggstabellerna.
  • Live-schemat innehåller nu också live_child_rule_ip_targets, vilket gör att en live-regel kan gälla alla barnets IP:n eller bara en vald delmängd utan att systemet behöver låtsas att hela barnet har samma blockläge.
  • fwmaker läser nu detta live-state och genererar en dedikerad child_live-chain i FORWARD-flödet, så starka barnblockeringar och selektiva hostlist-blockeringar faktiskt blir iptables-output i stället för bara databasrader.
  • Själva brandväggsgeneratorn har också moderniserats internt: fwmaker använder nu den extraherade helpern firewall_pdo.php i stället för det äldre TorneDB-beroendet, de gamla templateplatshållarna har normaliserats för nyare PHP-versioner, den aktiva bitcom-genereringen har tagits bort, runfwmaker faller nu tillbaka mellan installerade PHP-binärer i stället för att bara dö när php7.2 saknas, och wrappern dämpar nu föråldrade CLI-varningar om mapi.so genom att använda tom PHP scan-dir när pdo_mysql fortfarande finns tillgängligt.

DNSBL-whitelist - ny publik statussida och lokalnäts-rensning

  • Tools har nu en ny publik sida på /dnsbl/statistics, där besökare/operatörer kan se DNSBL-räknarna tillsammans med de aktiva whitelist-raderna som läses från DNSBL_V5.ipwhitelist.
  • Whitelistdelen visar nu radbeskrivningar när de finns, och rader markerade med is_local_network lyfts fram som blacklist-undantagna lokalnätsrader som normalt ska rensas bort om de ändå dyker upp i DNSBL-zonerna.
  • /admin/dnsbl/engine-settings visar nu samma whitelist-/lokalnätsöversikt och har också en dedikerad åtgärd Purge local networks now som tar bort listade blacklist owners vars dekodade IP matchar de aktiva lokalnätsraderna av typen IP/CIDR.
  • Den tidigare RFC1918-baserade hygiene purge finns fortfarande kvar separat, så operatören kan fortsätta rensa både hårdkodade privata nät och tabellstyrda lokalnätsundantag.

DNSBL API - ny stats-endpoint för query-/add-/remove-räknare

  • Tools exponerar nu GET /api/dnsbl/stats, som returnerar API-läsbara räknare för /api/dnsbl/*-trafik samt databasbackade logiska DNSBL-utfall för add/delete/update.
  • DNSBL-adminsidan för engine settings visar nu samma räknare direkt i DNSBL-sektionen, så operatören snabbt kan se hur många additions, removals, dry-runs och already_not_listed-delete-no-ops som har registrerats.
  • Befintliga DNSBL-loggar/audits var redan användbara för manuell felsökning, men de var inte en stabil API-läsbar räknarkälla för POST-baserad add/delete-aktivitet; den nya statspersistensen är nu den kanoniska räknarytan framåt.

DNS- och DNSBL-dokumentation - säkrare publik rendering och tydligare API-exempel

  • Den publika DNS API-guiden (/docs/sv/dns-api) skrevs om för att ta bort trasiga markdown-/exempelblock, justera exemplen till de faktiska /api/dns/*-endpointsen och förklara nuvarande auth-, cache-, sök- och write-flöden tydligare.
  • Den publika DNSBL / FraudBL-guiden (/docs/sv/dnsbl-api) har nu en tydligare snabbstart samt mer praktisk vägledning för tokenkontroll, liveinspektion, add/update, delete och dry-run i dagens ToolsAPI-integrationer.
  • Docs-vyn wrappar nu långa inline-kodsnuttar, URL:er, tabeller och kodblock säkrare så stora API-exempel i mindre grad spräcker layouten i webbläsaren.

2026-04-23

DNSBL-engine - delistkörningar packar nu upp RESEND-wrappermail utan att auto-köra återställda mail

  • dnsbl-engine skannar nu också en dedikerad RESEND-spool under delist/reply-körningar och packar upp bifogade/originala .eml-mail som till exempel ForwardedMessage.eml, så att den yttre SpamAssassin-/Thunderbird-wrappern inte längre blir det som operatören fortsätter att se och återköra.
  • Återställda mail får nu stabila filnamn baserade på Message-ID när det går, vilket gör manuella resend-/omkörningsflöden lättare att följa i spoolen.
  • RESEND är nu unpack-only: de återställda/originala mailen lämnas kvar i RESEND-spoolen och skickas inte automatiskt vidare in i samma delist/reply-körning.
  • När RESEND är en Maildir-sökväg och runnern skannar cur/ skrivs återställda mail nu tillbaka till syskonmappen new/, så mailklienten kan visa det uppackade originalet som ett separat meddelande.
  • Icke-mailbifogningar från dessa wrappermail sparas fortfarande under RESEND/__attachments/ för operatörsinspektion, medan själva wrappermailet städas bort efter lyckad uppackning.
  • Delistläget loggar nu också tydligare att det separata FORUM-bounce-segmentet fortfarande körs tillsammans med delist/reply-hanteringen, så forummottagarstudsar fortsätter att ingå i samma operatörspass.

2026-04-21

Mail Support Assistant - central ärendehistorik lagrar nu full body, och standalone kan kringgå trasig lokal TLS-verifiering

  • POST /api/mail-support-assistant/cases/sync accepterar nu additiva full-body-fält (body_text, body_text_reply_aware, body_html, reply_body_text, reply_body_html), och Tools admin-ärendesidan visar nu detta centralt lagrade innehåll i stället för att bara luta sig mot korta utdrag.
  • Synkade ärenderader bär nu också metadata om source-instance/source-host, vilket gör det tydligare i Tools admin vilken standalone-runner/server som hanterade eller besvarade ett meddelande.
  • Standalone-runnern uppdaterar nu en stabil lokal message copy för varje skannat mail, så dashboarden/manualhanteringen ser betydligt mindre ut som att body-texten försvunnit mellan körningarna.
  • Standalone har nu också explicita env-flaggor för TLS-override både för Tools API-anrop och direkt SMTP (MAIL_ASSISTANT_TOOLS_SSL_VERIFY, MAIL_ASSISTANT_TOOLS_CA_BUNDLE, MAIL_ASSISTANT_SMTP_SSL_VERIFY, MAIL_ASSISTANT_SMTP_CA_FILE), vilket hjälper WSL-/self-signed-miljöer när lokal CA-trust är trasig.

RSS Watch - publika /feed länkar nu direkt till support för frågor, klagomål och rättelser

  • Den publika RSS-sidan visar nu en tydlig support-/kontaktsektion intill befintliga läsar-/disclaimer-delar.
  • Besökare hänvisas nu både till vanliga kontaktsidan och direkt till support@tornevall.net, så feedrelaterade frågor, klagomål och rättelser kan gå rakt in i supportflödet.

Mail Support Assistant - Tools lagrar nu trådade supportärenden och standalone kan rapportera obesvarade mail

  • Den fristående Mail Support Assistant-klienten kan nu synka behandlade inkorgsutfall tillbaka in i Tools som trådade supportärenden, vilket gör konversationerna synliga från /admin/mail-support-assistant i stället för bara i en lokal latest-run-fil.
  • Tools exponerar nu GET /api/mail-support-assistant/cases samt POST /api/mail-support-assistant/cases/sync så standalone-klienten kan hämta nyligen lagrade ärenden och uppdatera ett trådsnapshot tillbaka in i Tools.
  • Standalone-dashboarden kan nu också blanda in en live-preview av olästa IMAP-mail, så oläst supportmail kan dyka upp i assistentens webbgränssnitt även innan en ny sparad körning har hunnit skrivas.
  • Utgående assistentsvar kan nu bifoga en publik Tools-länk för ärendespårning till mottagaren när ärendet hunnit förberedas före leveransen.
  • Standalone kan nu också skicka ett operatörsmejl som sammanfattar vilka meddelanden som inte besvarades under körningen när MAIL_ASSISTANT_UNANSWERED_REPORT_ENABLED är aktiverad.

DNSBL / forumadmin - studsade forummottagare kan nu grupperas automatiskt via ett eget FORUM-spool/API-flöde

  • dnsbl-engine har nu ett dedikerat FORUM-spoolsegment för bounce-/mailer-daemon-mail som är separat från vanlig DNSBL add/delist-hantering, på samma sätt som det tidigare separata DMARC-segmentet.
  • Tools exponerar nu POST /api/dnsbl/forum/bounce, där avvisade mottagaradresser från dessa bounce-mail kan matchas mot vBulletin-användare och läggas i en konfigurerbar forumgrupp för studsad e-post som sekundär grupp.
  • Aktuell grupp-ID för studsad e-post och undantagna forumgrupper är nu konfigurerbara från Tools vBulletin-adminsida, så admin-/operatörsgrupper kan lämnas utanför det automatiska grupperingflödet.
  • Tools exponerar nu också GET /api/dnsbl/engine-settings, som returnerar de normaliserade runtime-inställningarna som dnsbl-engine använder, inklusive forum-bounce-flaggan och gruppkonfigurationen.

Mail Support Assistant - standalone-dashboarden stöder nu manuell hantering, quota-alerts och terminala no-match-stopp

  • Den fristående dashboarden för Mail Support Assistant beter sig nu mer som en lightweight operatörsmailklient: meddelandekorten från senaste körningen kan välja lokal regelkontext, skicka manuellt svar eller markera ett mail som manuellt hanterat/läst utan att invänta nästa cronkörning.
  • Manuella operatörssvar återanvänder nu samma plain-text + stylade HTML-svarspipeline som de automatiska svaren, så manuellt skickade supportsvar får samma synliga format och samma bifogade request-sammanfattning.
  • AI-quota-/billingfel lyfts nu upp som tydliga runtime-alerts i standalone-dashboarden, och standalone kan valfritt skicka cooldown-begränsad operatörsnotis när MAIL_ASSISTANT_QUOTA_ALERT_EMAIL är konfigurerad.
  • När den strikta AI-/slutfallbacken för omatchade mail verkligen har utvärderats men ändå slutar i ett terminalt reject-/error-utfall markerar standalone-runnern nu meddelandet som läst för manuell uppföljning, så pollningen av olästa mail inte fortsätter att köra samma no-match-AI i all evighet.

Mail Support Assistant - standalone-körningar är nu overlapsäkra och återanvänder ett stabilt ärende-id i ämnesraden

  • Fristående CLI-/dry-run-körningar tar nu en lokal run lock innan olästa mail pollas, så överlappande cron-/dashboard-invokeringar hoppas över rent i stället för att samma assistentinstans dubbelbehandlar samma mailbox.
  • Overlap-vägen returnerar nu en strukturerad runner_already_active-konflikt tillsammans med metadata om den aktuella låshållaren, vilket gör operatörsfelsökning enklare när en tidigare körning fortfarande pågår.
  • cron-run.sh håller nu också ett eget PID-medvetet shell-lås med städning av stale-lås, så överlappande cronkörningar kan stoppas redan innan PHP-runnern ens startar.
  • Utgående standalone-svar kan nu stämpla in en stabil ärende-/case-tagg i ämnesraden (standardstil ungefär [Ärende MSA-ABC12345]), och senare svar i samma konversation återanvänder samma tagg i stället för att lägga till ett nytt ärende-id varje gång.

Mail Support Assistant - stylade HTML-svar renderar nu markdown i stället för rå markdown-syntax

  • Den stylade HTML-delen i standalone-assistentens utgående svar konverterar nu vanlig markdown från AI-/operatörstext till riktig HTML-struktur som rubriker, listor, länkar, betoning och inline-kod.
  • Plain-text-delen finns fortfarande kvar för kompatibilitet, men HTML-kapabla mailklienter ser nu formaterat innehåll i stället för rå markdown som **fetstil** eller - listpunkter.

OpenAI- / SocialGPT-auditing - Slack-audit visar nu aktör, IP och läsbar felorsak

  • Operatorriktade Slack-auditposter för SocialGPT/OpenAI-requester visar nu löst användaridentitet (namn/e-post när det finns), request-IP och en läsbar error_reason när ett upstream-/provideranrop misslyckas.
  • Sammanfattningen för social media-audit visar nu också aktör och IP direkt i audittexten så det blir lättare att se vem som utlöste requesten som skapade ett svar eller fel.

SocialGPT-svarsendpointen - strukturerade providerfel bryter inte längre fallback-flödet

  • POST /api/ai/socialgpt/respond normaliserar nu strukturerade upstream-fel från OpenAI/provider till vanlig feltext innan retry/fallback-logiken körs.
  • Det förhindrar upprepade Array to string conversion-fel när providern returnerar nästlade JSON-felobjekt i stället för en enkel sträng, samtidigt som det befintliga fallback-flödet fortsätter fungera.

Mail Support Assistant - HTML-/icke-UTF8-body används nu säkrare i matchning och AI-kontext

  • Den fristående mailklienten dekodar nu HTML-baserade inkommande mail till läsbar plain text innan regelmatchning, AI-triage för omatchade mail, bifogade request-sammanfattningar och sparade lokala message copies byggs.
  • MIME-bodydekodningen är nu charset-medveten, vilket förbättrar läsbarheten för icke-UTF8 eller på annat sätt trasiga supportsvar i stället för att det ska se ut som om bara subject användes.
  • Den strikta JSON-parsern för omatchade mail tolererar nu också några vanliga mindre formateringsfel från provider/modell (till exempel smart quotes eller trailing commas) innan svaret slutligen klassas som malformed JSON.

DNS-editorn - cachade sidor visas nu direkt medan AXFR kör i bakgrunden

  • När DNS-editorn redan har cachade rader för en zonsida renderas den cachade tabellen nu direkt i stället för att hela sidan blockeras tills AXFR är klar.
  • När bara en utgången/stale cachad sida finns kvar returnerar cache-endpointen nu ändå den sidan direkt (source="from_database_stale") så editorn kan visa något användbart omedelbart i stället för att bara fastna på AXFR-snurran.
  • Editorn byter nu bara ut den synliga tabellen när det färdiga AXFR-resultatet faktiskt ändrar den visade sidan eller pagineringsläget.
  • Om AXFR blir exakt samma synliga resultat som den cachade sidan lämnas tabellen orörd för att undvika onödigt redraw/flimmer.

2026-04-20

Mail Support Assistant - strikt Tools-konfigurerad sista fallback för omatchade mail

  • /admin/mail-support-assistant visar nu en strikt mailboxnivå-fallback för helt omatchade mail med en tydlig aktiveringskryssruta samt egna textfält för allow-condition och sista instruktion.
  • Den fallbacken får nu bara aktiveras när mailboxens checkbox uttryckligen är påslagen i Tools-konfigurationen; gamla miljöflaggar räcker inte längre för att slå på den.
  • Avancerade omatchade IF-rader stöds fortfarande, men de utvärderas nu före mailboxens egen sista fallback.
  • När denna strikta omatchade fallback faktiskt skickar ett svar markerar standalone-runnern nu mailet som läst direkt så att det inte hanteras igen vid nästa pollning av olästa mail.
  • Mailboxformuläret skickar nu också ett explicit falskt värde när checkboxen inte är ikryssad, och standalone-runnern vägrar utvärdera några omatchade AI-rader alls när Tools säger att checkboxen är avstängd, även om äldre omatchade textfält fortfarande innehåller värden.
  • Omatchade AI-requester inkluderar nu också källmetadata (advanced_row_rule respektive mailbox_final_fallback) i requestkontexten så upstream-loggar från SocialGPT/OpenAI blir lättare att koppla till rätt omatchad fallback-väg.

DNS-editorn - inline-raden för uppdatering stängs nu korrekt efter lyckad sparning

  • Den inline-visade Update Record-editorn i /dns/editor/{zone} stängs nu direkt igen efter en lyckad DNS-uppdatering i stället för att ibland lämna edit-raden kvar på sidan.
  • DNS-editorn bygger nu den inline-editorn som en riktig tabellrad, vilket också gör upprepade editera/avbryt/spara-flöden stabilare.

DNS-editorn - cachad/AXFR-laddning av zoner rensar nu null-bytes före IP-normalisering

  • DNS-editorn och zoncache-flödet sanerar nu inbäddade null-/kontrolltecken innan reverse-owner-avkodning och IP-normalisering via inet_pton() körs.
  • Det förhindrar att zonsidor som /dns/editor/tornevall.net kraschar med inet_pton(): Argument #1 ($ip) must not contain any null bytes när felaktig äldre cache-/zondata förekommer.

SpamAssassin-editorn - rena whitelist-domäner expanderas åter till det äldre wildcard-paret

  • I whitelist-editorn för SpamAssassin återställs nu det tidigare beteendet: om man bara anger en domän som openai.com läggs både *@openai.com och *@*.openai.com till automatiskt.
  • Remove-flödet för whitelist behandlar nu också dessa genererade wildcard-rader som ett gammalt domänpar igen, så om man tar bort någon av de genererade openai.com-raderna försvinner även den tillhörande kompanjonraden.

OpenAI-admin + kontoregistrering + API-whitelist - adminvyerna är nu stabilare och mer lättlästa

  • /admin/openai använder nu en säkrare renderingsväg för JavaScript-delen som uppdaterar modellkatalogen, vilket gör att adminsidan åter kan renderas stabilt efter de senaste OpenAI-dashboardändringarna.
  • Det publika registreringsformuläret på /register har nu en valfri fråga: Where did you hear about us?.
  • Svaret sparas nu på användaren, följer med i e-postnotisen om nytt konto och visas för admin i /users och /users/{user}/edit tillsammans med registrerings-IP.
  • /admin/security/api-ip-whitelist har stylats om för att bättre matcha övriga admin-UI:t och innehåller nu inline-redigering i stället för den tidigare trasiga edit-knappen.

DNSBL - privata RFC1918-adresser kan nu rensas från admin och blockeras vid framtida writes

  • /admin/dnsbl/engine-settings innehåller nu en hygien-purger som tar bort reverse-owner-poster i DNSBL / FraudBL för privata IPv4-nät i 10.0.0.0/8, 172.16.0.0/12 och 192.168.0.0/16.
  • DNSBL/FraudBL-skrivlagret blockerar nu också nya add/update-publiceringar för dessa RFC1918-nät så privata adresser inte kan återinföras via normala Tools-writes.
  • DNSBL add/update-anrop som träffar detta skydd returnerar nu 422 med reason="private_ipv4_not_allowed_in_dnsbl".

Mail Support Assistant - standalone-dashboarden förklarar nu config-only-mailboxar och visar läsbara Tools-regelrader

  • Den fristående Mail Support Assistant-dashboardens Refresh dashboard använder nu åter den stödda reload-vägen i stället för att visa Unknown ajax action..
  • Aktivitetsfliken listar nu fortfarande konfigurerade mailboxkort även innan någon sparad dry-run/riktig körning finns, samtidigt som den tydligt förklarar att detta är en operatörsinbox för senaste körningen och inte en full live-IMAP-klient.
  • Fliken för Tools-config visar nu läsbara matchade regelrader, fallback-regeldetaljer och omatchade AI/IF-rader (inklusive footer, AI-modell och reasoning effort) utan att operatören måste förlita sig enbart på rå JSON.

Browser Automation - Playwright-baserade lagrade scripts kan nu köras från Tools admin och cron

  • Tools har nu en ny adminyta för Browser Automation där operatören kan lagra Playwright-baserade browserscript direkt i databasen.
  • Script kan använda Chrome / Chromium / Microsoft Edge, återanvända valfria persistenta browserprofiler för inloggningstunga sajter som Facebook och spara screenshots / JSON / textartefakter under storage/app/browser-automation/.
  • Operatören kan köra ett sparat script direkt från admin-UI:t, anropa det via php artisan browser-automation:run <key> eller schemalägga det via det befintliga DB-baserade jobbflödet med App\Jobs\Handlers\BrowserAutomationScheduledJobHandler.
  • Laravel-schedulern kör nu också jobs:run varje minut, så cronbaserade schemalagda jobb kan gå via vanlig schedule:run i stället för att enbart vara beroende av opportunistisk webbtrafik.
  • Create/edit-sidan på /admin/browser-automation/create är nu stylad som ett tydligare adminformulär med klarare runtime-sektioner, inbyggt smoke-testexempel och sidokolumn med testvägledning för första verifieringen.

DNSBL-plugin för WordPress - publik removal-Turnstile kan nu fail-openas automatiskt vid driftstörningar

  • WordPress-pluginet för DNSBL har nu en andra removal-side-Turnstile-checkbox som tillfälligt bypassar den publika delist/removal-challengen när själva Turnstile-widgeten inte kan initieras eller när Cloudflares verifiering har ett operativt fel.
  • Det här fail-open-beteendet gäller bara den publika delist/removal-flowen; kommentar- och registreringsskyddet för Turnstile fortsätter att styras av sina egna inställningar.
  • En senare frisk Turnstile-verifiering stänger automatiskt den temporära bypassen igen.

DNSBL-plugin för WordPress - Turnstile på den publika avlistningssidan styrs nu separat

  • WordPress-pluginet för DNSBL har nu en egen admin-inställning för Cloudflare Turnstile på den publika delist-/removal-sidan.
  • Removal-sidan ärver inte längre Turnstile automatiskt bara för att kommentar- eller registreringsskyddet använder det.
  • Det gör att operatören snabbt kan stänga av just removal-sidans challenge när challenges.cloudflare.com är instabilt, samtidigt som skyddet för kommentarer och kontoregistrering kan lämnas oförändrat.

Mail Support Assistant - uppföljningsmail i reply-kedjor återanvänder nu tidigare supportspår smartare

  • Den fristående Mail Support Assistant kan nu återanvända den tidigare matchade regeln när ett nytt oläst uppföljningsmail tydligt hör till en redan hanterad konversation via In-Reply-To / References.
  • Uppföljningsmail som tidigare hanterades via no-match-AI kan nu också prioritera den tidigare använda generic_no_match_rules[]-raden först i stället för att alltid börja om från rad 1, vilket hjälper kortare repository-/API-följdfrågor att stanna på samma svarsspår.
  • Lokala trådsammanfattningar som skickas in i AI-kontexten innehåller nu också metadata om tidigare vald regel / tidigare matchad no-match-rad, vilket gör reply-kontinuiteten tydligare både för operatören och för AI-klassificeringen.
  • Standalone-skickade svar sparar nu också ett genererat utgående reply_message_id i lokal state, vilket förbättrar kontinuiteten när senare Gmail-/Outlook-följdmail refererar till assistentens skickade mail i stället för originalmailet.
  • Om ett uppföljningsmail kommer i ett äldre format eller har skrivits om på vägen så att användbara In-Reply-To / References saknas kan standalone-runnern nu ändå prova en fallback via normaliserat subject + samma deltagare innan mailet behandlas som en ny no-match-konversation.
  • Om en no-match-tråd redan godkänts tidigare och ett senare följdmail är uttryckligt länkat via reply-headers kan standalone-runnern nu fortsätta direkt på samma tidigare använda no-match-rad i stället för att be den första allow-condition-klassificeraren godkänna samma tråd på nytt.
  • Per-message-diagnostik i standalone-körresultat visar nu också thread_key, in_reply_to och references[], vilket gör reply-chain-felsökning betydligt tydligare när mail oväntat faller ner till no-match.

Mail Support Assistant - standalone-dashboarden är nu mer lättläst

  • Den fristående dashboarden för Mail Support Assistant renderar nu en mer mailklientlik operatörsvy i stället för att mest visa råa JSON-block.
  • Senaste körningens mailboxaktivitet visas nu som expanderbara meddelandekort med subject/from/to/date, previewtext, vald regel/no-match-diagnostik och trådmetadata.
  • När en lokal cachad message copy finns kan dashboarden nu också visa sparade headers/body-preview i expanderbar diagnostik i stället för att operatören måste läsa råfiler manuellt.

Mail Support Assistant - klartextsammanfattningar från kontaktformulär behåller nu själva problemtexten

  • Den fristående Mail Support Assistant trunkerar inte längre klartextmail från kontaktformulär till bara första From:-liknande raden när den strukturen ligger inne i själva bodyn.
  • Requestsammanfattningar, bifogade Summary of your request-utdrag och AI-kontext bevarar nu i stället själva fel-/problemtexten samt hjälpfält som avsändar-IP när inkommande mail använder den typen av strukturerat klartextformat.

DNSBL / DMARC - DMARC-intagning kräver nu aktiv DNSBL-token med add-rätt

  • POST /api/dnsbl/dmarc/report accepterar inte längre anonyma/interna uppladdningar, adminsessionsfallback eller vanlig Tools API-nyckelspassthrough.
  • DMARC-intagningen lyckas nu bara när anroparen skickar en aktiv DNSBL-token vars effektiva add-rätt är aktiverad (can_add=true).
  • Aktiva DNSBL-provider keys (provider=tornevall_dnsbl) och aktiva adminägda Tools API-nycklar accepteras nu åter för DMARC-upload via samma X-Dnsbl-Token / dnsbl_token-transport, i linje med övrig DNSBL-write-auth.
  • Saknade/ogiltiga/inaktiva DNSBL-token ger nu 401, medan aktiva DNSBL-token utan add-scope ger 403 reason="insufficient_dnsbl_scope".
  • projects/dnsbl-engine lämnar nu DMARC-filer kvar i spoolen när upload nekas, och DMARC-only-körningar verifierar nu först att det konfigurerade DNSBL-tokenet verkligen har add-rätt innan körningen fortsätter.
  • DMARC-parsern extraherar nu också XML korrekt från vidarebefordrade/wrappade message/rfc822-mail där själva DMARC-rapporten ligger som nästlad ZIP-attachment, vilket fixar falska invalid_dmarc_report-fel för den typen av inbound-mail.
  • Dubblettuppladdningar av samma DMARC-payload är nu idempotenta även när identiska payloads når samma unika payload_hash samtidigt; endpointen returnerar nu den redan sparade rapporten med duplicate: true i stället för att exponera ett rått SQL-duplicate-entry-fel.
  • DMARC-parsern accepterar nu också notice-/forensic-liknande DMARC-mail som sammanfattar Sender Domain, Sender IP Address, SPF Alignment, DKIM Alignment och DMARC Results tillsammans med kopierade headers, så att även dessa rapporter kan hamna i samma adminkö när aggregate-XML saknas.
  • DMARC-granskningskön i admin resolvar nu också reverse-DNS-hostnames för rapporterade käll-IP-adresser och visar rapporttyp (Aggregate XML respektive Forensic notice) för att förenkla operatörens triage.

Mail Support Assistant - omatchade IF-rader kan nu raderas direkt i sidan

  • /admin/mail-support-assistant tar nu bort omatchade fallback-IF-rader via AJAX utan att hela sidan måste laddas om.
  • Tomläget för omatchade rader återställs direkt när den sista raden raderas.
  • Samma omatchade IF-rader sparas nu också direkt via AJAX med radlokal busy-/success-status under spara-knappen i stället för att bara luta sig mot sidans globala statusrad.

Mail Support Assistant - förutsättningar och supportväg är nu tydligare dokumenterade

  • Dokumentationen för Mail Support Assistant beskriver nu tydligare vad som faktiskt krävs för en fungerande installation, inklusive riktigt Tools-konto, åtkomst till /admin/mail-support-assistant, giltig personlig Tools-token, mailboxkonfiguration i Tools, nåbar Tools base URL och vald utgående mailtransport.
  • Dokumentationen länkar nu också vidare till den fristående klientens GitHub tickets-sida för buggar, installationsfrågor och feature requests.

2026-04-19

DNSBL - delist/removal-auditering visar nu käll-/sajtdata och kan också skickas via mail

  • POST /api/dnsbl/records/delete och delete-poster i POST /api/dnsbl/records/bulk berikar nu den dedikerade DNSBL-removal-auditen med källmetadata som source_type, source_name, sajt-URL/värd, page-URL, request-headers som Origin och Referer, samt user-agent när sådan information finns.
  • Själva auditmeddelandet för DNSBL-removals visar nu också en tydligare sammanfattning av källa/anropare så operatören kan se inte bara vilken IP/zon som delistades utan även varifrån begäran kom.
  • DNSBL-removal-auditen fortsätter att kunna forwardas till den separata Slack-kategorin DNSBL removal audit och kan nu också skicka plain-text-auditmail till mottagarlistan i DNSBL_REMOVAL_AUDIT_EMAIL.
  • WordPress-pluginet för DNSBL stämplar nu sina Tools write/check-anrop med sin egen sajtkontext, så removal-auditen kan visa vilken sajt som skickade en delist även när anropet sker server-till-server.
  • DNSBL-delete för IP-adresser som redan inte är listade någonstans returnerar nu en accepterad no-op-respons (reason="already_not_listed", forced_success=true) i stället för ett hårt invalid_dnsbl_publication-fel, vilket gör delist-cleanup idempotent för klienter som dnsbl-engine.

DNSBL / DMARC - DMARC-intagning och granskningskö har lagts till

  • POST /api/dnsbl/dmarc/report tar nu emot DMARC-XML / gzip / ZIP-payloads för granskning när anropet görs med en aktiv DNSBL-token, adminsession eller en aktiv adminägd Tools API-nyckel via DNSBL-token-transporten.
  • Tools lagrar nu normaliserad DMARC-rapportmetadata samt separata rader per rapporterad käll-IP så att dessa rapporter kan hanteras i /admin/dnsbl/dmarc i stället för att behandlas som vanliga blacklistmail.
  • Den nya DMARC-kön i admin låter sajtägaren publicera en rapporterad käll-IP till DNSBL som antingen spam (16) eller spam + fraud (84), och även markera rader som ignorerade när ingen publicering ska ske.
  • projects/dnsbl-engine/run skannar nu också en dedikerad DMARC-spoolfolder, laddar upp payloads till den nya Tools-endpointen och skickar en supportpåminnelse stämplad med X-Tornevall-Mail-Assistant: sent när DMARC-filer finns i kön.
  • projects/dnsbl-engine/run stöder nu också dmarc / --dmarc-only, medan projects/dnsbl-engine/start.sh dmarc och projects/dnsbl-engine/start-dmarc.sh ger en separat DMARC-only-körning med egen PID-låsning.

dnsbl-engine - blacklistkörningar kastar nu bort uppenbara delivery-status / mailer-daemon-mail

  • Vanliga Fraud- / Spam-pass i mailmotorn städar nu bort uppenbara bounce-/DSN-/mailer-daemon-mail i stället för att blacklista relay-hopp eller avsändar-IP som råkar nämnas i dessa rapporter.
  • Skippen riktar sig mot klassiska delivery subsystem-signaler som Delivery Status Notification, Mail Delivery Subsystem, mailer-daemon, Reporting-MTA, Final-Recipient, Action: failed och Diagnostic-Code.
  • Samma cleanup-only-detektor känner nu också igen Auto-Submitted: auto-generated, Exchange- / Office 365-NDR, Gmail-bounces samt daemonrapporter i qmail-, exim- och postfix-format.

dnsbl-engine - runspam spam har nu standardtak för hur många mail som tas per pass

  • projects/dnsbl-engine/runspam spam skickar nu vidare en standardgräns på 1000 mail per körning till den vanliga blacklist/add-passen i stället för att lämna batchstorleken obegränsad.
  • Hjälpskriptet accepterar också ett valfritt andra numeriskt argument, till exempel runspam spam 500, när operatören vill sätta ett annat tak.

Mail Support Assistant - utgående svar får nu anti-loop-header

  • Utgående svar från standalone och Tools-relay stämplas nu med X-Tornevall-Mail-Assistant: sent.
  • Standalone-pollning hoppar nu över olästa meddelanden som redan bär den markören före regelmatchning/svar och markerar dem lästa, vilket förhindrar självsvarsloopar.

Fristående Mail Support Assistant - no-match-rader fortsätter nu falla vidare även efter radlokala fel

  • Standalone-runnern för omatchade mail avbryter inte längre hela no-match-loopen bara för att en enskild fallback-rad träffar ett radlokalt AI-/API-fel.
  • Senare aktiva no-match-rader provas fortfarande i sort_order, vilket nu matchar samma fall-through-beteende som redan gällde när en tidigare rad bara blev normalt avvisad av den strikta AI-triagen.
  • Standalone-diagnostik för no-match-vägen visar nu också generic_ai_decision.evaluated_no_match_rules[], så operatören kan se exakt vilka fallback-rader som utvärderades innan mailet besvarades eller lämnades oläst.

Mail Support Assistant - mailbox-tröskel för spam score kan nu stoppa svar och lämna mail olästa

  • Mailbox-defaults i /admin/mail-support-assistant har nu fältet spam_score_reply_threshold för att undertrycka svar vid för höga score-nivåer.
  • GET /api/mail-support-assistant/config returnerar nu additivt mailboxfältet defaults.spam_score_reply_threshold.
  • Standalone-runnern läser nu X-Spam-Score som extra score-källa när X-Spam-Status saknar parsebar score=-metadata.
  • Om ett mails score ligger över mailboxens konfigurerade tröskel undertrycks svarshanteringen och mailet lämnas uttryckligen oläst.

Fristående Mail Support Assistant - dubbla avslut/signoffer rensas nu före footer-append

  • När statisk footer används rensar standalone-runnern nu bort trailing AI-genererade signoff-block upprepade gånger innan mailbox-/regelfootern läggs på.
  • Det förhindrar dubbla avslut i samma svar, till exempel både Best regards och Regards.

Mail Support Assistant - ogiltiga tomma no-match-rader städas nu bort och filtreras bort

  • En uppföljande städning tar nu bort ogiltiga no-match-rader där if eller instruction är tomt, eftersom sådana rader aldrig kan passera strikt no-match-triage.
  • GET /api/mail-support-assistant/config filtrerar nu defaults.generic_no_match_rules[] så att endast giltiga rader (icke-tomma if + instruction) returneras.
  • Om en mailbox bara hade ogiltiga rader försöker städningen backfilla en giltig rad från legacy-fälten när dessa innehåller båda värdena.

Fristående Mail Support Assistant - skippade mail trycks tillbaka till oläst och lokal state kan nu hjälpa trådkontinuitet

  • När standalone-runnern skippar ett oläst mail utan att skicka svar försöker den nu uttryckligen rensa \\Seen igen när IMAP-servern stöder det, i stället för att bara anta att mailet förblev oläst.
  • Lokal message-state.json används inte längre som unread skip-/dedupe-logik, men kan fortfarande spara lätta trådutdrag så senare AI-svar får mer realistisk konversationskontinuitet.
  • Historiktyngda diagnosfält i standalone-CLI:t är fortfarande opt-in via php run --include-history.

Mail Support Assistant - no-match-fallback använder nu add-row-baserade If... + Instructions...-regler

  • /admin/mail-support-assistant stöder nu mailboxnivåns add-row-regler för omatchade fallback-svar i stället för ett enda generiskt IF/instruction-par.
  • Admin kan nu skapa, redigera, sortera, aktivera/inaktivera och radera flera no-match-rader per mailbox.
  • GET /api/mail-support-assistant/config returnerar nu additivt defaults.generic_no_match_rules[] med sorterade radobjekt (id, sort_order, is_active, if, instruction, footer, ai_model, ai_reasoning_effort).
  • Bakåtkompatibilitet finns kvar: legacy-fälten defaults.generic_no_match_if, defaults.generic_no_match_instruction och defaults.generic_no_match_footer returneras fortfarande och mappar nu till första aktiva no-match-raden när sådan finns.
  • Standalone-flödet för omatchade mail utvärderar nu raderna i ordning och kan falla vidare till senare rader när en tidigare rad avvisas av den strikta AI-triagen.

2026-04-18

Mail Support Assistant - omatchade mail kan nu gå genom strikt AI-triage med If... + Instructions... i stället för ett löst generiskt svar

  • /admin/mail-support-assistant låter nu admin konfigurera två separata mailboxfält för no-match-AI: ett If...-villkor som beskriver vilka annars omatchade mail som över huvud taget får besvaras, och separata Instructions... som beskriver hur svaret ska skrivas när villkoret faktiskt är uppfyllt.
  • GET /api/mail-support-assistant/config returnerar nu också additivt defaults.generic_no_match_if per mailbox.
  • Den fristående Mail Support Assistant skickar inte längre ett generiskt AI-svar på omatchade mail bara för att modellen råkade skriva något som såg rimligt ut. Den kräver nu i stället ett strikt JSON-beslut från AI och svarar bara när modellen uttryckligen säger att mailet får besvaras med hög säkerhet.
  • Avvisade eller otillräckligt säkra no-match-beslut tömmer nu också eventuell kvarvarande reply-payload internt, så bara verkligt godkända high-certainty-beslut kan fortsätta till svarssteget.
  • Wrapper-liknande SpamAssassin-text ignoreras fortfarande som yttre brus i det beslutet, men SpamAssassin-score/tester finns kvar som risksignaler så misstänkt försäljnings-/bedrägerimail lättare kan avvisas säkert.
  • Mailbox-/regelformulären i Tools admin använder nu lättviktig AJAX-sparning för vanliga create/update/delete-ändringar, vilket gör Mail Support Assistant-justeringar snabbare i praktiken.
  • Fokuserad regressionstäckning i den fristående klienten bevakar nu också denna strikta no-match-väg, inklusive regeln att avvisade AI-beslut måste lämna mailet oläst.

Fristående Mail Support Assistant - live CLI-diagnostik, fallback vid tomma AI-svar och tydligare unread/reply-state

  • Den fristående runnern i public/tornevall-tools-mail-assistant speglar nu live-loggrader till stdout vid CLI-/manuella körningar, så bash cron-run.sh visar progress medan mailboxpasset fortfarande kör i stället för att bara skriva ut slutlig JSON när allt redan är klart.
  • AI-svarsgenereringen försöker nu också med den konfigurerade fallbackmodellen när primärmodellen returnerar en tom svarskropp, inte bara när requesten kastar ett transport-/API-fel.
  • Körsammanfattningar innehåller nu per-meddelande-diagnostik i message_results[], så det blir tydligare om varje oläst meddelande blev hanterat, skippat, state-skippat, varnat eller felade.
  • Om samma olästa IMAP-meddelande redan har en tidigare lokal post som visar att ett svar faktiskt skickades, hoppar runnern nu över automatisk omsändning med reason previous_reply_recorded_unread för att undvika dubblettsvar.
  • Om ett svar skickas men IMAP-finaliseringen efteråt (markSeen, move eller delete) misslyckas, sparar runnern nu en explicit varningsreason i stället för att tyst se helt färdighanterad ut.
  • Utgående HTML-svarskort använder nu starkare explicita textfärger och light-only color-scheme-hintar så manuella replies/citerad historik mindre lätt blir vit text på vit bakgrund i mailklienter.
  • Svarsleveransen normaliserar nu också to / cc / bcc mer defensivt innan SMTP eller Tools-relay används, vilket förbättrar BCC-vidarebefordran när adresser kommer in med display-name-formattering.
  • Om varken en matchad regel eller mailboxens defaults anger någon BCC kan standalone-runtime nu också falla tillbaka till MAIL_ASSISTANT_DEFAULT_BCC i sin lokala .env.

DNSBL-engine - cronkörningar visar nu liveprogress och accepterade delistningar beskrivs inte längre som misslyckade i svarsmejl

  • Den fristående workern projects/dnsbl-engine/run tvingar nu fram omedelbar CLI-flush och skriver tidsstämplade progressmarkörer för scan, analyze, lookup/write, cleanup, final whitelist sweep och utskick av operativ rapport, vilket gör cron-/bakgrundskörningar lättare att felsöka medan de fortfarande pågår.
  • Längre live-lookupbatcher mot DNSBL visar nu också progress under själva check-ip-fasen i stället för att vara tysta tills hela lookupmängden är färdig.
  • Reply-delist-AI är nu hårdare låst till det maskinbekräftade delete-resultatet och underkänns om den påstår att en redan accepterad delistning "inte gick igenom".
  • Lyckade single-IP-bulkdelistningar sammanfattas nu med tydligare text om att själva delist-submissionen accepterades och att nödvändiga delete-operationer skickades, i stället för att bara återge en generisk bulk-success-mening.

Mail Support Assistant - svar på samma språk, renare originalsammanfattningar och synlig AI-budgetmetadata

  • Standalone Mail Support Assistant-AI-svar försöker nu uttryckligen svara på samma språk som det inkommande mailet i stället för att bara lita på generell prompttolkning.
  • Standalone-fallbackmodellen är nu o4 som standard, och den fallbackkörningen skickar medvetet inte med reasoning_effort så den beter sig som en vanlig icke-reasoning-fallback.
  • Wrapper-liknande inkommande mail rensas nu hårdare före regelmatchning, AI-kontextbygge och citering i utgående svar, vilket gör att SpamAssassin-wrappers, vidarebefordrade .eml-headerdumpningar och trasiga inbäddade headerblock mer sällan skymmer den verkliga originalförfrågan.
  • Utgående svar lägger nu också till ett kompakt utdrag av den ursprungliga inkommande förfrågan, så både operatör och mottagare fortfarande kan se vad avsändaren faktiskt skrev i den skickade svarstråden.
  • Mailboxsammanfattningar för misslyckade AI-svar visar nu vilken modellkedja som provades, och GET /api/mail-support-assistant/config returnerar nu också additiv metadata user.ai_daily_budget så operatören kan se effektiv AI-tokenlimit/återstående budget som Mail Support Assistants SocialGPT-baserade svar använder.

Mail Support Assistant - överlappande regler utvärderar nu alla träffar innan en regel tillämpas

  • Den fristående Mail Support Assistant stannar inte längre vid första matchande regel när flera regler överlappar.
  • Den utvärderar nu alla matchande regler, väljer först den mest specifika matchen (flest aktiva matchfält, sedan längst sammanlagd matchtext, därefter sort_order) och sparar både vald regel och övriga matchkandidater i diagnostiken.
  • Det gör att överlapp som breda Gmail-regler kontra mer specifika copyright notice-regler blir synliga i stället för att tyst använda den regel som råkade kontrolleras först.

AI- / Mail Support Assistant-API - throttling är nu bearer-medveten med mycket högt tak och effektiv admin-bypass

  • POST /api/ai/socialgpt/respond, /api/social-media-tools/extension/* och /api/mail-support-assistant/* använder nu användarmedveten throttling i stället för de tidigare låga fasta per-minut-taken.
  • Vanliga användare/token får nu mycket högre gränser, medan adminägda requester i praktiken inte throttlas på API-lagret så support-/underhållskörningar inte går sönder vid tillfälliga toppar.

Mensövervakning - administratörer kan nu hantera en annan användares poster direkt

  • Administratörer kan nu öppna /admin/menstrual-tracking/{user} för att redigera en annan användares mensprofil och cykelrader utan att logga in som användaren.
  • Användarredigeraren har nu också en direktlänk Menstrual tracking så admin kan hoppa från /users/{id}/edit direkt till användarens mensvy.

Mail Support Assistant - AI-svar försöker nu om throttling och skickar inte längre den missvisande generiska fallbacken

  • Tillfälliga AI-rate-limitfel som 429 / Too Many Attempts försöks nu om automatiskt av den fristående Mail Support Assistant innan AI-spåret överges.
  • AI-aktiverade regler utan explicit statisk fallback-template skickar inte längre den gamla generiska meningen Thank you for your message. We have reviewed it. när AI fallerar; svaret avbryts och loggas i stället för att låtsas att ärendet redan hanterats.
  • Ett misslyckat meddelandesvar avbryter inte längre resten av samma mailboxkörning; senare mail i samma mailbox kan fortfarande behandlas.

Mail Support Assistant - utgående svar innehåller nu stylad HTML

  • Mail Support Assistant-svar skickas nu som multipart/alternative, där den ursprungliga plain-text-delen ligger kvar samtidigt som en stylad HTML-version läggs till för mer presenterbara supportmail.
  • POST /api/mail-support-assistant/send-reply accepterar nu också additivt body_html, så Tools-relay kan bevara den formatterade svarskroppen när standalone-runtime faller tillbaka till relayläge.

Mail Support Assistant - AI på matchade regler använder nu verkligen regelns AI-override-fält

  • AI-aktiverade Mail Support Assistant-regler skickar nu sina konfigurerade responder_name, persona_profile, custom_instruction, vald ai_model och additiva ai_reasoning_effort till Tools som explicita AI-override-fält för just det svaret.
  • Mailboxnivåns generiska AI-inställningar för omatchade mail ligger kvar som mailboxdefaults endast för no-match-flödet och ser inte längre ut som källan till svar från matchade regler.
  • /admin/mail-support-assistant använder nu dropdowns för Mail Support Assistant-modellval och reasoning effort på regel-/mailboxnivå i stället för fria textfält för dessa AI-kontroller.

DNSBL API - fraud-writes speglas nu åter till de vanliga DNSBL-zonerna

  • Fraud-liknande DNSBL add/update-publicering speglas nu till dnsbl.tornevall.org + opm.tornevall.org samtidigt som bl.fraudbl.org uppdateras, vilket återställer det äldre kombinerade DNSBL+FraudBL-beteendet för phishing-/fraudflaggor.
  • Commerce-publicering är oförändrad och ligger fortfarande bara i bl.fraudbl.org + ecom.fraudbl.org utan att speglas till de vanliga DNSBL-zonerna.

DNSBL API - bulk-DNS-writes härdas nu mot avbrutna UDP-läsningar

  • Stora DNSBL-bulkrequester förlänger nu sin runtime-budget innan de serversidiga DNS-uppdateringarna körs.
  • Den låg-nivåbaserade DNS-sockettransporten försöker nu också igen när en retrybar mottagning avbryts, till exempel socket_recvfrom(): Interrupted system call, innan körningen till slut markeras som misslyckad.

Mail Support Assistant - no-match-/konfigurationsskippar lämnas nu olästa

  • Den fristående projects/tornevall-tools-mail-assistant markerar inte längre mail som lästa när de bara hoppades över därför att ingen regel matchade eller därför att den generiska fallbacken för omatchade mail var avstängd, inte gick att besvara eller fallerade.
  • mark_seen_on_skip är nu i praktiken begränsad till medvetna heuristiska skippar, till exempel högscorat SpamAssassin-skräp, vilket gör mailboxfel och missad regelkonfiguration lättare att upptäcka och köra om.

Mail Support Assistant - mailboxnivåinställningar för generiska svar på omatchade mail

  • /admin/mail-support-assistant har nu mailboxnivåinställningar för ett generiskt AI-fallbacksvar när ett inkommande mail inte matchar någon explicit regel.
  • Den additiva mailboxkonfigurationen från GET /api/mail-support-assistant/config innehåller nu defaults.generic_no_match_ai_enabled, defaults.generic_no_match_ai_model, defaults.generic_no_match_instruction och defaults.generic_no_match_footer.
  • Detta gör att standalone-klienten kan besvara omatchade men fortfarande supportrelevanta mail utan att admin måste skapa en separat explicit matchregel för varje sådant fall.

Mail Support Assistant - fallback från lokal MTA och ny relay-endpoint i Tools

  • Den fristående projects/tornevall-tools-mail-assistant stöder nu valbar utgående transport: lokal PHP mail(), eget MTA-kommando eller direkt Tools-relayläge.
  • Standalone-transporten stöder nu även direkt SMTP och har smtp som standard, vilket minskar postdrop-/lokal sendmail-beroenden i cronmiljöer.
  • Standalone-körningar kan nu automatiskt falla tillbaka från trasig lokal mailtransport till en ny Tools-endpoint: POST /api/mail-support-assistant/send-reply.
  • Tools exponerar nu relay-endpointen bakom en dedikerad personlig tokenprovider (provider_mail_support_assistant_mailer) och en ny permissionspärr (mail-support-assistant.relay).
  • /admin/mail-support-assistant har nu också UI för relay-tokenrotation samt valbar direkt tilldelning av relay-permission till vald tokenägare.
  • Standalone-klientens API-felparsning har härdats så att PHP-varningar av typen Array to string conversion inte längre uppstår när Tools returnerar strukturerade felarrayer.

DNSBL API - delete-guardrails på användarnivå i adminpanel och runtime-kontroll

  • DNSBL token-admin stöder nu också en delegerad CIDR-gräns via delete_min_cidr_prefix, så icke-admin-token kan begränsas till mindre delete-intervall som /25../32 i stället för att få generell CIDR-access.
  • DNSBL auth-/tokenmetadata kan nu exponera can_cidr_delete, och CIDR-delete ger nu explicita felorsakerna delete_cidr_not_allowed eller delete_cidr_prefix_too_broad när intervallet ligger utanför den delegerade gränsen.
  • DNSBL token-admin stöder nu användarnära delete-guardrails: delete_limit_per_day, delete_cidr_limit, delete_throttle_limit och delete_throttle_window_seconds.
  • DNSBL-deleteflödet tillämpar nu dessa gränser för token-autentiserade användare både på single-delete och bulk-delete.
  • Guardrail-blockeringar returnerar nu tydliga reasons: delete_daily_limit_exceeded (429), delete_throttle_exceeded (429) och delete_cidr_limit_exceeded (422).
  • DNSBL token-info och auth-summary innehåller nu additiv metadata delete_guardrails så klienter kan visa effektiva gränser före delist-försök.
  • Runtime-upplösningen av guardrails faller nu också tillbaka säkert på äldre installationer där de nya dnsbl_api_tokens-kolumnerna ännu inte migrerats, så delete-endpointen returnerar standard-/inga-guardrails i stället för att krascha.

DNSBL-engine - tomkörningar skickar inte längre operativa rapportmail

  • projects/dnsbl-engine/run hoppar nu över sammanfattningsmailet helt när en körning inte rörde någon faktisk adressaktivitet, vilket minskar "inget hände"-rapporter från spoolpass utan kandidater.

Fristående Mail Support Assistant - mail som redan är lästa vid inläsning särredovisas nu

  • Runner-sammanfattningar innehåller nu messages_read_skipped / mailbox read_skipped så redan lästa IMAP-mail inte blandas ihop med no_matching_rule-skippar.
  • IMAP-payloaden innehåller nu is_seen, och meddelanden som redan är markerade lästa vid inläsning hoppas över utan att sparas som nya no-match-rader i state.
  • Lokal message-state-sammanfattning visar nu också excluded_read_records och raw_count för tydligare operatörsdiagnostik.

Fristående Mail Support Assistant - olästa mail kan nu omprövas även om de finns i lokal historik

  • Den fristående runnern använder inte längre storage/state/message-state.json som en hård dedupe-spärr för olästa mail.
  • Meddelanden som fortfarande är olästa i IMAP kan därför köras om vid senare körningar, vilket gör att nyss tillagda regler kan börja matcha utan att den lokala state-filen först måste rensas.
  • Redan lästa mail hoppas fortfarande över direkt, och den lokala state-filen finns kvar endast som diagnostikhistorik.
  • Runner-sammanfattningar visar nu också messages_previously_recorded_unread när en oläst tråd hittades i lokal historik men medvetet omprövades ändå.

DNSBL-tokenansökningar - approval-mail visar nu kontots delete-defaults

  • När en admin godkänner en väntande DNSBL-tokenansökan skickar Tools nu ett mail till den sökande om att tokenen är klar och vilka add/delete-scopes som beviljats.
  • Samma mail sammanfattar nu också de effektiva delete-guardrails/defaultgränser som just nu gäller för kontot, så delegerade användare ser försiktighetsgränserna innan de börjar delista.

2026-04-17

DNSBL-engine - redan täckta IP-mail städas nu bort, rapporter mejlas och reply-delist kan få AI-förtydliganden

  • Den fristående workern i projects/dnsbl-engine städar nu också bort spoolfiler när en IP hoppas över därför att live-DNSBL redan har samma eller högre bitmask, i stället för att lämna filerna kvar som permanent väntande.
  • Add/Fraud-körningar städar nu också bort mail som inte innehåller några användbara IP-/CIDR-kandidater alls, i stället för att låta sådana no-op-mail fastna i mappen.
  • Whitelistlagret följer nu env-styrda DNSBL-/firewall-/SpamAssassin-databasnamn och connection-nycklar, så .env-värden som DB_DNSBL_DATABASE, DB_DNSBL_FIREWALL_DATABASE, DB_DNSBL_CONNECTION och DB_SA_CONNECTION styr den faktiska whitelistkällan.
  • När SPAM_REPORTS_FROM och SPAM_REPORTS_TO är satta skickar add/update-körningar och delist/reply-körningar nu en operativ sammanfattningsrapport via mejl med statistik, whitelistträffar och slutlig whitelist-resweep.
  • SpamAssassin-hållningar via avsändarwhitelist är nu också mindre klistriga: om innehållet fortfarande ser tydligt bedrägligt ut auto-override:as sender_matches_whitelist_from och mailet fortsätter genom vanlig Fraud/Spam-hantering.
  • projects/dnsbl-engine har nu också en smalare operatörsflagga --force-sender-whitelist-holds som bara bypassar manuella hållningar av typen sender_matches_whitelist_from, utan att stänga av de andra lågscore-/safe-test-skydden.
  • Reply-delist använder fortfarande sin vanliga HTML-bekräftelsemall, men otydliga förfrågningar kan nu få ett extra AI-genererat förtydligande från Tools/OpenAI; om AI-steget misslyckas skickas standardmallen ändå oförändrad.
  • Reply-delist behandlar nu också targetar som bara hittats via headers som otydliga, så svaret kan förklara att workern bara hittade borttagbara IP-adresser i meddelandeheaders/transportmetadata och vid behov be avsändaren om uttryckliga IP-/CIDR-targets.
  • Supporttunga reply-delist-mail kan nu också låta AI skriva det primära DNSBL-fokuserade svaret, men det svaret förankras nu i det faktiska delist-resultatet från körningen så att redan inskickade delists bekräftas i stället för att avsändaren ombeds starta processen igen.
  • AI-stödda reply-delist-svar kan nu också lägga till en kort ursäkt när originalmailet är äldre än två dagar, och de styrs nu uttryckligen att hålla sig till DNSBL, DNSBL-API:t, delisting och den publika DNSBL-dokumentationen/removal-flödet.
  • Reply-delistens AI-svar begär nu först gpt-5.4 med medium reasoning effort, och om den körningen kommer tillbaka tom kör workern automatiskt om svaret via fallbackmodellen (gpt-4o-mini) i stället för att skicka en tom AI-del.
  • Auto-reply-loggningen säger nu också om den lokala mailtransporten accepterade eller nekade det utgående svaret, vilket gör tysta leveransproblem lättare att felsöka.
  • Delisttunga körningar återanvänder nu också chunkade multirequest-delete där det går, i stället för att alltid radera strikt en target i taget.
  • Felaktiga icke-JSON-svar vid bulk-writes återhämtas nu också mer aggressivt: workern försöker först rädda inpackad JSON när det går, därefter köra om det trasiga chunken en gång som vanlig bulk-request och till sist falla tillbaka till enskilda requests innan chunken lämnas som misslyckad.

DNSBL reply-rapporter + AI-fallback reasoning - renare sammanfattningar och tydligare felorsaker

  • Reply-delistens sammanfattning av inkommande förfrågan rensar nu bort vanlig MIME-/HTML-wrapperbrus mer aggressivt, så rutan "Summary of your request" fokuserar på själva frågan i stället för multipart-gränser eller kopierade transportrader.
  • Identiska upprepade frågerader dedupliceras nu också där, så samma avsändarfråga inte ekas två gånger i summary-rutan.
  • Proton-/quoted-printable-kopior av samma mail avkodas och städas nu också före summary-extraktion och AI-kontextbygge, vilket gör att tekniska delist-/hjälpfrågor mycket mindre lätt tappas bort bakom MIME-brus.
  • DNSBL-reply-AI:n får nu också explicit date-check-kontext (meddelandets ålder plus aktuell svarstid), så modellen själv kan avgöra när en kort ursäkt för dröjt svar är rimlig.
  • Längre DNSBL-AI-stycken kapas nu vid säkrare menings-/whitespace-gränser i stället för med en hård mitt-i-ordet-kapning, vilket förhindrar trasiga slut som Please en i utgående svar.
  • DNSBL:s reply-läge tolkar inte längre ett mail som vårt eget autosvar bara för att support@tornevall.net syns i tråden, vilket gör att riktiga kunduppföljningar på tidigare supportmail kan besvaras normalt.

Fristående Mail Support Assistant - replykedjor och tydligare skip-diagnostik

  • Den fristående projects/tornevall-tools-mail-assistant hanterar nu replykedjor bättre: Re:/Fwd:/Sv:-prefix tas bort före regelmatchning, citerad historik i brödtexten rensas bort före body-matchning och AI-sammanfattning, och utgående svar behåller In-Reply-To / References-headers.
  • IMAP-parsningen där lagrar nu riktiga Message-Id samt en stabil lokal fallback-nyckel när headern saknas, så skipade/hanterade mail faktiskt syns i lokal message-state-sammanfattning.
  • No-match-skip loggas nu tydligare med mailbox/from/to/subject-kontext, vilket gör körningar med scanned men handled=0 mycket lättare att felsöka.
  • CIDR-tunga delistresultat visas nu mer kompakt i reply-/rapportmail: i stället för en rad per expanderad IP visas hanterad/misslyckad totalsumma plus exempel på misslyckade targets/reasons.
  • Misslyckade bulk-chunks bär nu med sig tydligare diagnostik in i targetresultaten (till exempel HTTP/decode/fallback-detaljer) i stället för att bara visa generiska "One or more bulk chunks failed.".
  • IPv6-extraktionen från inkommande mailtext är nu striktare, så etiketter som IPv6: inte längre råkar ge en felaktig inledande 6: i den bearbetade adresslistan.
  • DNSBL reply-delist stöder nu också egna AI-overrides för responder/persona/custom instruction (DNSBL_AI_RESPONDER_NAME, DNSBL_AI_PERSONA_PROFILE, DNSBL_AI_CUSTOM_INSTRUCTION) för den som vill ha reply-specifik ton oberoende av sparade SocialGPT-inställningar.
  • När AI faktiskt skrev det primära DNSBL-svaret upprepar utgående mailet nu inte samma accepted-target-sammanfattning en andra gång i ett generiskt standardstycke.
  • SocialGPTs reasoning-effort-stöd omfattar nu även gpt-4o*-prefix som standard, så gpt-4o/gpt-4o-mini-fallback kan behålla samma reasoningbeteende när det är aktiverat.
  • Den fristående projects/tornevall-tools-mail-assistant följer nu samma modellprofil: sanerade meddelandesammanfattningar, konfigurerbar reasoning effort och ett primary->fallback-försök (gpt-5.4 -> gpt-4o-mini).

Feedfrågor - SQL-matchade rader följer nu med ända in i slutsvaret

  • Feed Q&A bär nu med ett eget matched_entries-lager från SQL-retrievalen in i den slutliga AI-kontexten i stället för att bara använda SQL-träffen som ett dolt filtersteg.
  • Det betyder att frågespecifika träffar nu kan behålla konkreta title-, description-, content-utdrag, publishby, feed_title och länkar hela vägen till svarsfasen.
  • För frågor om vem som skriver om en person eller ett ämne instrueras modellen nu uttryckligen att prioritera dessa matchade rader innan den faller tillbaka till aggregerade totalsiffror som antal feeds eller poster.

IRCWatch - fixad lokal action-inferens, nya kanalsvar på ? och eskalering vid frågemissbruk

  • IRCWatch innehåller nu faktiskt den lokala hjälpfunktionen för invite / op / kick-inferens som kanalmention-flödet anropar, vilket fixar runtime-felet om att ircwatchInferStructuredChannelActionFromMessage() saknas.
  • Kanalmeddelanden som slutar med ? kan nu ge ett kort botsvar även utan direkt botmention.
  • Upprepat frågespam eller aggressivt ?-bait kan nu ge varningar, medan själva ?-svarsflödet inte längre auto-kickar någon alls.
  • Vanliga icke-aggressiva frågor ska nu inte längre kunna ge kick bara för att AI-klassningen eller frågeräknaren blev för ivrig.
  • Kick-behörighetskontrollen för manuella/infererade kickar räknar nu också vanlig kanal-op / eggdrop-o, inte bara owner/master-flaggor.

Mail Support Assistant - Tools-adminytan har fått renare kortlayout och mer generiska exempel

  • Konfigurationsytan på /admin/mail-support-assistant har byggts om med tydligare kort, bättre gruppering och mer lättlästa formulär för token, mailboxar och regler.
  • Standardexemplen i regel- och mailboxformulären utgår nu från neutrala supportflöden som orderstatus, referensnummer och kundsupport i stället för ett snävt copyright-/juridikscenario.
  • Svensk dokumentation och ändringslogg för Mail Support Assistant visar nu åter riktiga åäö där tidigare translittererad text hade smugit sig in.

Mail Support Assistant - nytt fristående projektnamn plus AJAX/operatorstöd och SpamAssassin-förbättringar

  • Den fristående klienten ligger nu under projects/tornevall-tools-mail-assistant/ i stället för den tidigare tillfälliga sökvägen projects/mail-support-assistant/.
  • Mini-webbgränssnittet är nu mer operatorvänligt, med AJAX-uppdatering, self-test och säkra dry-run-körningar som återanvänder exakt samma vanliga PHP-runner som CLI-läget.
  • Den fristående klienten förblir framework-fri och databaslös lokalt: mailboxuppgifter ligger kvar i Tools admin, medan klienten bara sparar lokal env/session/logg/sammanfattningsdata.
  • Runnern tolkar nu också SpamAssassin-headers så att uppenbart högscorat skräppost kan hoppas över försiktigare, medan wrapper-liknande SpamAssassin-omskrivningar fortfarande kan kopieras lokalt och rensas bort innan regelmatchning / AI-svar.

DNSBL-engine - köade blacklistmail städas inte längre bort innan write-acceptans

  • Den fristående workern i projects/dnsbl-engine behåller nu spoolfiler tills Tools DNSBL-bulkrequest faktiskt har accepterat motsvarande add/update-operationer.
  • Dubblettfiler för samma köade IP behålls nu kopplade till den IP:n tills acceptans i stället för att kastas bort tidigt som redan hanterade.
  • Headerdrivet message-whitelist-läge är nu avstängt under add-blacklist-körningar, så att lagrad whitelist / SPF-logik fortfarande kan skydda betrodda avsändare utan att SpamAssassin-wrapperheaders kortsluter blacklist-adds.

IRCWatch - strukturerade kanalactioner omfattar nu op/invite tillsammans med topic-liknande actioner

  • IRCWatch skickar nu op, invite och kick genom samma strukturerade kanalaction-lager som redan hanterade topic-liknande actioner, vilket gör PM/manualkörningar mer konsekventa.
  • AI-actionkontraktet tillåter nu också strukturerade Op- och Invite-actioner utöver Topic, Mode och Kick.

Mail Support Assistant - fristående IMAP-klient för supportmail plus Tools-admin/API-konfiguration

  • En ny admin-only-konsol för Mail Support Assistant finns nu på /admin/mail-support-assistant.
  • Där kan admin konfigurera IMAP-mailboxar, sorterade hanteringsregler, standardsändare/BCC/footer och per-regel-AI eller statiska autosvar.
  • Tools exponerar nu också GET /api/mail-support-assistant/config, vilket låter den fristående PHP-klienten hämta mailbox-/regelkonfiguration med bearer-token i stället för att behöva en egen lokal databas.
  • Den första fristående projektscaffolden ligger nu under projects/tornevall-tools-mail-assistant/ med egen README.md, CHANGELOG.md, AGENTS.md, env-styrt mini-webbgränssnitt och CLI/cron-runner-skelett.

API-nycklar - AI-mottagartoken håller nu is_ai konsekvent medan provider_openai fortsatt är undantaget

  • is_ai normaliseras nu mer konsekvent varje gång API-nycklar skapas eller uppdateras i Tools nyckel-UI.
  • Äldre/genererade tools_ai_bearer-token tvingar fortfarande is_ai=1.
  • Uppströmssecret provider_openai undantas nu uttryckligen från is_ai, eftersom den är providerhemligheten som används mot OpenAI och inte en klienttoken som används mot Tools.
  • När OpenAI-access avslås eller en användare bannas rensas nu alla personliga AI-mottagartoken för användaren, i stället för att bara radera den gamla tools_ai_bearer-raden.

Tools AI-auth - personliga AI-kapabla token kan nu autentisera systemspecifika klienter som IRCWatch

  • Tools AI-endpoints behöver inte längre förlita sig enbart på den äldre providernyckeln tools_ai_bearer.
  • Personliga API-nycklar kan nu markeras som AI-kapabla, vilket gör att en klient kan behålla sin egen provideridentitet (till exempel provider_ircwatch) och ändå autentisera mot Tools-hostade AI-endpoints.
  • Själva OpenAI-körningen kräver fortfarande att tokenägaren har godkänd provider_openai-access eller admin-bypass; den AI-kapabla tokenen bevisar bara klientidentitet och användarägarskap.
  • SocialGPTs/extensionens validate-token- och smoke-test-endpoints rapporterar nu vilken tokenprovider som faktiskt löstes och accepterar också dessa personliga AI-kapabla token.

IRCWatch - PM-kommandon kan nu ge +o och göra manuella eller AI-stödda kickar

  • IRCWatch stöder nu privata operatorförfrågningar som op #channel och ge mig op på kanal #channel, vilket skickar MODE #channel +o <nick> när avsändaren är behörig för kanalen.
  • IRCWatch-owners/masters kan nu också skicka kick <nick> <#channel> [reason] för en direkt kick med egen vald reason.
  • Ett nytt PM-kommando aikick <nick> <#channel> <motivation> låter IRCWatch fråga Tools/OpenAI efter en kort kickreason innan kicken skickas.
  • IRCWatch stöder nu också lokala overrides för responder/persona/instruction, så promptidentiteten behöver inte längre återanvända SocialGPT-extensionens standardvärden.

SocialGPT - Chrome-först-manifestet kan nu bygga paket även för Edge, Opera och Firefox

  • SocialGPT-källträdet behåller fortfarande rotfilen manifest.json som Chrome-först-manifest för utveckling och första testpasset.
  • Release-paketeringen går nu via projects/socialgpt.sh, som bygger webbläsarspecifika arkiv under projects/socialgpt-chrome/dist/ i stället för att zippa källmappen rakt av.
  • Chrome-, Edge- och Opera-byggen återanvänder för närvarande samma manifest, medan Firefox-paketet får en build-time-patch för browser_specific_settings.gecko så att repots manifest kan fortsätta vara Chrome-orienterat.
  • SocialGPTs request-telemetri rapporterar nu också ett webbläsarmedvetet client_platform-värde (chrome_extension, edge_extension, opera_extension eller firefox_extension) i stället för att alltid säga Chrome.

2026-04-16

Feed-analyser i publik vy - /feed visar nu en utgåva per period igen, och feed-admin kan rensa bort extra cachade utgåvor

  • Den publika /feed-översikten visar nu bara den enda valda publika utgåvan för varje kategori-/sajtperiod (daily, weekly, monthly, yearly) i stället för att rendera flera cachade utgåvor inline.
  • Det tyngre läget där man granskar alla sparade utgåvor är nu begränsat till kategorikortssidan när man medvetet öppnar /feed/cards/{categorySlug}?show_all=1.
  • Kategori-/sajtkorten i feed-admin har nu också en städåtgärd Keep only selected edition som raderar alla andra cachade analyser för vald period men behåller den utgåva som för tillfället är vald.

Publik feedreader - inbyggda artikellänkar av typen "Read more" återanvänder nu /out/{contentId}

  • Den publika feedreadern skriver nu om inbyggda artikellänkar inne i renderade description/content-block när de pekar på samma artikel som posten själv, så sådana "Read more"-länkar går via Tools-redirecten /out/{contentId} i stället för att exponera den externa URL:en direkt.
  • Samma återanvändning av redirecten gäller nu konsekvent i huvudflödet, kategoriflödet och kortvyn för kategorier.

WordPress-checkern för DNSBL - primärtexten säger nu tydligare när svaret kommer från DNS-resolvers

  • Den publika checkern säger nu tydligare att det första "listad" / "inte listad"-svaret kommer från pluginets lokala DNS-resolverkontroll, medan den långsammare Tools API-uppföljningen bara är ett extra bekräftelsesteg för delist-detaljer.
  • Reset/input-ändringar invaliderar nu också äldre checker/CIDR-callbacks mer aggressivt, vilket minskar risken att gamla resultat målar om formuläret efter att användaren redan har börjat en ny sökning.

WordPress DNSBL-pluginet - lokal CIDR-skanning visar nu liveprogress och träfflista utan att lämna 3.1.0-linjen

  • Den avancerade CIDR-kontrollen i WordPress-flödets delistläge stannar nu inne i WordPress i stället för att använda Tools för själva blockskanningen.
  • Pluginet går igenom /24-/32-intervall i små lokala batchar, visar liveprogress under skanningen och håller en synlig träfflista över listade IP-adresser som hittats i blocket.
  • Batch-tempot hålls medvetet försiktigt så att resolversidan inte överbelastas, medan den slutliga CIDR-delete fortfarande går via DNSBL-write-endpointen när den lokala skanningen har hittat minst en listad adress.
  • Advanced-fältets CIDR-värde är nu också den auktoritativa delete-scopen efter handoffen, så användaren behöver inte längre förankra samma block med en separat single-IP-kontroll innan delist skickas.
  • Advanced-handoff väntar nu tills användaren faktiskt klickar på Kontrollera om adressen är listad med ett CIDR kvar i första fältet, så formuläret avbryter inte längre någon som fortfarande håller på att skriva färdigt intervallet.
  • Checker- och delist-submit visar nu också en egen spinner/statusrad i det publika WordPress-formuläret så att användaren tydligare ser att livebegäran fortfarande kör.
  • CIDR-delete riktas nu bara mot de IP-adresser som den lokala CIDR-skanningen faktiskt hittade som listade, och de delete-anropen skickas nu sekventiellt en IP i taget i stället för i chunkade bulkbatchar.
  • Om ett giltigt CIDR skrivs direkt i det första checker-IP-fältet öppnas nu Advanced automatiskt, CIDR-värdet flyttas dit och det värdet blir den fortsatta auktoritativa scopen i stället för att användaren lämnas kvar i ett ogiltigt single-IP-läge.
  • Pluginets release-dokumentation har samtidigt normaliserats så att dessa underhållsförbättringar fortsätter ligga under nuvarande 3.1.0-linje i stället för att hitta på en separat versionshöjning.

DNSBL-removals - varje delistförsök får nu en egen dedikerad audithändelse

  • POST /api/dnsbl/records/delete och delete-poster inne i POST /api/dnsbl/records/bulk skapar nu egna DNSBL-removal-auditloggar i backend, separerade från den bredare generella DNSBL API-requestloggen.
  • Removal-auditen innehåller auktoritativ delete-metadata när den finns tillgänglig, till exempel skickad IP, resolved owner-namn, berörda zoner, target-värden, dry-run-status och slutresultat (success, denied, failed eller valideringsrelaterad blockering).
  • En ny Slack-loggkategori DNSBL removal audit kan nu aktiveras när man vill ha riktade delist-notiser utan att slå på hela Slack-strömmen för API /dnsbl requests.

2026-04-15

Feedfrågor - fixad modelluppslagning, kontextkrasch och konsekvent markdown-rendering

  • Feed Q&A anropar inte längre en gammal modellkatalogmetod vid val av svarsmodell, vilket tar bort varningen om ModelCatalogService::getAvailableModels() och gör att vald svarsmodell åter följer den aktuella katalogkontraktet.
  • Kontextbyggaren för frågeprocessen definierar nu listan med scoped feed-id:n innan progressrapporteringen använder den, vilket fixar kraschen Undefined variable $feedIds som annars kunde avbryta vissa frågor innan svarsgenereringen.
  • Senaste/nyliga Feed Q&A-svar renderas nu mer konsekvent med samma säkra markdown-format på /feed, i den site-specifika frågepanelen och i liveuppdaterade AJAX-svar, så markdownlänkar och stycken inte längre visas som råtext på de ytorna.

DNSBL API - delist avgör nu själv vilka blacklist-subzoner som ska raderas

  • POST /api/dnsbl/records/delete och delete-poster inne i POST /api/dnsbl/records/bulk räknar nu fram de verkligt listade owner-namnen genom en live DNS-inspektion av den skickade IP-adressen innan någon låg-nivå-DNS-delete försöks.
  • Klientens publication_type / bitmask är inte längre sanningskällan för delete-scope; DNSBL-endpointen avgör nu själv vilka av dnsbl.tornevall.org, opm.tornevall.org, bl.fraudbl.org och ecom.fraudbl.org som faktiskt ska delistas.
  • Detta flyttar delist-orkestreringen tillbaka till Tools i stället för WordPress-checkern/pluginet och gör att delete alltid följer IP-adressens aktuella live-DNS-läge.
  • WordPress-checkern skickar nu bara en delete-begäran per IP-adress (i stället för att expandera samma kontrollerade IP till flera delete-anrop), och misslyckade checker-delistningar nollställer Turnstile-verifieringen så att användaren kan prova igen direkt med en ny token.
  • Timeouten på WordPress-sidan för DNSBL-skrivanrop har också höjts så att den nyare serverside-styrda delete-logiken får mer tid att bli klar innan pluginet avbryter anropet.
  • I checker-läget visar ett klick på Delist nu skickarstatusen direkt på delist-knappen samtidigt som båda checker-knapparna förblir inaktiverade tills anropet är klart, vilket minskar risken för dubbelklick och dubbla submits.
  • Den dynamiska DNS-transporten för blacklist-subzoner uppdaterar nu den verkligt auktoritativa parent-zonen (fraudbl.org / tornevall.org) samtidigt som de konkreta child-zone-owner-namnen fortfarande tas bort, vilket fixar NOTAUTH-fel där BIND tidigare avvisade bl.fraudbl.org eller opm.tornevall.org som update-zon.

Microsoft To Do - plattformsappens konfiguration syns nu direkt på integrationssidan

  • /settings/integrations/microsoft-todo visar nu en diagnostikpanel för den delade Microsoft Entra / Graph-appen med information om appen är komplett, vilka obligatoriska fält som saknas och vilken callback-URL som är effektiv/rekommenderad för aktuell host.
  • Acknowledged admins kan nu spara/uppdatera den databasbaserade Microsoft To Do-plattformsappen direkt från sidan via AJAX när miljö-värden inte redan styr den.
  • GET /api/microsoft-todo/status returnerar nu additiv, icke-hemlig platform_app-diagnostik så att autentiserade klienter kan se skillnaden mellan “inte ansluten” och “hostens Microsoft-app är inte konfigurerad ännu”.

Publik entry-historik - /feed/entry kan nu växla till side-by-side-diff

  • Historikblocket på /feed/entry/{contentId} har nu en liten diff-toggle så att man kan växla mellan den befintliga highlight-diffen och en side-by-side-jämförelse av varje intilliggande revisionspar.
  • Standardläget är fortfarande den nuvarande inline-diffen, och den råa kronologiska Versions-listan ligger fortfarande kvar under diffblocket för granskning av en revision i taget.

SocialGPT Chrome (v1.2.16) - popup och snabbmeny routas nu till rätt frame

  • Popupens Open Toolbox in active tab är inte längre beroende av vilken injicerad frame som råkar svara först.
  • Bakgrundsworkern inspekterar nu alla injicerade frames och routar förfrågan till den mest relevanta (befintlig Toolbox-frame, frame med markerad text, frame med fokuserat textfält, annars toppframen).
  • Högerklicksflödena Open Toolbox och Verify fact with Toolbox använder nu samma frame-medvetna routing, vilket gör funktionen betydligt stabilare på iframe-tunga eller app-liknande sidor.

2026-04-14

DNS-editorn - zonladdning kraschar inte längre när cacheinställningar aldrig har sparats

  • När en zon laddas i DNS-editorn används nu standardvärden för cache-policy även om zonen ännu inte har någon rad i dns_zone_settings.
  • Detta fixar felet Attempt to read property "last_invalidated_at" on null vid första laddningen för zoner som aldrig har fått egna cacheinställningar sparade.

Publika kategorikort för feed - länken “Show all” visar nu faktiskt alla analysvarianter

  • Den publika sidan /feed/cards/{category} respekterar nu show_all=1 från översiktssidan, så den länkade sidan visar alla sparade analysvarianter för varje period i stället för att tyst falla tillbaka till en enda vald variant.
  • Verktygsraden på kortsidan behåller nu show_all-läget när man ändrar sidstorlek eller historikinställningar, och periodrubriken visar tydligt hur många varianter som visas.

DNSBL-delistning - checker-lägets delist väntar inte längre på bakgrundsuppföljningen, och blacklist-subzoner återanvänder root-TSIG-nycklar

  • WordPress-checkern för DNSBL låter nu användaren klicka på Delist direkt så fort den första DNS-kontrollen redan har bekräftat att IP-adressen är listad, även om den långsammare Tools API-uppföljningen fortfarande kör i bakgrunden.
  • Checkern fortsätter att visa att bakgrundsuppföljningen pågår, men den blockerar inte längre själva delistningen när listningen redan är bekräftad.
  • DNS-uppdateringarnas nyckeluppslag använder nu root-domänen för blacklist-subzoner, så att bl.fraudbl.org och ecom.fraudbl.org använder nyckelkonfigurationen för fraudbl.org, medan dnsbl.tornevall.org och opm.tornevall.org använder nyckelkonfigurationen för tornevall.org.
  • Den root-baserade nyckelmappningen används nu även i den direkta socket-baserade DNS-update-vägen, så add/delete inte längre faller tillbaka till saknade nyckelfiler som bl.fraudbl.org.conf på system där bara fraudbl.org.conf finns.

RSS-analys - enklare rensning av gamla buckets och rikare genereringsloggning

  • Kategori-/sajt-korten i feed-admin har nu en tydlig Purge old buckets-åtgärd för vald period, så det blir enklare att rensa bort äldre cachade analyser som ligger kvar från tidigare bucket-semantik.
  • Variantväljare för analyser i både feed-admin och /feed visar nu sparad bucket-etikett, så äldre cachade varianter blir lättare att identifiera innan de tas bort.
  • OpenAI-engine-audit för RSS-analyser skickar nu med rikare körkontext såsom analyssteg, kategori/sajt, periodtyp, bucket, språk, varianttitel och antal poster/flöden.

DNSBL WordPress-checker - lugnare följdtext vid token av fel typ

  • WordPress-checkern för DNSBL behåller nu det första DNS-baserade beskedet om att IP-adressen är listad som huvudbudskap även när bakgrundskollen mot Tools API upptäcker att den konfigurerade tokenen tillhör en annan Tools API-provider/token-typ.
  • I det läget presenteras tokenproblemet som ett problem att bekräfta delist-rättigheter, i stället för att få det att låta som att själva listningsresultatet plötsligt ändrades.

RSS-analys - kalenderstyrd overwrite och tydligare periodetiketter

  • Daglig/veckovis/månadsvis/årsvis analys använder nu kalenderanpassade periodintervall i snapshots:
    • daily: innevarande dag,
    • weekly: innevarande ISO-vecka (måndag som veckostart),
    • monthly: innevarande kalendermånad,
    • yearly: innevarande kalenderår.
  • Val av aktuell period i feed-admin prioriterar nu varianter från aktiv bucket (period_bucket), så äldre default-varianter från tidigare perioder inte längre skymmer aktuell periodanalys.
  • Analyskorten i feed-admin visar nu tydlig periodetikett från bucket-identitet (exempelvis Week 16 (2026), Month 2026-04, Year 2026) tillsammans med genereringstid.
  • Prompttexterna för kategori-/sitanalys matchar nu kalendersemantik (current ISO week, current month to date) i stället för rullande formuleringar som last 7/30 days.

DNSBL API - CSRF-undantag för alla /api/dnsbl/*-rutter

  • Alla POST /api/dnsbl/*-endpoints (inklusive check-ip, records/add, records/delete, records/update, records/bulk) är nu undantagna från CSRF-verifiering i VerifyCsrfToken.
  • Detta löser HTTP 419-fel som uppstod när serverbaserade klienter (WordPress-plugin, Android-app eller annan token-autentiserad API-anropare utan browsersession/CSRF-cookie) skickade förfrågningar till dessa endpoints.
  • Sessionsbaserad autentisering för adminanvändare via webgränssnittet påverkas inte — web-middleware-stacken (och därmed sessioner) är fortfarande aktiv på DNSBL-rutterna.

DNSBL API - tydligare token-diagnostik på write/check-rutter

  • Auth-fel på /api/dnsbl/check-ip och /api/dnsbl/records/* skiljer nu på:
    • okänd/återkallad DNSBL-token,
    • matchad Tools-token av fel typ/provider (reason="wrong_token_type"), och
    • inaktiv admin-API-nyckel (reason="inactive_admin_api_key").
  • Detta linjerar write/check-diagnostiken med GET /api/dnsbl/token/info, så klienter kan se när en token faktiskt känns igen men tillhör fel auth-modell.

VirtualBox Manager - nytt web GUI för vboxwebsrv-maskinparker

  • Lade till ett nytt behörighetsstyrt admin-GUI på /admin/virtualbox för att hantera VirtualBox-värdar via vboxwebsrv.
  • Användare med virtualbox.manage kan registrera egna serverendpoints (host, port, username, password) och hålla flera serversegment i samma panel.
  • Varje serverkort laddar nu en expanderbar VM-lista med minimalistisk förstavy och direkta VM-åtgärder.
  • Stödda VM-åtgärder i den här releasen: start, stop, restart, delete, plus uppdatering av grundinställningar (memory, cpus, vram, boot1).
  • Lade till krypterad lagring av serverinloggning (virtualbox_servers) och separat permission-migration för virtualbox.manage.
  • Lade till tjänstekort på /services och ny EN/SV-dokumentation (/docs/en/virtualbox-manager, /docs/sv/virtualbox-manager).

VirtualBox Manager - AJAX-styrda operationer + standardvärden vid VM-skapande

  • De flesta VirtualBox-operationer på /admin/virtualbox körs nu via AJAX, så normala åtgärder kräver inte längre full postback/redirect.
  • Lade till direkt VM-skapande per serversegment (Create new VM) för praktisk provisioning även när unattended install inte används.
  • Standardvärden för nya VM är nu: nätverksläge bridged, minne 1024 MB och disk 25 GB.
  • Skapa-VM-formuläret kan nu läsa av serverregistrerade installationsbara DVD/ISO-medier och föreslå sökvägar.
  • Om ISO-inventering inte går att läsa för en server fungerar VM-skapandet ändå med manuell ISO-sökväg (eller utan ISO).

VirtualBox Manager - fix för ogiltiga VBoxManage-flaggor i remote-läge

  • Tog bort ogiltiga VBoxManage-flaggor (-H, -p, -u, -w) som gav Oracle-helptext och fel som Invalid command '-H'.
  • Körläget är nu tydligt: nuvarande implementation kör endast lokala VBoxManage-kommandon.
  • Icke-lokala host-värden ger nu ett tydligt driftmeddelande direkt i stället för missvisande credential-/anslutningsfel.

VirtualBox Manager - fjärrvärdar körs nu via SSH

  • Fjärrvärdar i VirtualBox Manager körs nu via SSH i stället för att hårdstoppas.
  • host, port, username och krypterat password från serverkortet används nu för att köra fjärrkommandon med VBoxManage --nologo ....
  • SSH-körning följer nu porten som är konfigurerad per server (standard bör vara 22 för SSH, inte äldre 18083).
  • Felmeddelanden är nu tydligare för vanliga SSH-fel:
    • auth-fel (sshpass exit code 5) ger credential-vägledning,
    • anslutningsfel (255) ger vägledning om host/port/brandvägg.
  • Hjälptexten i /admin/virtualbox är uppdaterad så den matchar driftläget: lokal körning för localhost och SSH-körning för fjärrvärdar.

2026-04-13

SocialGPT - klientversionsmetadata och starkare skydd mot utlämning av hemligheter

  • POST /api/ai/socialgpt/respond accepterar nu additiva klientmetadatafält: client_name, client_version och client_platform.
  • Lyckade och misslyckade SocialGPT-svar kan nu ekoa tillbaka dessa accepterade klientmetadata i ett additivt client-objekt, vilket gör det lättare att se vilken extension-/appbuild som skickade requesten.
  • Guardrails på Tools-sidan tillåter nu uttryckligen att AI:n berättar vilken modell som används och vilken klientversion som körs när användaren uttryckligen frågar om versions-/modellinformation.
  • Samma guardrails blockerar nu uttryckligen försök att få ut interna Tools-detaljer som dolda prompts, källkod, .env-värden, lösenord, token, API-nycklar och liknande hemligheter.
  • När en SocialGPT-interaktion matchar sådana secret-exfiltration-mönster kan Tools nu skicka en incidentrapport via e-post till den konfigurerade supportmottagaren.

DNS-editorn - cache-sökning kraschar inte längre på IP-frågor med null-bytes

  • DNS-sökningen mot cachad zondata rensar nu bort null-bytes och andra kontrolltecken från inkommande search-/IP-strängar innan inet_pton() körs.
  • Det rättar DNS-editorfelet inet_pton(): Argument #1 ($ip) must not contain any null bytes när trasiga/inklistrade sökvärden nådde /api/dns/zones/{zone}/search.

SMS - supportmail för inkommande och utgående aktivitet

  • Tools kan nu skicka e-post till support@tornevall.net (eller den konfigurerade mottagaren för SMS-aktivitet) när ett inkommande SMS sparas eller ett utgående SMS köas.
  • Automatiska prefixstyrda svar som läggs i GSM-kön ingår också i samma aktivitetsmailflöde.

2026-04-10

SocialGPT Facebook-dashboard - godkända och avvisade åtgärder delas nu upp mellan medlemsförfrågningar och väntande inlägg

  • Facebooks adminstatistik-dashboard härleder nu en andra modereringsklassning från den sparade adminloggtexten, så Approved och Rejected kan delas upp i medlemsförfrågningar respektive väntande inlägg.
  • Godkända/avvisade anonyma väntande inlägg räknas in i totalsumman för väntande inlägg, och sammanfattningskorten visar nu också den anonyma delmängden separat.
  • Detta är gjort i rapporteringslagret, vilket betyder att redan inskickade extension-payloads fortsätter fungera utan någon kontraktsändring i SocialGPT-tillägget.
  • Den svenska keyword-listan bakom klassningen lagras nu dessutom med riktiga åäö, medan matchningen fortfarande är accentokänslig så att både förfrågan och ASCII-fallback som forfragan klassas likadant.
  • Publika delade Facebook-grafsidor (/shared/facebook/chart/{token}) uppdateras nu automatiskt varje 60 sekunder (tidigare 300 sekunder), och nedräkningen i visningen följer samma intervall.

DNSBL-delistflödet - ny tokenstödd IP-inspektion och explicit audit-routing

  • Lade till POST /api/dnsbl/check-ip, en live DNS-inspektionsendpoint som returnerar vilka DNSBL/FraudBL-publiceringsfamiljer som just nu är listade för en IP samt vilka delist-kandidater det autentiserade tokenet/sessionen kan agera på.
  • WordPress DNSBL-pluginet håller nu första checker-svaret DNS-baserat och omedelbart, och kör sedan den nya Tools-endpointen i bakgrunden när ett DNSBL / Tools API-token finns innan delete-åtgärden låses upp.
  • Det betyder att checker-lägets delist nu kan följa rätt publiceringsfamilj (dnsbl, fraudbl, commerce) i stället för att bara lita på första lokala resolverintrycket.
  • DNSBL-write-requester och den nya check-endpointen skriver nu också explicita backendloggar och försöker skicka DNSBL API-aktivitet vidare till konfigurerade audit-/notifieringskanaler när sådana routes/kanaler är aktiverade.

2026-04-09

RSS Watch Feedfrågor - keywordträffar i brödtext följer nu med hela vägen till svaret

  • Feedfrågor slår nu alltid ihop deterministiska fallback-sökord med OpenAI:s keyword-plan, så bokstavliga databassökbara termer som sabah inte tappas bort bara för att AI:n föreslår bredare formuleringar.
  • När en person-/byline-riktad filtrering måste falla tillbaka till bredare keyword-retrieval återapplicerar kontextsteget inte längre det gamla bylinefiltret och tömmer evidensmängden av misstag.
  • De senaste posterna som skickas till modellen innehåller nu korta keyword-styrda utdrag från beskrivning/innehåll, vilket gör att Ask-a-question-svar lättare ser träffar som hittades i artikeltexten och inte bara i rubriken.

RSS-analytics - overwrite current håller sig nu inom den aktiva vecko-/månadsbucken

  • Kategori- och site-analytics härleder nu period_bucket från den aktiva periodens referensdatum i stället för från startdatumet för rullfönstret.
  • Det innebär att overwrite current bara ersätter den aktuella vecko-/månadsbucken och automatiskt går vidare till en ny rad när kalenderperioden byts, i stället för att se ut som att den fortfarande hör till föregående bucket.

WordPress DNSBL-plugin - inbyggd huvudsida för removal kräver nu live delete-behörighet

  • WordPress DNSBL-pluginet kan nu rendera en egen inbyggd huvudtemplate för removal-sidan när den valda delisting-sidan inte redan innehåller någon removal-shortcode.
  • När den primära delisting-sidan sparas gör pluginet nu ett liveuppslag mot GET /api/dnsbl/token/info, och sidan accepteras bara när det konfigurerade tokenet just då har delete / delist-behörighet.
  • Sajtägarna kan fortfarande bygga egna removal-sidor med [dnsbl_removal_form] eller [tornevall_dnsbl_removal_form], och de shortcode-formulären visar nu bara de DNSBL-operationer som det konfigurerade tokenet faktiskt får utföra.

RSS Watch Feedfrågor - extra sökord hålls nu querybara i stället för att bli hjälputtryck

  • Feedfrågor rensar nu bort generiska hjälp-/kontextsuffix från keyword-planerarens output innan termerna återanvänds i den SQL-baserade retrievalen.
  • Flertokensnamn och entiteter hålls därför närmare bokstavliga queryfraser som Tara Sabah eller Tara Saleh, i stället för konstiga varianter som tara sabah artiklar, tara sabah analys eller tara saleh källor.
  • Den readonly-ruta med extra sökord som visas på /feed speglar nu samma städade fraser, så de synliga tipsen bättre matchar ord/fraser som faktiskt kan förekomma i artikelrubriker, beskrivningar, innehåll eller bylines.

RSS Watch Feedfrågor - användaren kan nu se de bokstavliga sökord som faktiskt användes

  • /feed visar nu en separat readonly-ruta med sökord som användes under senaste svaret, bredvid den befintliga hjälprutan för extra sökord.
  • Den site-specifika frågepanelen för en feed visar nu samma keyword-ruta för senaste svaret på just den feeden.
  • /feed/user-questions visar nu de bokstavliga retrieval-sökorden i rutan How this answer was analyzed, så användaren kan jämföra exakt vad som söktes efter mot eventuella bredare extratermer.

RSS inbound XPath-import - nullsäker DOM-hantering för trasiga äldre rulesets

  • Den äldre XPath-importen som används av /api/rss/update skyddar nu sina DOM-hjälpanrop mot null-värden, så delvis matchande eller felaktiga elements-rulesets inte längre kraschar hela inbound-konverteringen med method_exists(..., null)-fel.
  • XPath-extraktionsfel fångas nu också som fulla PHP-throwables i RSS-pipelinen, vilket betyder att en trasig inbound-rad loggas och hoppas över rent i stället för att avbryta hela uppdateringskörningen.

2026-04-08

OpenAI access-request i adminvyer - miljöer utan tabellen fallerar nu mjukt i stället för att krascha

  • /users, /users/{id}/edit, /keys/mine och /admin/openai hanterar nu avsaknad av tabellen openai_access_requests utan SQL-exception.
  • Modellen OpenAiAccessRequest är nu explicit kopplad till det riktiga tabellnamnet openai_access_requests, vilket också rättar miljöer där Laravel annars försökte använda det felaktiga namnet open_ai_access_requests.
  • Om migreringen ännu inte körts fortsätter de berörda sidorna nu att fungera och visar i stället en adminriktad varning om att ansökningskön tillfälligt inte är tillgänglig.

2026-04-07

RSS Watch Feed Q&A - striktare keyword-extraktion och bättre namnträffar

  • Feedfrågor ber nu OpenAI om en striktare JSON-lista med sökord som ordnas från mest specifik fras till bredare stödsökord innan databassökningen körs.
  • Tydliga flertokensentiteter som fullständiga personnamn prioriteras nu som hela fraser, vilket minskar fall där en bred förstnamnsträff råkar dra in fel person.
  • Generiska frågeord och utfyllnadsord som har, du, något, spännande, with, about och liknande filtreras nu bort innan SQL-baserad retrieval körs, även om de finns med i den ursprungliga frågan.
  • Den icke-AI-baserade fallbacken försöker nu bevara starkare fraskandidater (till exempel citerade fraser och tydliga egennamnssekvenser) och breddar bara med mer specifika efterled som efternamn.

2026-04-06

DNSBL token-info - livekontroll accepterar nu alla icke-tomma tokensträngar

  • GET /api/dnsbl/token/info avvisar inte längre icke-tomma tokensträngar enbart för att de faller utanför en lokal längd-/formatkontroll.
  • Endpointen returnerar fortfarande 401 när inget token skickas alls, men gör annars nu ett faktiskt uppslag innan svar ges.
  • Om värdet inte är ett DNSBL write-token men väl matchar en annan Tools-token/provider (till exempel en vanlig Tools bearer-token) returnerar API:t nu ett uttryckligt diagnossvar i stället för ett generiskt formatfel.
  • WordPress-pluginets knapp Check token permissions frågar nu alltid API:t direkt om detta, så operatören kan se vad Tools-backenden faktiskt känner igen i stället för att stoppas av pluginets egen gissning.
  • När det andra matchade tokenet tillhör en aktiv adminägd Tools-token rapporterar API:t nu tokenet som att det har automatisk effektiv DNSBL-access via samma X-Dnsbl-Token-flöde, med fulla effektiva behörighetsfält i lyckat svar i stället för den gamla formuleringen om att det "inte är ett dedikerat write-token".
  • WordPress-pluginets inställningssida speglar nu samma modell med ett synligt fält för DNSBL / Tools API token i stället för att presentera en splittrad tokenmodell i UI:t.

SocialGPT Facebook-dashboard - rikare statistik för returning customers

  • Dashboarden för Facebook admin-activities visar nu en topp-10-lista över returning customers direkt under returning-grafen.
  • Den vanliga activity by outcome-grafen har nu en extra kryssruta som kan lägga på serien Returning users i samma graf.
  • Inskickade Facebook admin-activity-rader fortsätter att vara knutna till ägaren bakom bearer-token som skickade dem.

Min profil + Social Media Tools - direktgenväg från profilen och striktare räkning av upprepade avvisningar

  • Användare som har åtkomst till /admin/social-media-tools kan nu öppna dashboarden direkt från My Profile i stället för att bara behöva hitta den via My API Keys.
  • Facebook-dashboarden tolkar nu den tidigare “returning customers”-metriken som personer som blivit avvisade mer än en gång.
  • Grafen, sammanfattningskorten och den valfria overlay-serien i aktivitetsgrafen följer nu samma striktare definition som bara baseras på upprepade avvisningar.

Användarsäkerhet / OpenAI-access - online-användare, feed-probing, banningsflöde och ansökningsstyrd AI-access

  • /admin/security/online-users härleder nu inloggade webbanvändare från sessionspayload och nyliga spårade sidbesök när databasfältet sessions.user_id är tomt, så inloggade användare inte längre ser ut som gäster bara för att default guard är api.
  • Samma admin-sida har nu en knapp för Expand all visitors så alla sessionsgrupper kan öppnas samtidigt.
  • RSS autoanalys i /rss använder nu en enda konsekvent och tydlig probe-User-Agent i stället för att blanda en Tools-sträng med generiska Mozilla/5.0-anrop.
  • Admin-editorn för användare skiljer nu på Ban user och Delete user. Banning kan lägga till email-/IP-ban, kasta ut aktiva sessioner, återkalla OpenAI-access och ta bort användarens Tools AI bearer-token utan att kontot måste raderas direkt.
  • OpenAI-access är nu ansökningsstyrd för vanliga användare: /keys/mine har ett ansökningsformulär, /admin/openai har granskningskön, och icke-admin-AI-användning kräver nu faktisk godkänd access i stället för att bara råka omfattas av ett dagligt budgettak.

2026-04-05

RSS Watch-analysvyer - localhost-länkar följer nu åter aktiv publik host

  • Cachad analys-markdown på /feed, /feed/c/{categorySlug}, /feed/cards/{categorySlug}, /rss och /feed-admin skriver nu om råkade localhost-/loopback-länkar till den aktuella publika hosten innan de visas på skärm.
  • Generering och omöversättning av kategori-/site-analyser normaliserar nu också dessa host-referenser innan texten sparas, så framtida cachade analyser är mindre benägna att behålla gamla localhost-URL:er.
  • Den publika kategoriöversikten på /feed uppdaterar nu overflow-kontrollen igen när ett ihopfällt kort öppnas, vilket återställer Read more-knappen där.
  • Publika RSS-artikellänkar absolutiserar nu också lagrade relativa källsökvägar mot den ägande feedens real_url/url, så att /out/{contentId} inte längre skickar vidare till en ren path-länk när källan bara lagrat /foo/bar.

SocialGPT Chrome-tillägg - 1.2.15 fixar språkregressionen efter runtime-lokaliseringen

  • Tillägget håller nu popupens/config-sidans UI-översättningar separerade från de faktiska AI-standarderna och språkvalen för svar.
  • Det rättar regressionen där vissa användare med svensk webbläsar-UI kunde få svensk-bias i svaren trots att ett annat svarsspråk var valt.
  • Lokaliserad standardtext för svararprofil och testfråga skrivs inte längre in i de redigerbara fälten som om de vore riktiga sparade AI-inställningar.
  • Drabbade användare får nu en automatisk reparationsväg när tillägget läser in den sparade svararprofilen igen.
  • Popupen/optionsidan har nu en separat väljare för Extension language, och SocialGPTs UI direkt på sidan följer nu samma inställning för Toolbox-chrome, flytande knappar, faktakontrollåtgärder och snabbmenyetiketter.
  • Sandboxed frames som nekar sessionStorage triggar inte längre ett okapslat lagringsfel från Facebook admin reporter inne i tillägget.

Per-feed publishby-namnmappningar för författar-ID:n

  • Lade till ett nytt RSS-lager för mappning av ofärdiga publishby-värden (till exempel numeriska eller äldre ID:n) nycklat på urlid + publishby, så att samma råvärde tryggt kan betyda olika personer i olika feeds.
  • RSS-editorn har nu en per-feed-sida Authors där operatörer manuellt kan koppla råa publishby-värden till ett riktigt visningsnamn.
  • Upplösta författarnamn används nu i publika feed-/artikelsidor, kategorikort, listan över redigerade poster, Feed Q&A:s kontext/retrieval samt i /api/rss/feed/{site}-läsare.
  • API-/feed-läsare får nu det upplösta visningsnamnet samtidigt som ursprungligt råvärde finns kvar som additiv metadata för klienter som behöver båda.

Feed Q&A - fallback för nyckelord hoppar nu över generiska utfyllnadsord

  • När OpenAI-baserad nyckelordsutvinning inte är tillgänglig och Feed Q&A faller tillbaka till enkel tokenisering filtreras nu generiska ord som article, latest, feed, discussion, nyheter och liknande breda etiketter bort före databassökningen.
  • Det gör fallback-retrieval mer förankrat i faktiska entiteter/namn från frågan i stället för att bredda sökningen med brusiga generella ord.

SocialGPT Chrome-tillägg - Facebook-adminstatistik kräver först opt-in i popupen

  • Overlayn på Facebooks admin_activities-sidor hålls nu helt dold om inte den nya popup-kryssrutan Enable Facebook admin activity statistics är aktiverad.
  • Efter detta opt-in i popupen är statistikinsändning fortfarande sidlokal och förblir avstängd tills användaren aktiverar den på den aktuella Facebook-sidan.
  • Om popup-växeln stängs av igen stoppas nu även fortsatt hantering av adminlogg i den aktiva fliken, i stället för att bara gömma UI:t.

SocialGPT Chrome-tillägg - config-sidan speglar nu popupens inställningar

  • Tilläggets större config-/optionsida visar nu samma redigerbara inställningar som popupen och använder samma autosave-/lagringsbeteende.
  • Den tidigare scaffold-texten på sidan togs bort, inklusive den inaktuella notisen om sc4a-insights som companion-modul i just den panelen.
  • Config-sidan är nu tänkt som den tydligare fullstora inställningsytan, medan popupen fortsatt fungerar som den kompakta snabbeditorn.

SocialGPT Chrome-tillägg - popup och config-sida lokaliseras nu dynamiskt

  • Popupen och config-/optionsidan växlar nu UI-språk dynamiskt vid körning i stället för att vara enbart engelska.
  • Svenska stöds nu uttryckligen och väljs automatiskt när webbläsarens UI föredrar svenska, med engelska som fallback för saknade nycklar.

SocialGPT Chrome-tillägg - bearer-token-fält valideras nu inline

  • Tokenfälten i popupen och config-/optionsidan visar nu en lättviktig inline-spinner samt ett godkänt/avvisat resultat medan bearer-token kontrolleras mot Tools.
  • Lade till en lättviktig extension-API-endpoint för detta flöde: GET /api/social-media-tools/extension/validate-token.

SocialGPT Chrome-tillägg - avancerad mark-lägeskontext på config-sidan

  • Tilläggets config-/optionsida innehåller nu en ny sektion Advanced mark-mode context för Toolbox-användare som behöver mer spårbara markerade block.
  • Standardbeteendet är oförändrat: markerad kontext använder fortfarande kompakt [1], [2]-numrering om användaren inte väljer något annat.
  • Avancerade användare kan nu lägga till genererade mark-id:n (till exempel tn-mark-2), rikare elementbeskrivningar och valfria bredare extraktionslägen som go one parent up eller go one parent up + scan direct child blocks.
  • När ett rikare mark-etikettläge är aktiverat visar aktiva markerade element nu också en synlig lokal badge på sidan så att DOM-blocket lättare kan kopplas till kontexten i Toolbox.

SocialGPT Chrome-tillägg - popupgenväg till Toolbox, flyttbar panel och iframe-medveten fångst

  • Popupen innehåller nu Open Toolbox in active tab, vilket ger användaren en direkt fallback på sidor där det vanliga högerklicksflödet är opålitligt.
  • Om sidan redan har en aktiv textmarkering importerar popupgenvägen den markeringen direkt in i Toolbox i stället för att öppna en tom panel.
  • Toolbox-panelens header är nu flyttbar så att panelen kan dras bort från trånga delar av sidans UI.
  • Toolboxens stängningskontroll × fungerar nu igen efter ändringen med flyttbar header.
  • Timing för selection-overlay har hårdnats så att Open Toolbox och Verify fact visas mer tillförlitligt efter korta direktmarkeringar och dubbelklicksmarkering.
  • Avancerad mark-lägesextraktion stöder nu också hela den aktuella framens/dokumentets text, och tillägget kör nu sina content scripts i nästlade frames (inklusive matchande about:blank-child frames) där Chrome tillåter det.

RSS-scraper: väntetrådar vid idle + tidsstämplade loggar

  • GET /api/rss/urls returnerar nu additiv scraper-idle-metadata (idle) när inga URL:er är due för den anropande agenten.
  • Idle-payloaden innehåller reason, wait_seconds, wait_minutes, next_poll_at och identiteten för nästa väntade URL så scraper-workers kan se när arbete sannolikt återkommer.
  • Den medföljande runnern projects/scraper/scrape.php skriver nu tidsstämplade statusrader och försöker dessutom spara dem till SCRAPE_LOG_FILE eller /var/log/tools-scraper/scrape.log när sökvägen är skrivbar.
  • Körningar utan arbete avslutas nu rent i stället för att behandlas som fel, och scrapern loggar backendens väntetråd när den finns.

RSS Watch-dokumentation: front matter-fix + crawler-intro

  • Fixade en delimiter-typo i front matter i docs/en/rsswatch.md som gjorde att metadata visades som vanlig text i docs-renderingen.
  • Lade till ett nytt inledande segment som beskriver vad RSS Watch är (publik läsare + ingest-pipeline) och dokumenterar aktuella User-Agent-mönster för scrape/trigger-workers.

Moderniserad scraper User-Agent (ingen ändring av rapporteringsnyckel)

  • Ersatte äldre UA-format RssWatch-2.0/<hostname> i scraper-runners med crawler-liknande RSSWatchBot-strängar inklusive docs-URL.
  • Agentattribuering/schemarapportering är oförändrad eftersom den fortsatt använder agent_id=<hostname> i API-anrop.

Publik kategorikortvy - analyser först + artiklar/historik tillbaka

  • /feed/cards/{categorySlug} renderar nu AI-analyser överst och därefter kategorins artikelström under (i stället för enbart analysfokus).
  • Analysvalet är nu balanserat per period: en vald variant vardera för daily, weekly, monthly och yearly när sådana finns.
  • Artikelrader i kortvyn har nu samma versionshistorik- och diffbeteende som den klassiska kategorivyn.
  • Kortvyn har nu dessutom ett mer redaktionellt/tidningslikt uttryck med masthead-liknande toppsektion och huvudartikel först.

Feed Q&A - författare-först via publishby för personinriktade frågor

  • Feed-frågor detekterar nu explicit personfokus i frågetexten (till exempel "artiklar som Andreas Magnusson skrivit").
  • När personfokus hittas kör retrieval ett förstapass med filter mot rss.content.publishby för att minska sammanblandning mellan olika skribenter.
  • Om det inte blir träff i det författarfiltrerade passet (till exempel äldre rader med ID-liknande byline) växlar systemet automatiskt tillbaka till bredare keyword-retrieval.
  • Retrieval-metadata sparar nu om författarfilter begärdes, tillämpades och om fallback användes.

2026-04-04

Feed Q&A – artikellänkar i AI-svar

  • AI-analysens kontext inkluderar nu artikellänkar (link-fältet) för de senaste inläggen och versionshistorikens artiklar.
  • När AI:n citerar specifika artiklar formateras de som markdown-hyperlänkar [Titel](url) om artikelns URL finns i kontexten.
  • Det inbyggda svarspanelet på /feed renderar nu markdown-länkar som klickbara hyperlänkar.
  • Session-flash-svaret (som visas efter sidinladdning) renderar också med full markdown, konsekvent med historikssidan.
  • Dolda flöden är skyddade: deras artikellänkar skickas aldrig till AI-kontexten.

Feed Q&A – varning om datanoggrannhet

  • Ask AI-panelen på /feed visar nu en liten notis under beskrivningen som påminner användare om att svar baseras på tillgängligt indexerat innehåll, att vissa sajter kan ha begränsad historik, och att svar inte alltid är fullständiga eller helt exakta.
  • Varningen är fullständigt översatt på alla fem stödda gränssnittsspråk (EN, SV, DA, NO, FI).

Feed Q&A – progressdetaljfraser är nu översättningsbara

  • Progressdetaljmeddelanden som visas under analys (t.ex. "Förfinar underlaget…", "Tar fram sökord…") hämtas nu från phraseöversättningssystemet.
  • Svenska och övriga stödda språk visar nu sin egen översatta text för dessa detaljmeddelanden i stället för den engelska fallbacken.

Feed-fraser – saknade översättningar ifyllda

  • Korrigerade saknade phraseöversättningar för alla stödda språk:
    • Svenska: ask_error_required, ask_error_captcha, ask_error_generic, site_analytics_title (föll tillbaka på engelska).
    • Danska: ask_error_required, ask_error_captcha, ask_error_generic.
    • Norska: ask_asking, ask_error_required, ask_error_captcha, ask_error_generic.
    • Finska: ask_error_required, ask_error_captcha, ask_error_generic, site_analytics_title.

DNSBL token-informationsendpoint

  • Ny GET /api/dnsbl/token/info-endpoint låter klienter kontrollera behörigheterna för ett konfigurerat DNSBL-token utan att kräva inloggad session.
  • Skicka token via X-Dnsbl-Token-header eller ?dnsbl_token= query-parameter.
  • Returnerar tokenets namn, status, add/delete-scope, adminstatus, godkännandetidpunkt samt de zoner tokenet får verka i.
  • Fungerar för token i valfritt tillstånd (active, pending, revoked) så klienter kan se exakt varför ett token inte fungerar.
  • WordPress DNSBL-pluginets adminpanel visar nu en "Check token permissions"-knapp bredvid det konfigurerade tokenfältet. Ett klick gör en live-kontroll och renderar en behörighetstabell direkt på sidan utan att ladda om.

WordPress DNSBL-plugin - fix av oändlig loop i sanitize-callback

  • Åtgärdade en fatal stack overflow som uppstod när inställningar sparades med ett skriven token konfigurerat. sanitize_option-callbacken anropade update_option vilket åter triggade samma filter och skapade oändlig rekursion. En statisk re-entrancy-guard lades till för att förhindra detta.

DNSBL write API - dry-run-kvittenser för säkrare tester av delist/list

  • POST /api/dnsbl/records/add, /delete, /update och /bulk accepterar nu valfri dry_run.
  • Dry-run-requester validerar token-scope, payload och zonbehörighet och returnerar sedan en kvittens utan att skriva DNS-ändringar.
  • Svar innehåller nu dry_run och dry_run_accepted för att bekräfta att backend körde simuleringsläge.

WordPress DNSBL-plugin - shortcode-baserat delistformulär

  • DNSBL-pluginet för WordPress stöder nu ett inbäddningsbart formulär via shortcode ([dnsbl_removal_form]) med HTML/AJAX-submission via WordPress-backendproxy.
  • Formuläret stöder både lokalt WordPress dry-run och Tools API dry-run-kvittens för säkrare preflight-tester.

Feedfrågor - rikare analysmetadata per fråga för breda scope

  • Feedfrågor sparar nu en rikare analysmetadata per fråga, inklusive scope-läge, broad-scope-indikator, kontextstorlek, blockmetadata och retrievalstrategi.
  • Det här är särskilt användbart när ingen kategori/sajt är vald eller när många sajter ingår, där blockanalys kan samla större underlag.

Feedfrågehistorik - ruta för "Hur svaret analyserades"

  • /feed/user-questions visar nu en kompakt analysruta per färdig fråga.
  • Rutan visar analysmetod (single-pass vs block/chunked), scope-/retrievaldetaljer samt extra sökord som användes före slutsvaret.

Publika /feed-kategorier – kompakt kortvy och visningstak per period

  • Ny publik route: /feed/cards/{categorySlug} för en kompakt, kortbaserad AI-analysvy.
  • Klassiska kategorirouten /feed/c/{categorySlug} är kvar oförändrad och har nu en snabb länk till kortvyn.
  • Kategori-analyser på /feed visar nu max 3 varianter per period (daily/weekly/monthly/yearly), med direkt "Show all"-länk vidare till kortvyn.

RSS-analyticsgenerering – djupare schemalagd analys via segmenterade block

  • Kategori- och sajtanalytics kan nu köra segmenterade blockpass före slutsyntes när perioddatasetet är stort.
  • Gäller schemalagda/CLI/API-genererade daily-, weekly-, monthly- och yearly-körningar och ger djupare samt jämnare resultat på större underlag.

Publik feedsökning – byline/författarträffar inkluderar nu publishby

  • Fritextsökningen på /feed inkluderar nu content.publishby i fallback-LIKE-matchning och poängsättning, vilket förbättrar personnamnssökningar.

RSS-import – creator/author-metadata fångas nu säkrare

  • RSS/Atom-importen sparar nu creator/author tydligare i content.publishby när feeden exponerar fältet (inklusive fler feedvarianter där detta tidigare kunde tappas).
  • Ny RSS-DB-migration skapar content.publishby om kolumnen saknas, så byline kan lagras i stället för att försvinna.
  • Dubblettskyddet ignorerar nu uttryckligen byline-only-ändringar: om link + title + description + content är oförändrat skapas ingen ny rad bara för att publishby tillkommer, försvinner eller ändras.

e ### RSS-scrapern – Centerpartiets textextraktion normaliserar nu osäker teckenkodning säkrare

  • Centerpartiets specialscraper normaliserar nu hämtad HTML och extraherad text till UTF-8 före scriptparsing, textstädning och DOM-fallback-parsing.
  • Det minskar risken att svenska tecken blir trasiga när källsidan eller transportbytes inte är ren UTF-8.

RSS-import – XPath pass-through förstör inte längre redan UTF-8-kodad text

  • RSS-importens XPath-pass-through kör inte längre utf8_decode(...) på renderade radvärden före insert.
  • Det stänger en korruptionsväg där redan UTF-8-kodade titlar, beskrivningar och andra extraherade fält kunde tappa svenska tecken vid import från syntetiska HTML-källor.

2026-04-03

Publika /feed – kategorikort startar ihopfällda och kan färgkodas

  • Kategorikorten på /feed startar nu ihopfällda som standard när ingen tidigare preferens finns sparad.
  • Sidan minns nu bara senast öppnade kategorikort i en cookie och återställer det kortet vid nästa besök i stället för att öppna flera gamla sektioner samtidigt.
  • Feed Admins kategoriinställningar stöder nu en publik accentfärg per kategori. Den publika feeden mjukar automatiskt upp färgen så att mörk text fortfarande är lättläst i light mode.

RSS-editorn – WordPress auto-detect faller nu tillbaka rent när wp-json är låst

  • Add-feed-autodetect behandlar nu 401 och 403 från /wp-json/wp/v2/posts som otillgänglig WordPress REST-data.
  • När det händer fortsätter analysen med vanlig feedupptäckten (<link rel="alternate">, /feed, /rss.xml osv.) i stället för att anta att WordPress REST-endpointen kan användas.

RSS-scrapern – stöd för Centerpartiets nyhetssida via AppRegistry och syntetisk HTML

  • Scraperprojektet kan nu specialhantera nyhetssidor på centerpartiet.se före det vanliga RSS/XPath-importsteget.
  • I stället för att bara läsa synlig HTML extraheras nu rätt AppRegistry.registerInitialState(...) dynamiskt från sidans bootstrap-script och byggs om till stabil syntetisk HTML.
  • Den syntetiska HTML-strukturen är avsedd för manuella sitetype=xpath-regler, vilket gör Centerpartiets nyhetslista enklare att mata in i befintlig importerare utan att /api/rss/update behöver lära sig ett nytt råscript-format.
  • Om script-state-extraktionen misslyckas faller scrapern tillbaka till att läsa redan renderade <article>-noder från sidan.

RSS-editorn XPath Lab – legacy-kompatibilitetsvy för href/attributproblem

  • /rss/xpath-lab visar nu både en snabb labbpreview och en separat Production / legacy scraper compatibility preview som kör samma XPath-renderare som liveimporten använder.
  • Kompatibilitetspanelen markerar nu ett vanligt fel där icke-value-extraktorer som href tyst hoppas över eftersom legacy-renderaren förväntar sig matchande extractor-nycklar i pipeline[3].
  • Labbet varnar nu uttryckligen för den mismatchen och rekommenderar ett säkrare mönster: extrahera attributnoder direkt (/@href, /@src, /@datetime) och mappa dem via "value".
  • OpenAI-prompten för att generera XPath-regler har också uppdaterats så att AI:n i första hand föreslår det säkrare attributnod-mönstret.

Feedfrågor – live-progress och tydligare återkoppling för långsamma frågor

  • /feed och den site-specifika feedfrågepanelen växlar nu submit-knappen till ett tydligt spinnerläge medan en fråga analyseras.
  • Webbläsaren poll:ar nu dedikerade webb-endpoints för status så att UI:t kan visa aktuell backendfas, förfluten tid, föranalys-pass och blockprogress för större frågor.
  • Det gör att långa flerpassfrågor känns betydligt mindre "hängda", särskilt när backenden fortfarande arbetar igenom sekventiell blockanalys.

Feedfrågor – senaste svar-rutan visar nu relaterade extrasökord

  • När /feed har breddat retrieval med extra relaterade uttryck visar rutan för senaste svar nu dessa ord i en readonly-hjälpruta under svaret.
  • Texten är medvetet användarnära och förklarar att uttrycken användes för att hitta mer relevanta inlägg innan slutsvaret skrevs.

RSS Watch – permalinkhistorik hardad mot patologiska dubblettlänkar

  • /feed/entry/{contentId} scope:ar nu historikuppslag till samma feed (urlid + link) i stället för att scanna på enbart länk.
  • Historikrenderingen på entry-sidan är nu begränsad till de 200 senaste lagrade revisionerna per inläggssida, samtidigt som totalt antal revisioner fortfarande visas.
  • Ett nytt RSS-DB-index har lagts till för permalinkhistorikfrågan så att dubblettunga länkar laddar betydligt snabbare och löper mindre risk att slå i PHP:s max-exekveringstid.

RSS Watch – AJAX-baserad fritextsökning på /feed

  • Lade till en ny ruta Sök inlägg högst upp på /feed.
  • Sökningen körs asynkront och låter användaren stanna kvar på /feed medan matchande feedinlägg hämtas.
  • Resultaten grupperas per kategori och visar genvägar för att öppna inlägget, feeden eller originalkällan.
  • När sökresultat visas döljs den vanliga feed-/kategori-/sajtöversikten tillfälligt så att sidan håller fokus på resultatlistan.

Social Media Tools-tillägget – Chrome Web Store-anpassning (v1.2.12)

  • Behörigheter omstrukturerade: standardbehörigheten host_permissions begränsas nu till Tools API-servrarna (tools.tornevall.net, tools.tornevall.com). <all_urls> har flyttats till optional_host_permissions.
  • Statisk content script-injektion begränsad: scripts injiceras nu bara automatiskt på Facebook, SoundCloud och X / Twitter. Godtyckliga sidor påverkas inte i basläge.
  • Globalt webbläsarövergripande AI-läge tillagt: användare med giltig Tools-token kan aktivera ett nytt alternativ i tilläggets popup: "Enable global browser-wide AI mode". Vid aktivering visas Chromes inbyggda behörighetsdialog för <all_urls>. Om användaren godkänner registreras content scripts på alla webbplatser. Inaktivering tar bort registreringen och den frivilliga behörigheten direkt.
  • Kontextmeny-fallback-injektion: "Open Toolbox" och "Verify fact" i högerklicksmenyn fungerar nu på alla sidor — bakgrunden injicerar scripts tillfälligt via activeTab när användaren klickar på ett menyalternativ på en sida utan befintligt content script.
  • CHROME_WEB_STORE_PRIVACY.md tillagd i tillägets källkatalog som källdokument för Chrome Web Store-inskickning.
  • docs/en/socialgpt-chrome.md tillagd som användardokumentation för tilläggets behörighetsmodell, funktioner och lagringsanvändning.
  • Runtime-fix: löste en panelregression som kunde kasta resetReplyTransientFieldsButKeepContext is not defined i tilläggets loggar efter AI-svar.

Dokumentation - publika integritetspolicysidor for Chrome Web Store

  • Lade till en dedikerad publik integritetspolicysida pa engelska: /docs/en/privacy-policy.
  • Lade till en matchande svensk integritetspolicysida: /docs/sv/privacy-policy.
  • Uppdaterade docs-indexsidorna (/docs/en och /docs/sv) med ett synligt juridikavsnitt och direktlankar till integritetspolicyn.
  • Policyn forklarar nu uttryckligen tokenanvandning for autentisering, anvandarinskickat innehall for AI/faktakontroll, uttalande om fjarrkod samt no-sale/no-advertising-linje for datadelning.
  • Policyn forklarar nu ocksa att anvandare nar som helst kan begara radering/purge av sin lagrade data.

Dokumentation - autodiscover av publika markdown-sidor

  • DocsController autodiscoverar nu publika docs-slugs från språkmappar (docs/en/*.md, docs/sv/*.md) i stället för en manuellt underhållen allowlist.
  • Nya markdown-sidor blir nu routbara/listade utan controller-ändringar.
  • Interna docs spärras nu via front matter (visibility: admin eller access: internal) i stället för en hårdkodad slug-denylist.

Feedfrågor - keyword-first retrieval och tydligare orkestrering

  • Frågeflödet på /feed börjar nu med ett keyword-uttag: OpenAI tar fram kompakta sökord från användarens fråga innan full kontext byggs.
  • Backend smalnar nu först av kandidatrader i rss.content via sökträffar i title/description/content och bygger därefter kontextblock + versionshistorik från relevanta rader.
  • Periodstyrda träfftak är nu mer generösa för kortare fönster (daily/weekly/monthly) och striktare för yearly för att hålla promptstorleken kontrollerad.
  • Feedfrågorna har nu också fått en ny period all_time för analys över hela databasen, så frågor kan söka över hela den lagrade RSS-historiken i stället för att stanna vid innevarande års fönster.
  • Keyword-expansionen är nu mer scope-medveten: planner-föreslagna extrasökord måste hålla sig förankrade i originalfrågan och aktivt kategori-/site-scope, och generiska glidtermer filtreras bort innan SQL-retrieval körs.
  • Användare kan nu välja sökordsbredd per fråga (strict, balanced, expansive), medan admin kan definiera standardläget på /feed och i site-specifika feedfrågor.
  • Orkestreringen för feedfrågor har refaktorerats med tydligare hjälpfunktioner för settings/meta och datablock, vilket förenklar vidare utbyggnad av flerpassfrågor.
  • Keyword-retrieval kör nu stegvis återhämtning (strict fulltext -> relaxed fulltext -> LIKE fallback) och rankad sammanslagning av träffar, vilket förbättrar smala ämnesfrågor som tidigare gav för få träffar.
  • Feedfrågor stöder nu en begränsad och konfigurerbar föranalys-loop före slutsvaret, så OpenAI kan föreslå ytterligare SQL-baserad retrieval i upp till 5 pass som standard innan slutrapporten ändå genereras.

2026-04-02

RSS-editorn (/rss) – URL-mappning i add-form + kategoriväljare

  • Add URL-formuläret sparar nu den först angivna sid-URL:en som real_url och använder den auto-upptäckta feed-URL:en som url.
  • 🤖 Auto fyller nu URL med upptäckt feed-endpoint men behåller den inmatade källsidan i Real URL.
  • Kategorifältet i add-form består nu av:
    • en dropdown med befintliga kategorier, och
    • ett fritextfält för ny kategori.
  • Om fritextfältet är ifyllt prioriteras det över dropdown-valet. Om fritext är tom används dropdown-värdet.

2026-04-01

XPath Lab – pipeline-regeltest och AI-förslag

  • XPath Lab på /rss/xpath-lab stöder nu inklistering och testning av hela det 5-elements pipeline/elements JSON-formatet som används av sitetype=xpath-feeds.
  • Resultatpanelen visar vilken radselector som matchade, hur många rader som extraherades och de extraherade fältvärdena per rad.
  • Om en pipeline angetts men ger 0 rader triggas AI-förslag automatiskt (OpenAI genererar nya regelkandidater från HTML-snippeten).
  • Ask AI-kryssrutan kan också trigga regelgenerering när som helst, även om resultat redan hittats.
  • AI-genererade regler visas med radselectors och output-fältförhandsvisning; en "Fill pipeline field"-knapp kopierar dem tillbaka till pipeline-fältet för omedelbar omtestning.
  • Pipeline-textfältet har nu en placeholder med hela 5-elements-formatet och ett kommenterat exempel.

Feed Q&A – versionshistoriken visar nu fler versioner per artikel

  • VERSION_SAMPLE_LIMIT_BROAD höjdes från 4 till 6 och VERSION_SAMPLE_LIMIT_NARROW från 6 till 12.
  • Effekt: artiklar med upp till 12 versioner (i smalt/site-fokuserat läge) visar nu alla versioner istället för ett urval. AI-analysen kan därmed se hela redigeringshistoriken utan att noteras som trunkerad.
  • För artiklar med fler versioner än gränsen väljs fortfarande representativa urval spridda över hela historikspannet.

Dokumentation – RSS Watch API-referens utökad

  • docs/en/rsswatch.md och docs/sv/rsswatch.md har nu en komplett API-referens med alla /api/rss/*-endpoints, request/response-scheman, autentisering och parameterTabeller.
  • Nytt avsnitt: elements / Pipeline JSON-format med ett komplett kommenterat exempel på XPath-regler i Socialdemokraterna-stil.
  • Nytt avsnitt: Feed Q&A API med request/response-detaljer och focus selector-beteende.
  • Nytt avsnitt: Versionshistorik i context med beskrivning av version_history.articles JSON-strukturen som skickas till OpenAI.
  • XPath Lab-avsnittet har uppdaterats för att beskriva pipeline-testningsflödet.

RSS publik feed – delbara kategorisidor (/feed/c/{categorySlug})

  • Lade till en ny publik kategorisida på /feed/c/{categorySlug}.
  • Sidan visar inlägg från alla synliga feeds i vald kategori och behåller samma versions-/diffvisning som vanliga feedsidor.
  • Kategorianalyskorten på /feed har nu en Share-knapp (bredvid adminåtgärder) som öppnar rätt kategorisida direkt.
  • Kategorisidan visar även en genväg till kategori-API-flödet (/api/rss/feed/{categorySlug}).

Social media tools (Facebook adminstatistik) – rullande 40-dagarsintervall som standard

  • Dashboarden på /admin/social-media-tools/facebook använder nu som standard ett rullande 40-dagarsintervall bakåt till idag.
  • Exempel: om dagens datum är 2026-04-10 blir standard date_from=2026-03-01 och date_to=2026-04-10.
  • Om användaren anger egna datumfilter gäller de fortfarande och ersätter standardintervallet.

2026-03-31

RSS-editorn – nytt visuellt XPath Lab

  • Lade till ett nytt XPath-verktyg nära editorn på /rss/xpath-lab (behörighet: rss) för felsökning och framtagning av XPath-regler från inklistrade HTML-snippets.
  • Sidan visar en visuell DOM-översikt med XPath per nod, nyckelattribut och textpreview för snabbare selektorsökning.
  • Lade till valfri körning av XPath-uttryck på samma sida (xpath_query) med direkt visning av träffar (nodsökväg, tagg, text och snippet).
  • Lade till en SimpleXML-liknande XML-preview så parserträdet kan granskas innan elements-regler skrivs.
  • Lade till snabblänk från /rss till labbet samt hjälplänk i auto-detect-fältet för HTML-kontext.

Feedfrågor – rikare versionsutdrag + navbar-städning

  • Versionsutdrag innehåller nu textunderlag: version_history.articles[*].versions[*] innehåller nu även description och villkorligt content (när content finns), inte bara titelrader.
  • Payloaden hålls fortfarande kompakt: utdragen trimmas och går fortsatt genom kontextbudgeteringen för att undvika för stora AI-requester.
  • Städad toppnavbar: tog bort genvägarna My To Do, Whisper och Whisper Admin från den globala navbaren.
  • Tjänstekatalogen gäller fortsatt: Microsoft To Do och Whisper finns kvar under /services med behörighetsstyrda kort.

Feed admin – konfigurerbar standardsidstorlek för /feed

  • Lade till en ny global feed-admin-inställning för Public /feed default feeds per page.
  • Den publika feedsidan använder nu det sparade värdet när per_page saknas i query-parametrar.
  • Explicit query-override fungerar fortsatt (/feed?per_page=...) och värden klammas fortfarande till säkra gränser.

RSS entry admin – ignorera vid import + hård purge till en rad

  • Lade till entry-baserade adminkontroller på /feed/entry/{contentId} för brusiga inlägg:
    • Ignore this post at import (feed-scope eller globalt), implementerat som blockregel på länk.
    • Allow import again för att ta bort ignorera-regeln.
    • Purge all except one latest row för länken (hård reset).
  • Befintligt cautious-läge för dedup-purge finns kvar och kan nu användas tillsammans med import-ignore för länkar som fortsätter cykla.

Feedfrågor – JSON-kontext, versionshistorik och periodfix

  • Timeout åtgärdad: Versionshistorik-kontext för webbplatsfokuserade frågor cachelagras nu (5 minuters TTL per webbplats), vilket eliminerar 30-sekunders körningstid på /feed/{urlid}-frågepanelen.
  • Månadsperiod korrigerad till rullande 31-dagarsfönster: Månadskontext täcker nu 31 dagar (idag minus 30 dagar) istället för tidigare 30 dagar.
  • Strukturerad JSON-kontext för webbplatsfokuserade frågor: När en fråga riktas mot ≤10 specifika webbplatser levereras AI-kontexten nu som strukturerat JSON med nycklarna feeds, recent_entries, version_history, top_terms och stats.
  • Versionshistorik är periodoberoende: version_history.articles täcker ALL registrerad tid oavsett valt period (dag/vecka/månad/år), så AI:n kan besvara frågor om artikelredigeringar som sträcker sig över valfri tidsperiod.
  • AI-prompten uppdaterad för JSON-kontext: AI:n instrueras explicit att använda version_history.articles för frågor om redigeringar, innehållsändringar, titeländringar och publiceringshistorik.
  • Indexoptimering för RSS-frågekontext: Lade till nya index i RSS-databasen för buildContextSnapshotFresh() och versionshistorik-frågor för att minska latens/timeouts vid filtrerade frågor:
    • content(urlid, pubdate, contentid) för periodfönster + sortering
    • content(urlid, link, content_hash) för gruppering av versionsantal
    • content(urlid, link, pubdate, contentid) för hämtning av versionshistorik
    • urls(deleted, is_hidden, category, title, urlid) (eller urls(deleted, category, title, urlid) om is_hidden saknas)
  • Skydd mot för stora AI-requester: JSON-kontexten för feedfrågor komprimeras nu innan den skickas till OpenAI för att undvika TPM-/inputgränsfel.
  • Versionshistorik samplas i stället för att expandera alla versioner: Varje redigerad artikel behåller total version_count, title_change_count, first_published, last_published och en kompakt samplad versions[]-lista i stället för varje lagrad revision.
  • Kontextbudgetering: Stora filtrerade frågor trimmar först lågprioriterade delar (debug_summary, domäner, vissa källor/termer/feeds/recent entries) och minskar sedan version_history.articles` tills JSON-payloaden ryms inom teckenbudgeten.

2026-03-30

Whisper – behörighetsstyrd transkriberingskö (webb + API + admin)

  • Lade till ett nytt Whisper-verktyg för behöriga användare på /whisper (permission:whisper.use).
  • Lade till adminkonsol på /admin/whisper (permission:whisper.manage) med översikt över alla jobb och run-now-körning.
  • Lade till autentiserade API-endpoints under /api/whisper/*:
    • GET /status
    • GET /jobs
    • POST /jobs
    • GET /jobs/{jobId}
    • POST /run-now (manager/admin)
  • Lade till lagringstabellen whisper_transcriptions med status/progress, retry-metadata, transkriptlagring och ägarkoppling.
  • Lade till schemalagd köbearbetning (whisper:process --limit=1, varje minut) och miljöinställningar (WHISPER_*) för binärsökväg, timeouts, retries och SSL-beteende.

Facebook-moderationsdiagram – starkare stapelfärger

  • Höjde kontrast och fyllnadsstyrka i färgpaletten för moderation/returning-diagrammen.
  • Ökade linje-/kanttjocklek för bättre läsbarhet i mörkt tema och vid skärmdumpar.

Microsoft To Do – användargränssnitt + autentiserat API med tvåvägssynk

  • Lade till en ny personlig Microsoft To Do-integration för inloggade användare på /settings/integrations/microsoft-todo.
  • Användare kan nu koppla sitt Microsoft-konto, visa synkade listor, skapa/redigera/ta bort listor och skapa/redigera/ta bort uppgifter direkt i Tools.
  • Lade till autentiserade API-endpoints under /api/microsoft-todo/* för status, synk, listläsning, uppgiftsläsning och list/uppgiftsändringar.
  • Synken går nu åt båda håll: ändringar i Tools pushas till Microsoft To Do och fjärrändringar från Microsoft To Do pullas tillbaka till Tools.
  • Lade till en lokal spegel för listor/uppgifter samt ett schemalagt synkjobb (microsoft-todo:sync) som körs var 15:e minut.
  • Lade även till dokumentation, OAuth-referens, länkar i tjänstekatalogen och Android-kontraktsnoteringar för den nya endpoint-familjen.

Social Media Tools – SocialGPT-specifik historik i dashboard + separat full historik

  • Panelen AI prompt and response history/admin/social-media-tools/facebook visar nu enbart historikrader från SocialGPT.
  • Filtreringen för SocialGPT använder request-loggmetadata (source=social_media_extension, SocialGPT tool slug och feature_slug=gpt) för både lista och detaljvisning.
  • Lade till en separat adminsida för komplett historik: /admin/social-media-tools/audit/complete.
  • Den kompletta historiksidan stöder filtrering på source, tool slug, feature slug, user, status, modell och request mode.
  • Själva loggskapandet/sparandet är oförändrat: alla request-loggar fortsätter att sparas som tidigare.

RSS – Återställda hjälpfunktioner för inbound-bearbetning och feedgenerering

  • Återställde borttagna interna hjälpfunktioner i RssController som hade orsakat runtime-fel under RSS-inbound-konvertering.
  • Fixade krascher i /api/rss/update som uppstod eftersom canQuery() och handleWordPressRestApi() saknades.
  • Återställde även den relaterade kedjan för innehållsdeduplicering, importregel-filtrering, JSON/XML-konvertering och feedgenerering som RSS-flödet använder.
  • Det återställer också controllersidans hjälparflöde för /api/rss/feed/* och analytics-selektorer efter att metodblocket råkat tas bort.

2026-03-29

Publikt flöde – Buggfixar för språkväxlaren

  • Fixade saknade översättningar i Ställ en fråga-panelen för alla språk när man byter språk i flödet.
  • JS-formulärhanteraren använder nu aktivt språk för alla statustexter, knapptext (Frågar…), återrenderade svarsrubriker (Senaste svar, F:, S:), success-text och felmeddelanden – i stället för att alltid visa engelska.
  • Lade till fem nya översättningsnyckelord för alla språk (en, sv, da, no, fi):
    • ask_error_required – visas när frågefältet är tomt.
    • ask_error_captcha – visas när captcha inte är ifylld.
    • ask_success_answered – visas efter att ett svar tagits emot.
    • ask_error_generic – visas vid nätverks-/serverfel.
  • Fixade saknad ask_asking-fras i norskan (no).
  • Webbplatsspecifika analytikperiodrubriker (Daglig, Veckovis osv.) och Läs mer / Visa mindre-knappar svarar nu på språkväxlaren.
  • Lade till site_analytics_title-fras (rubrik för webbplatsspecifik AI-analys) för alla språk.

nginx – TLS-härdning

  • Uppdaterade TLS-konfigurationen i nginx/tools.tornevall.net.conf för att ta bort föråldrade TLSv1 och TLSv1.1.

  • Accepterar nu enbart TLSv1.2 och TLSv1.3.

  • Uppdaterade cipher suite till modern ECDHE/CHACHA20/AES-GCM-uppsättning och satte ssl_prefer_server_ciphers off.

  • Uppdaterade URL-urvalet för scraper så att always=0 nu är agent-specifikt i stället för globalt styrt av urls.lastscrape.

  • Varje scraper-agent (agent_id) får nu per-URL-spårning: när agenten senast såg en URL och när den får hämta den nästa gång.

  • Intervallkontrollen för always=0 använder nu URL:ens readinterval tillsammans med agentens egna seen-state.

  • always=1 returnerar nu alla RSS-URL:er som inte är borttagna/markerade med noscrape (ingen intervallfiltrering).

  • Lade till backend-tabellen rs_agent_url_seen (RSS-DB) för schemaläggning per agent och URL.

Facebook-statistik – Åtgärdstypsfilter för diagram

  • Lade till ett Visade åtgärdstyper-multival i filterrutan för Facebook-moderationsdiagrammen.
  • Välj en eller flera utfallstyper (Approved, Rejected, Removed, Edited, Added, Blocked, Revoked, Observed) för att begränsa diagrammen till just dessa händelsekategorier.
  • Tom markering visar alla typer (befintligt standardbeteende behålls).
  • Filtret påverkar alla tre diagrammen (moderationsaktivitet, utfallsfördelning, återkommande kunder).
  • Aktiva utfallsfilter visas i filterstatustexten (t.ex. "Types: Approved, Rejected").
  • Utfallstypsval bevaras i delade diagram-URL:er.
  • Fixade dashboardflödet så val av åtgärdstyper + Apply filters / Show charts stannar i AJAX-flödet (ingen hel sidomladdning).
  • Fixade persistens för valda åtgärdstyper så multivallistan inte töms efter uppdatering/diagramrendering.

Publiceringsguider för pre-text (docs/pre-facebook.md, docs/pre-wordpress.md)

  • Förtydligade den interna styrningen för pre-texter per publiceringsyta och sajt.
  • pre-facebook kräver nu uttryckligen kort, enkel och styckebaserad text under rätt rubrik i ## The Content.
  • pre-wordpress beskriver nu avsedd ton och målgrupp för generic, www.tornevalls.se, developer.tornevall.net och www.tornevall.net.
  • AGENTS.md pekar nu också ut rätt rubriker och förklarar att Facebook-pretext ska hållas lätt och enkel medan WordPress-pretext får vara längre när det passar.

Publik Feedreader – Språkväljare (/feed)

  • Lade till en webbläsarstyrd språkväljare i rubrikkortet Tornevall Networks Feedreader på den publika /feed-sidan.
  • Stödda språk: Engelska (EN), Svenska (SV), Danska (DA), Norska (NO), Finska (FI).
  • Språk identifieras automatiskt från webbläsarens navigator.languages-inställning vid första besöket och sparas sedan i localStorage.
  • Flagg+kod-knappar i rubrikkortet låter besökare byta språk när som helst utan sidomladdning.
  • Alla viktiga UI-fraser översätts dynamiskt: sidtitel, underrubrik, Ask-AI-panelen (etiketter, platshållare, knappar), kolumnrubriker, kategoriknapparna, analysavsnittet, senaste-frågor-kortet och läs-mer-funktionerna.
  • Inbyggda standardfraser finns i config/feed_phrases.php (redigerbara direkt i koden).
  • Administratörer kan åsidosätta enskilda fraser per språk utan driftsättning via den nya Phraseeditor i Feed Admin (/rss-admin → 🌐 Public feed phrase editor).

RSS inbound-köstädning (/api/rss/update)

  • Uppdaterade inbound-underhållet så rader med handled=1 nu rensas bort så fort de är upplåsta (processlock=0) vid update-körningar.
  • Tog bort tidigare retention på ett dygn för hanterade inbound-rader för att hålla inbound-tabellen lättare vid kontinuerlig feedtrafik.
  • Förtydligade låssäkert beteende: aktiva/låsta rader (processlock=1) rensas inte.
  • Lade till en konfigurerbar tidsgräns för att släppa fastnade inbound-lås (processlock=1) i RSS-admin (/feed-admin, alias /rss-admin) via inställningsnyckeln feed_admin.inbound.processlock_release_minutes.
  • Standardvärdet är nu 30 minuter (begränsat till 5..720 minuter) och används för både hanterade och ohanterade fastnade inbound-lås.
  • Frisläppning av fastnade lås utgår nu från lås-ålder (när raden faktiskt låstes) i stället för enbart radens registreringstid, vilket minskar risken att äldre men aktivt bearbetade rader låses upp för tidigt.
  • Låsflödet rensar nu lås-tidsstämpel konsekvent när rader markeras hanterade/upplåsta inför städning.

Publik Feedreader – kategorikort på /feed

  • Den publika feedlistan är nu omstrukturerad till tydligare kort per kategori så varje kategori blir visuellt avgränsad och enklare att skanna.
  • Behöll befintligt beteende för expand/collapse av kategorier samt interaktiva funktioner (prenumerationer, variantval för analyser, read-more och AJAX-flöden).
  • Samma feedrader och analysdata visas som tidigare, men med tydligare hierarki och bättre läsbarhet i gränssnittet.
  • Kategorisektioner är nu imploderade som standard och använder accordion-beteende (öppnar du en kategori imploderas övriga) för en renare vy.
  • Kategorikort öppnas/stängs nu via klick på rubrikraden eller pilen (även tangentbordsstöd), i stället för separat Show details-knapp.
  • Knappar i kategorirubriken har fått en enhetlig storlek/stil för jämnare layout.

Feedfrågor – standardmodell och resonemang (/feed)

  • Standardmodell för feedfrågor är nu gpt-5.4.
  • Feedfrågor skickar nu reasoning_effort=medium för modeller som stödjer resonemang (gpt-5*, o1*, o3*, o4*).
  • Höjde maxnivån för output-tokens i feedfrågesvar för bättre stöd vid mer resonemangsintensiva svar.

RSS update-trigger – valfritt urlid-filter (/api/rss/update)

  • Lade till valbar query-parameter urlidGET /api/rss/update för riktad hantering av inbound-rader för ett specifikt feed-id.
  • När urlid inte anges kör inbound-konverteringen nu en rättvis round-robin-ordning per urlid, så en problematisk feed inte lika lätt blockerar övriga i samma körning.
  • Svaret innehåller nu urlid_filter för tydlighet när riktad körning används.

2026-03-28

RSS-editorn – förbättrad auto-detect, AI-fallback och Blogspot-stöd

  • WordPress-prioritering: "🤖 Auto"-knappen i /rss-editorn testar nu WordPress REST API (/wp-json/wp/v2/posts?per_page=100) först av alla metoder. Om sidan svarar med giltiga WP-JSON-poster sätts real_url till REST-API-adressen med ?per_page=100 (ger fler poster än RSS-feeden) och sitetype till wp. Faller igenom till vanlig RSS-detektering om wp-json är avstängt.
  • <link rel="alternate">-extraktion från HTML: Om WordPress REST API inte finns, hämtas sidans HTML och alla <link rel="alternate" type="application/rss+xml|atom+xml">-taggar parsas för att hitta den kanoniska feed-URL:en som webbplatsen deklarerar.
  • Blogspot/Blogger-detektering: Webbplatser på *.blogspot.* flaggas nu i auto-detect-svaret och en varning visas i editorns statusrad om att Blogspot RSS är minimal och att full HTML-scrape kan tillkomma i framtiden.
  • OpenAI AI-fallback: Om alla strukturella metoder misslyckas anropas OpenAI (gpt-4o-mini via konfigurerad OpenAI-leverantör) med en avskalad ögonblicksbild av sidans innehåll och AI:n ombeds föreslå en feed-URL. Resultatet visas med tydlig "🤖 AI-föreslagen URL – verifiera"-märkning. Hoppas tyst om OpenAI inte är konfigurerat.
  • Bloggers standard-Atom-feed (/feeds/posts/default) tillagd i listan med vanliga feed-URL-mönster.
  • Statusraden berikad: Auto-detect-statusen skiljer nu på AI-föreslagen, Blogspot, helautomatisk och fallback-utgång med färgkodade meddelanden och ett valfritt detaljtips.

Tabell för extrainnehåll i RSS-databasen (extra_content)

  • Ny tabell extra_content i RSS-databasen (migration 2026_03_28_100000_create_rss_extra_content_table).
  • Syfte: lagra extra skrapad data för feeds med minimalt RSS-utfall (t.ex. Blogspot) – HTML-ögonblicksbilder (html_blob) och skärmdumpsreferenser (filepath).
  • Kolumner: urlid, contentid, link, content_hash, scrape_type, filepath, html_blob, scraped_at.
  • Ingen skraper skriver till tabellen ännu; schemat är förberett för framtida extra-scrape-flöden.

Feedfrågor: period och fokus (/feed)

  • Lade till en valbar Question period per fråga på /feed (daily, weekly, monthly, yearly) så varje fråga kan styra tidsfönstret utan att globala admininställningar ändras.
  • Uppdaterade kontextbyggnaden för feedfrågor så att bredare perioder använder ett större kontextunderlag.
  • Lade till daglig cache-återanvändning för årlig kontext (yearly) för att minska tunga upprepade kontextbyggen under samma dygn.
  • Uppdaterade publika listan Focus sites (optional) så att hidden feeds inte visas i valen.
  • Uppdaterade standardbeteendet så att om inga fokusval görs kan frågekontexten läsa alla icke-borttagna feeds (inklusive hidden) för bredare analys, samtidigt som länkar/nycklar till hidden feeds fortsatt inte exponeras i kontexttexten.

RSS-scraper och ingestdiagnostik (/api/rss/data)

  • Uppdaterade scraperns körloggar så att de visar feedtitel tillsammans med urlid och URL under batchkörning.
  • Uppdaterade svaret från POST /api/rss/data så att varje post i received nu även innehåller feedens title (urls.title).
  • Förbättrade diagnostik för RSS/Atom-konvertering med tydlig sammanfattningslogg per inbound-rad (candidates, converted och skip-räknare) för enklare felsökning när 0 poster importeras.
  • Lade till fallback för länkextraktion i Atom/RSS samt normalisering av Google Alerts-redirectlänkar (https://www.google.com/url?...) så mållänken bevaras bättre vid import.

2026-03-27

Min profil (självservice för kontoinställningar)

  • Lade till en ny inloggningsskyddad sida My Profile/users/profile där användare kan uppdatera sitt eget namn och e-post.
  • Lade till valfri hantering av lösenord (sätta/byta) på samma sida; nuvarande lösenord krävs vid känsliga ändringar när lösenord redan finns.
  • Flyttade koppling/avkoppling av Google-konto från Mina API-nycklar till My Profile så att inloggningsinställningar finns samlat.
  • Lade till en ny My Profile-länk i navbaren för inloggade användare.
  • Justerade navbarens spacing/wrapping så att den nya länken får plats utan overflow på mindre bredder.

Stabilitetsfixar (RSS + MCU-sidor)

  • Fixade location-visning på adminsidans /online så att spårade request-URI:er nu matchas mer robust mot aktiva sessioner. Skrivning till page visits tål nu delvis migrerade valfria kolumner bättre, och matchningen har säkrare fallback för user/session/user-agent.
  • /online är nu åter publik som en enkel översiktssida utan IP-adresser eller interna request-URI/location-detaljer. Den detaljerade location-vyn ligger kvar på den skyddade admin-routen.
  • Tog bort avvecklade kontroller för protected/useProtected i RSS-editorns tabell på /rss så att synlighetshantering nu fokuserar på is_hidden och public_hash.
  • Ändrade åtkomstbeteendet för RSS-admin så att användare utan RSS-adminbehörighet skickas vidare till /feed när de besöker /rss, /feed-admin eller /rss-maintenance-admin, istället för inloggning/403-sidor.
  • Lade till migrationen 2026_03_27_230000_drop_protected_columns_from_rss_urls.php för att avveckla urls.protected och urls.useProtected i RSS-databasschemat.
  • Uppdaterade inline-fältet is_hidden i RSS-editorn på /rss från fritextfält till checkbox, där AJAX-spar nu skickar explicita 1/0-värden.
  • RSS Analytics Scheduler i /admin/jobs är nu redigerbar (enabled + run_at per period) och har en manuell knapp för "Run Scheduler Check Now".
  • Lade till strikt scheduler-fönsterkontroll i rss:generate-analytics: direkta cron-körningar respekterar nu periodernas enabled + run_at, skippar före tidslot och skippar redan körd periodnyckel; manuell override finns via --ignore-scheduler-window.
  • Uppdaterade /mcu-webbrouten så den nu skickar vidare till den controller-drivna MCU-editorrouten (mcu.index) istället för att rendera editorn utan nödvändiga view-data (vilket gav odefinierade variabler som $perPage).

Google OAuth-inloggning / registrering

  • Användare kan nu logga in eller registrera sig med sitt Google-konto direkt från inloggnings- och registreringssidorna.
  • Nya användare som registrerar sig via Google är automatiskt e-postverifierade; inget verifieringsmejl skickas.
  • Kontolänkning / synk: om du loggar in med Google och din e-postadress redan finns i systemet kopplas Google-kontot automatiskt till ditt befintliga konto vid första Google-inloggningen.
  • Redan inloggade användare kan koppla sitt Google-konto från sidan Mina API-nycklar (/keys/mine) → avsnittet "Google Account".
  • Länkade konton kan logga in med antingen Google eller e-post/lösenord.
  • Avlänkning sker från samma sida; kräver att ett lösenord är satt.
  • En enda redirect-URI (/auth/google/callback) hanterar både inloggning och länkningsflödet.
  • Konfiguration: lägg till GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET och GOOGLE_REDIRECT_URI i .env (se .env.example).

Besöksstatistik – exkludering av RSS-scrapern

  • API Requests Trend-grafen och den totala API-räknaren på /admin/visit-stats exkluderar nu RSS-scraper/cron-anrop som standard.
  • Exkluderade sökvägar: /api/rss/data, /api/rss/urls, /api/rss/update, /api/rss/feed/analytics-*, /api/rss/analytics/run.
  • En växlingsknapp ("🤖 Scrapers: excluded / included") visas intill datumväljaren för att byta läge.
  • Grafens rubrik och sammanfattningskortet speglar aktuellt filterläge.

MCU Timeline – info- och supportlänkar

  • Lade till länk "More info & live API" till tools.tornevall.net och "GitHub / Support" till https://github.com/Tornevall/mcu-timeline-api högst upp på MCU Timeline-editorsidan.

DNS Editor / DNS API cache-prestanda

  • Byggde om DNS-zoncachen från en serialiserad bulkblob per zon till radvis cachelagring (dns_zone_cache_records) för snabbare paginerad läsning även för mycket stora AXFR-zoner.
  • Lade till extra IP-index-tabell (dns_zone_cache_ip_extras) som fylls med både vanliga A/AAAA-IP och rättvända IP från reverse-owner (DNSBL/OPM), som grund för CIDR-sökningar/rensningar.
  • Ändrade mutationsflödet för POST /api/dns/records/add|delete|update|bulk så att cachen synkas radvis efter bekräftad lyckad uppdatering mot master DNS, istället för att hela zoncachen rensas.
  • Lade till zonvisa invalidate-inställningar i dns_zone_settings:
    • cache_invalidate_enabled (default false)
    • cache_invalidate_interval_seconds (default 259200, dvs var tredje dag när aktiverad)
    • last_invalidated_at
  • Lade till schemalagt kommando dns:cache:invalidate (timvis scheduler-hook) som endast invaliderar zoner där policyn är aktiverad och due.
  • Zoninställningarna i DNS-admin visar nu invalidate-policy per zon (enabled + intervall), och editorns manuella Clear cache-åtgärd är avstängd tills policyn uttryckligen aktiveras för zonen.

2026-03-26

Tidsstyrning för RSS Analytics-scheduler

  • Skärpte den inbyggda analytics-schedulern så att en period endast körs på sin konfigurerade tid eller så snart som möjligt efter den tiden om körningen missats.
  • First-run körs inte längre direkt på godtyckliga klockslag utan väntar tills periodens konfigurerade körslot faktiskt är due.
  • Lade till ett statiskt scheduler-kort på /admin/jobs som visar periodvis analytics-konfiguration (enabled, run_at) och senaste scheduler-status (last_run_at, status, key/reason), så att driftläget syns direkt utan att man behöver gå till Feed Admin först.
  • Uppdaterade tornevall-tools-cron så att php artisan schedule:run körs varje minut, vilket gör att analytics-schedulerns konfigurerade tider faktiskt efterlevs.

Publik landningssida (/)

  • Utökade den inloggade "Your available tools"-ytan med betydligt fler behörighetsstyrda genvägar (RSS, DNS, jobb/admin, säkerhet, meddelanden, integrationer och användarverktyg).

Onlinesessioner (/online adminvy)

  • Adminvyn för online-sessioner visar nu besökarens senast spårade location (request URI) när den finns tillgänglig.
  • Lade till en kort backtrack-lista med de senaste sökvägarna så att admin kan se var besökaren nyss har rört sig i systemet.
  • Besöksspårningen sparar nu autentiserad user_id konsekvent och kan även spara Laravel-session_id för mer träffsäker koppling mellan session och location.

2026-03-25

Feed User Questions (/feed + /feed/user-questions)

  • Fix för gäst-captcha: Fixade gästinlämningar på /feed så att frågeformuläret nu återanvänder den delade globala Turnstile-nyckeln när den äldre feed-specifika provider-nyckeln saknas. Sidan blockerar nu också submit tills en captcha-token finns och visar ett tydligare tillfälligt otillgängligt-meddelande i stället för att misslyckas tyst när captcha-nycklar inte är korrekt konfigurerade.
  • Fokus-väljare per fråga: När man ställer en fråga på /feed kan användaren nu valfritt fokusera AI:ns analys på specifika kategorier eller webbplatser med två nya flervalslistrutor:
    • Fokus på kategorier (valfritt): Välj en eller flera kategorier för att begränsa kontextutdraget (hjälper till att deprioritera mindre intressanta feeds som allmänna nyheter).
    • Fokus på webbplatser (valfritt): Välj en eller flera feeds för att fokusera på specifika källor.
    • Om båda lämnas tomma används alla synliga feeds (standardbeteende). Om båda är valda använder AI antingen match ("eller"-logik).
    • Dessa val åsidosätter de globala admin-inställningarna för just den enskilda frågan och sparas i fråghistoriken för granskning/uppspelning.
  • Skärpt fokussemanik för frågor: När focus_site_ids[] väljs för en fråga på /feed prioriteras webbplatsurvalet över kategorifilter för just den frågan. Detta håller query/context strikt kopplat till vald sajt och minskar onödigt stor prompt.

RSS Analytics CLI / Scheduler

  • --force tvingar nu faktiskt overwrite: php artisan rss:generate-analytics hoppar nu över oförändrade bucket+variant-signaturer som standard och återanvänder den cachade raden i stället för att lägga extra AI-anrop på identiska snapshots.
  • Lade till --overwrite-current som tydligare alias till --force när operatören uttryckligen vill köra om och skriva över den aktuella bucketraden.
  • Admin-konfigurerbar schedulerstyrning: /feed-admin innehåller nu per-periodkontroller (daily/weekly/monthly/yearly) med aktivera/inaktivera och körtidsfält. Ett minutbaserat schedulerkommando (rss:run-scheduled-analytics) hanterar nu due/catch-up från cron.
  • Robust catch-up + first-run-beteende: Om en period saknar tidigare timestamp (aldrig körd) körs den direkt en gång. Om en konfigurerad körningstid missats körs den så snart som möjligt efteråt.
  • Automatisk körningsidentitet + overwrite-semantik: Scheduler-triggade körningar använder en dedikerad auto-varianttitel ([AUTO] Scheduled analytics) och skriver alltid över den aktuella automatiska bucket-varianten på plats.
  • Tidsstämplad analytics-logg: rss:generate-analytics prefixar nu utdata med datum/tid, vilket gör rss-analytics.log tydligare för revision per generering.

Publik landningssida / Tjänster (/ och /services)

  • Förenade upptäcktsvyerna så att både / och /services nu renderar samma landningsvy.
  • Tog bort den separata inloggade "admin-kortväggen" från landningssidan för att hålla startsidan fokuserad på publika tjänster.
  • Behåller nu en enda underhållen kortlayout för publika tjänster istället för dubla vyer.
  • Förenklade navbar-länkar för Home/Services till vanliga rutlänkar (ingen startsides-specifik JavaScript-gren).

2026-03-24

Mensövervakning (/menstrual-tracking)

  • Lade till ett nytt verktyg for inloggade anvandare for mens- och cykelovervakning med enkelt webbgranssnitt.
  • Anvandaren kan spara profilens basdata (birth_date, first_period_started_on) och registrera cykelstarter med exakt datum eller pa manadsniva.
  • Verktyget visar nu en enkel cykeloversikt: genomsnittlig cykellangd, senaste start, uppskattad nasta start och aktuell cykeldag.
  • Lade till paginerad historik med mojlighet att ta bort enskilda cykelrader.
  • Lade till upptackbarhet via /, /services, dashboard-kort och navbar.
  • Lade till EN/SV anvandardokumentation: /docs/en/menstrual-tracking och /docs/sv/menstrual-tracking.

Cron / Runtime-stabilitet

  • Lade till valbar runtime-flagga PHP_SUPPRESS_DEPRECATIONS i bootstrap for att tysta brusiga PHP-deprecation-notiser (E_DEPRECATED, E_USER_DEPRECATED) pa PHP 8.4+ vid korning av aldre vendor-stack.
  • Lade till dokumentation for flaggan i .env.example.
  • Lade till felsokningsavsnitt i docs/cron.md for deprecation-varningar i cron-output.

RSS scraper-URL-claiming (GET /api/rss/urls)

  • Hardade samtidig scraper-claiming for att minska SQLSTATE[40001] deadlocks vid uppdatering av urls.lastscrape.
  • getUrls() claimar nu rader i en och samma transaktion med lockForUpdate() och uppdaterar lastscrape/lastrequestfrom i samma transaktion.
  • Lade till starkare deadlock-retry for denna kodvag (5 forsok) for battre robusthet vid scraper-toppar.

2026-03-23

RSS-prenumerationer (/feed/subscriptions) — Striktare dubblettfiltrering

  • Förhindrar återleverans av cyklande versioner: Prenumerationsnotifieraren spårar nu varje content_hash som någonsin levererats för varje länk inom en prenumeration. Om en ny importrad har samma hash som en tidigare rapporterad version av den länken (även om den fått ett nytt contentid p.g.a. cyklande innehåll — A→B→A) hoppas den tyst över och rapporteras inte igen. Detta förhindrar notifikationsspam från feeds som upprepat publicerar mindre eller nästan identiska variationer.

RSS-import — Global versionsdubblettfiltrering

  • Cycle-safe global hashkontroll i importen: Importens dubblettskydd (canQuery) kontrollerar nu även om den nya postens content_hash eller meaningful_hash redan existerar i någon tidigare rad för den länken — inte bara den senaste raden. Det täpper till A→B→A-cykelhålet där version A infogades igen i content-tabellen trots att den redan fanns i äldre historik. Både content_hash och meaningful_hash kontrolleras globalt via indexerade EXISTS-frågor, vilket förhindrar okontrollerad versionstillväxt från feeds med cyklande eller nästan identiskt innehåll.

Disney / BAMGRID-scraper (projects/scraper/ondisney.php)

  • original_url-fallback sätts alltid: Disney-sitemapURLer har alltid ett lokaltprefix (t.ex. en-be, nl-nl). Scrapern satte tidigare bara original_url i det sällsynta fallet att en URL saknade lokaltprefix, vilket innebar att de flesta poster aldrig fick original_url inställt och tyst förkastades av importmotorn. Nu faller scrapern tillbaka på en föredragen engelsk lokal (en-usen-gben-ca → första en-* → första tillgängliga) och sätter alltid original_url (och original_title om det saknas) på varje post. Befintlig elements-JSON i databasen för site 8 är oförändrad; fixen ligger i scraperoutputen.

Utveckling & Dokumentation

  • RSS elements-format fullt dokumenterat: Lade till en komplett referens i de interna BAMGRID-anteckningarna (docs/en/bamgrid-sitemap-extraction-notes.md, docs/sv/bamgrid-sitemap-extraction-notes.md) som förklarar båda elements-JSON-formaten:
    • Format A (begin/table): JSON-traversering — begin navigerar från roten till postlistan; table mappar content-kolumner till källnycklar (sträng = direktnyckel, array = nästlad traversering).
    • Format B (XPath-pipeline): 4-elements array — rad-selector-XPath, per-fält delselectorer, värdetyplista, transformtabell. Används för rå HTML/XML-feeds.
    • Inkluderar korrekt elements-DB-JSON för Disney/BAMGRID site 8 med fältmappningstabell och förklaring av varför alla lokaler måste beaktas.

RSS Underhållsadmin (/rss-maintenance-admin)

  • "Markera som försiktig"-flagga: Varje misstänkt länkrad har nu en ⚠ Markera som försiktig-knapp. Att markera en länk skapar en permanent flagga (rss_cautious_links) och gör att framtida importerade inlägg för den länken automatiskt körs igenom dedup/rensningspasset efter varje ny infogning — bara distinkta meningsfulla versioner behålls.
  • Ta bort försiktig-flagga: En ✓ Unmark cautious-knapp visas på redan flaggade rader för att ta bort flaggan.
  • Visuell indikator: Försiktiga rader markeras i tabellen och visar ett märke bredvid länken.
  • AJAX-först i adminvyn: Filteruppdatering, dry-run purge, purge now, mark cautious och unmark cautious körs nu asynkront i /rss-maintenance-admin (med fallback till vanliga formulärpostningar om JavaScript saknas).
  • Fix för mark-cautious-bugg: POST /rss-maintenance-admin/mark-cautious hanterar nu uteblivet reason säkert (ingen mer Undefined array key "reason" när fältet inte skickas).

RSS-inläggsvy (/feed/entry/{contentId})

  • Adminåtgärder: Administratörer (användare med permission:rss) ser nu ett Admin actions-block längst ner på varje inläggspermalänkssida med:
    • ⚠ Markera som försiktig — flagga inläggets länk så att framtida importer automatiskt rensar brus-dubbletter.
    • ✓ Ta bort en försiktig-flagga — ta bort en befintlig försiktig-flagga.
    • 🗑 Rensa brus-dubbletter — rensa redundanta versioner av just det här inlägget direkt, och behåll den nyaste raden per distinkt meningsfull hash. Inget mer manuellt MySQL-arbete.

RSS-prenumerationer (/feed/subscriptions)

  • Fixat: spara med alla kanaler avbockade fungerar nu — tidigare orsakade det ett valideringsfel att bocka av alla kanaler (E-post, Slack, Discord) och formuläret kunde inte sparas. Nu tillåts att spara med noll kanaler och inaktiverar all notifiering för den prenumerationen.
  • Autosave för kanaler (AJAX-first) — kanal-checkboxar sparas nu direkt, webhook-/textfält sparas på blur, och kanalchips/status uppdateras inline utan att man behöver manuellt "Save channel settings" varje gång.
  • Tom kanallista sparas korrekt — explicit channels_json=[] ligger kvar som "alla kanaler avstängda" i stället för att UI återgår till Email (mail).

Feed Admin (/feed-admin)

  • Kolumnsynlighet för publikt flöde flyttad till feed-admin: Inställningen "Public column visibility" finns nu under /feed-admin i stället för att vara inbakad på den publika /feed-sidan. All RSS-konfiguration för admins samlas nu på ett och samma ställe. Kolumnlayouten på publika flödessidan fungerar precis som tidigare.
  • Segmentspecifika ankardatum i genereringskorten: Kategori- och site-kort för generering har nu valfria ankardatum per segment. Prioritet vid körning är nu segment anchor -> global anchor -> dagens datum, så historiska körningar blir tydliga per kort.

RSS-redigeraren (/rss)

  • XPath-only visning av elements: Den stora elements-editorn visas nu bara för rader där sitetype är xpath, vilket minskar tabellens bredd för vanliga RSS/WP-rader.
  • Kollapsbar elements-editor: XPath-regler redigeras nu i en expanderbar/kollapsbar panel per rad så huvudlistan blir mer kompakt.
  • elements sparas på blur (AJAX): Ändringar i elements-textarea sparas nu när fältet tappar fokus; övriga inline-fält fortsätter spara direkt via AJAX vid ändring.

RSS Feed Analytics

  • Ankardatum-kalender för generering: Kategori-/site-generering i /feed-admin har nu ett fält för Anchor date. Admin kan generera daily/weekly/monthly/yearly för äldre perioder (t.ex. förra veckan) om ett cronjobb missats.
  • Uppdaterad genereringspayload (webb-UI): Feed-admin skickar nu valfritt anchor_date (YYYY-MM-DD) för att rikta historiska period-buckets vid create/replace av cachade analysvarianter.
  • Schemalagd körning justerad till 20:00 dagligen: app/Console/Kernel.php schemalägger nu rss:generate-analytics --period=daily en gång per dag klockan 20:00. Weekly/monthly/yearly finns kvar för manuell CLI/API-körning.
  • Tydliggjort overwrite-beteende: Om samma variant körs igen i samma period-bucket uppdateras/skrivs samma rad över (ingen extra dubblett för samma variant+bucket).
  • Fixad replace-UI för alla perioder: /feed-admin visar nu cachade daily-varianter tillsammans med weekly/monthly/yearly, och regenerate/replace uppdaterar sidan efter sparning så överskrivna kategori-/sitevarianter syns direkt.

Utveckling & Dokumentation

  • BAMGRID sitemap-uttag (internt): Lade till intern dokumentation i docs/en/bamgrid-sitemap-extraction-notes.md och docs/sv/bamgrid-sitemap-extraction-notes.md med verifierad Disney-sitemapstruktur, namespace-säkra XPath-kandidater (url/loc/lastmod/xhtml:link), uppmätt språk-täckning (en-*-only skulle tappa ~37.1% av unika ID:n), samt rekommenderad väg mot en dedikerad bamgrid-importtyp med canonicaliserad output per content-id.
  • Hårdare xpath/json-regler i RSS-redigeraren: /rss visar nu explicit xpath/json i Add URL-flödet, stödjer inline-redigering av elements-JSON när kolumnen finns, validerar elements server-side och kräver elements när sitetype=xpath.

Publik feed-UX

  • AJAX-submit för feedfrågor: Kortet Ask about all open feeds/feed skickar nu frågor inline med JSON-svar och visar status/svar direkt på sidan (ingen full omladdning). Fallback utan JavaScript finns kvar.
  • Uppgraderad frågekontext + profil-fallback: Feed-Q&A bygger nu promptunderlag med analyslik sammanställning från lagrat rss.content för alla icke-dolda feeds (kategorier, källor, domäner, termer, exempelposter). Lade även till fallback för promptprofil så saknad profil inte längre stoppar körningen med "No prompt profile configured".
  • Konfigurerbart scope för feedfrågor: Admin kan nu begränsa frågeunderlaget på /feed via period, tillåtna kategorier, tillåtna site-id:n, context-cap för antal poster, max antal meningar i svaret och storlek på mini-historiken. Själva /feed-kortet visar också senaste färdiga frågor inline.
  • Paginering på frågehistorik: /feed/user-questions har nu praktisk paginering med valbart antal rader per sida för att hantera stora/spammiga historiklistor.
  • AJAX-delete av frågerader (admin): Admin kan nu ta bort frågerader inline på /feed/user-questions via AJAX (DELETE /feed/user-questions/{question}), med fortsatt redirect-fallback utan JavaScript.
  • Inställningar för svarmodell + tonalitet: Feed-frågornas admininställningar innehåller nu val av svarsmodell och tonalitet (finns både på /feed/user-questions och i motsvarande block på /feed-admin), och dessa används vid OpenAI-svarsgenerering.
  • Adminfilter på frågehistorik: /feed/user-questions kan nu filtrera på status, user_id (eller guest), ip och deleted-scope (active/deleted/all) för snabbare moderering av brusig historik.
  • Bulk-delete med valbar mode: Admin kan nu ta bort markerade frågerader i bulk (POST /feed/user-questions/bulk-delete) och välja hard (permanent) eller soft delete.
  • Soft-delete-lagring för frågor: feed_user_questions lagrar nu modereringsmetadata för soft-deletade rader (deleted_at, deleted_by_user_id, deleted_reason) samtidigt som hard delete finns kvar för irreversibel städning.
  • Restore/undo för soft-deletade frågor: Admin kan nu återställa soft-deletade rader från /feed/user-questions (POST /feed/user-questions/{question}/restore), inklusive AJAX-restore inline i historikvyn.

Feed-användarfrågor (/feed mini-kort + /feed/user-questions)

  • "Läs mer"-knapp för långa svar: De senaste frågorna på /feed-sidan visar nu en förkortat förhandsvisning (280 tecken) av varje svar. Om ett svar är längre visas en läs mer / läs mindre-knapp som gör att du kan expandera inuti sidan utan att navigera.
  • Anpassad AI-svartom (valfritt): Inställningssidan för matfrågor tillåter nu att ton lämnas tomt (inte längre obligatoriskt). En tom ton faller tillbaka till standardneutrala instruktionen när frågorna besvaras. Administratörer kan fortfarande välja: Neutral, Analytisk, Kort, Vänlig eller Kritisk från rullemenyn.
  • Fler AI-modeller tillgängliga: Svarmodellväljarenär nu en rullmeny i stället för ett fritextfält, med alternativ:
    • gpt-4o-mini (standard, snabb)
    • gpt-4o (general purpose)
    • o1-mini (resonemang)
    • o1 (avancerat resonemang)
    • o3-mini (utökat resonemang)
    • Resonemangsmodeller (o1/o3) faller automatiskt tillbaka till gpt-4o-mini om modellen inte är tillgänglig eller misslyckas, för att säkerställa en graciös återställning utan användarfel.

Utveckling & Dokumentation

  • AGENTS.md: Förtydligade kritiska sessionsriktlinjer för AI-agenter som arbetar på kodbasen
    • Betona att AGENTS.md måste läsas vid början av VARJE session, inte bara en gång per workspace-initialisering
    • Lade till explicita WSL-sökväg-handlingsregler: Windows-sökvägar (K:\Apps\...) är förbjudna i terminalkommandon; måste använda WSL-sökvägar (/mnt/k/Apps/...)
    • Förstärkte terminal-sessionsrenningskrav: alla terminalkommandokörningar måste avslutas med exit för att korrekt stänga WSL-sessioner och förhindra tillståndsläckage

2026-03-19

RSS Feed Analytics

  • Lade till rikare RSS-kategorianalyser i /feed, /rss och /feed-admin
  • Feed-admin kan nu autogenerera saknade instruktioner/beskrivning för kategori från aktuellt flödesinnehåll via AJAX (English-first)
  • Tittelhanteringen i feed-admin är nu dynamisk: föreslagen analystitel byggs från aktuella instruktioner/beskrivning i realtid när titel saknas
  • Långa publika analyser kan nu expanderas med Read more / Show less
  • Analytics-kort är visuellt separerade per period
  • Markdown i analyser renderas som läsbar HTML
  • Vecko-, månads- och årsanalyser stöds
  • Manuell återgenerering uppdaterar nu samma periodpost i stället för att skapa dubletter
  • Lade till valfri analyst guidance före generering (watch_for)
  • Lade till kategorispecifikt fokus som kan kombineras med globalt fokus
  • Lade till stöd för namngivna analysvarianter med olika språk, ton och syfte
  • Publika /feed kan visa olika sparade analysvarianter via titel-/språkval
  • Analyssektionerna i publika /feed är stängda som standard och expanderas per kategori
  • RSS-admin kan nu radera cachade kategori-analyser direkt på /feed via AJAX
  • Analys-prompten innehåller nu exempel-länkar och tydligare aktivitetssignaler
  • Lade till ett andra analysverktyg för site-nivå (per skribent/nyhetssajt)

Feedvisning

  • Publika /feed sorteras nu i kategoriordning
  • First Discovery och Last Discovery visas för feeds
  • Legacy-filter för protected feeds är avvecklat; feeds behandlas nu som publika som standard
  • Scraper Agent Activity exkluderar nu gamla agenter från total/lista och kan rensa gamla rader
  • Agent-alias kan hanteras av admin via AJAX och visas publikt med alias fallback till name

Dokumentation

  • Standardiserade publika dokumentationsslugs mellan engelska och svenska
  • Lade till saknade publika sidor för paritet mellan docs/en och docs/sv
  • Fokuserade dokumentationen på API-användning och UI-flöden i stället för interna implementeringsdetaljer
  • Uppdaterade changeloggen till aktuell release

2026-03-16

Social Media Tools

  • Förbättrade extension-inställningar för snabbare autosave och renare setup
  • Förfinade SoundCloud-flöden och release notes-kontinuitet

2026-03-02

IRC Log Rollback

  • Fixade åtkomsthanteringen för rollback-funktioner så att behöriga användare kommer in korrekt
  • Förbättrade felmeddelanden kring rollback-flöden

2026-03-01

IRC Log Management

  • Lade till rollback-stöd för importmisstag
  • Förbättrade importgranskning och formatval
  • Gjorde rollback-flöden tydligare och säkrare för administratörer

2026-02-13

DNS API och åtkomst

  • Lade till DNS-zondiscovery och verktyg för zonvisning
  • Förbättrade API-nyckelautentisering och åtkomstkontroll
  • Lade till IP-baserad allowlist för utvalda endpoints
  • Utökade adminverktyg för nyckelhantering och DNS-åtkomst

OpenAI och plattforms-UX

  • Förbättrade OpenAI-testning och modellval i admin-UI:t
  • Gjorde dashboard och services tydligare så verktyg är lättare att hitta
  • Lade till registreringsspårning och mer flexibel lokal SSL-hantering för utvecklingsmiljöer

2026-02-11

Säkerhet och administration

  • Lade till Turnstile CAPTCHA i autentiseringsflöden
  • Förbättrade adminvarningar och hantering av access bans
  • Förbättrade skärmar för användarhantering och API-nycklar
  • Fortsatta förbättringar i OpenAI-admin-UI:t

2026-02-10

Dashboard och editors

  • Förbättrade dashboard/service-navigering och generell admin-konsistens
  • Utökade MCU-editorflöden och editor-användbarhet
  • Förbättrade mörkt läge och formulärläsbarhet
  • Förfinade RSS-listning och generell navigering

2026-02-09

Behörigheter och dokumentation

  • Införde behörighetsbaserad åtkomstkontroll i skyddade verktyg
  • Standardiserade navigation och layout över plattformen
  • Lade till markdown-baserad dokumentation med stöd för engelska och svenska

2026-02-08

RSS Watch

  • Utökade den publika RSS-feedvisaren
  • Lade till historikmedveten feedvisning och upptäckte redigerade inlägg
  • Förbättrade feedbläddring, utgående länkar och flexibel API-utmatning

Tidigare grundarbete

Tidigare releaser etablerade plattformens grund för:

  • RSS-aggregering och feedleverans
  • MCU timeline-visning
  • autentisering, sessioner och åtkomstkontroll
  • stöd för flera databaskopplingar mellan tjänster
  • markdown-dokumentation och publicerade API-guider

Underhålls av: Tornevall Networks
Senast uppdaterad: 2026-04-18