Tools API - Ändringslogg
Den här ändringsloggen sammanfattar användarsynliga förbättringar i Tools-plattformen.
2026-04-01
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 på
/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
urlid på GET /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 på
/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-us → en-gb → en-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 ⚠ Mark cautious-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 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-sakra XPath-kandidater (url/loc/lastmod/xhtml:link), uppmatt sprak-tackning (en-*-only skulle tappa ~37.1% av unika ID:n), samt rekommenderad vag 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 på
/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-03-22