Development Timeline

Istoricul dezvoltării

Funcționalitățile și îmbunătățirile adăugate, în ordine cronologică inversă.

28 May 2026, 13:31 LATEST
optimizare Lighthouse Performance 34 → 56 (+22 puncte)
  • Bootstrap mutat din CDN jsdelivr în bundle Vite local (landing.css +
  • Tawk.to lazy load: scriptul se injectează la prima interacțiune sau
  • GTM lazy load: dataLayer inițializat sincron, gtm.js injectat la
  • Query caching pe /pricing (earlyAdoptersCount, 5min) și /surse
  • CachePublicPages middleware adăugat (alias cache.public) pentru
28 May 2026, 11:34
autorizare Google Tag Manager în Content-Security-Policy
28 May 2026, 11:02
Early Adopter program + Resend email + Meilisearch backup
  • Migrare: coloane is_early_adopter + early_adopter_activated_at pe users
  • Cupon EARLY35 creat în Stripe test mode (35% off, repeating 6 luni, max 100)
  • Banner "X/100 locuri rămase" pe /pricing (DB counter)
  • HandleInvoicePaymentSucceeded: detectare cupon EARLY35 → marcare user + email
  • Mail EarlyAdopterWelcome + view emails/early-adopter-welcome
  • Badge 🔥 Early Adopter în /account
  • Înlocuit sendmail cu Resend (resend/resend-laravel ^1.4)
  • MAIL_MAILER=resend + RESEND_API_KEY în .env
  • Script /usr/local/bin/meilisearch-backup.sh (dump zilnic 03:00, retenție 30 zile)
  • Folder /backup/meilisearch/ creat
27 May 2026, 22:10
footer complet in welcome (site-footer shared cu app layout)
  • Inlocuit lp-footer simplu (3 coloane) cu @include('layouts._footer')
  • Adaugat CSS site-footer inline in style block (welcome nu incarca app.css Vite)
  • Adaugat Bootstrap Icons CDN (necesar pentru iconitele din footer)
27 May 2026, 19:57
badge [tradus automat] + titlu original pentru articole traduse
  • Adaugă `isAutoTranslated()` în Article model (title_ro != null AND language != ro)
  • Corectează condiția badge-ului din article-table: era `language != ro` (includea și articole netraduse); acum folosește `isAutoTranslated()`
  • Badge-ul afișează „tradus automat" în loc de „EN → RO"
  • Sub titlul tradus apare titlul original în gri deschis (reducere expunere opere derivate)
  • Badge adăugat și în investigations/show pentru lista de surse
27 May 2026, 18:40
DOCS_final/ - toate documentele curate, coerente, la zi
  • Strip complet al artefactelor <!-- MERGE --> din toate fisierele
  • Preturi canonice unificate: Individual 15EUR / Pro 35EUR / Business 80EUR
  • Nume planuri unificate (eliminat Personal/Analyst/Agency/Corporate)
  • README.md rescris cu index complet si referinte la noile nume de fisiere
  • future_plans.md: Auto-fix marcat ca IMPLEMENTAT (AutoAgent + SelfHeal)
  • Redenumit: price_policy_merged -> price_policy, user_stories_merged -> user_stories, todo_merged -> todo
  • 12 documente, zero duplicate, zero contradictii de pret
27 May 2026, 18:29
dosar_juridic.md - combinat dosar_juridic_merged + analysis (RSS legal)
  • Structura template-ului dosar_juridic_merged pastrata
  • Adaugat Art. 85^1 (drepturi conexe editori presa) din analysis
  • Adaugat jurisprudenta CJUE (GS Media, Spiegel Online)
  • Adaugat pozitia practica a editorilor romani (Ringier, Digi24, etc.)
  • Adaugat analiza per sursa cu nivel de risc (tabel complet RO + international)
  • Adaugat evaluarea elementelor afisate (imagini, traducere, titlu)
  • Adaugat riscuri specifice (imagini RSS, traducere automata, Ringier, BBC)
  • Eliminate artefactele MERGE, duplicate si sectiunile in engleza
  • Solicitari avocat extinse cu 4 intrebari noi derivate din analysis
27 May 2026, 17:58
compare view in /docs pentru fisiere pereche (-from-root)
  • Sidebar afiseaza numarul de linii si marcheaza perechile detectate automat
  • Buton Compare aparent cand fisierul activ are un -from-root corespondent
  • /docs/compare?a=&b= cu diff side-by-side (LCS), context +-3 linii
  • Daca fisierele sunt identice: mesaj + buton stergere directa a duplicatului
  • Daca sunt diferite: linii sterse (rosu) si adaugate (verde) evidentiate
27 May 2026, 17:40
pagina /docs cu viewer markdown pentru documentele interne DOCS/
  • Aside cu lista tuturor fisierelor .md din DOCS/ (sortate dupa data modificarii)
  • Randare markdown cu league/commonmark (tabele, task lists, autolinks)
  • Buton stergere cu confirmare modal + DELETE JSON endpoint
  • Acces restrictionat admin only, neinclus in meniu
27 May 2026, 17:21
redenumit Alerte → Cyber Security, Piețe → Financiar în sidebar
27 May 2026, 17:20
eliminat toate etichetele sidebar-section-label (10 total)
27 May 2026, 16:03
sitemap footer complet pe ambele layout-uri + pagina /steps roadmap
  • Footer cu 5 coloane: brand, platformă, funcționalități, cont (auth-aware), legal & suport
  • Partial _footer.blade.php partajat între layouts/guest și layouts/app
  • CSS responsive (5 col → 3 col → 2 col pe mobile)
  • Linkuri cont afișate diferit pentru guest vs autentificat
  • Pagina publică /steps — roadmap lansare 6 luni cu checklist interactiv (localStorage)
27 May 2026, 15:45
pagina /beta context-aware — open beta anunț sau waiting list după beta_closed
27 May 2026, 15:41
beta waitlist complet — pagină aplicație, admin panel, aprobare cu email automat
  • Pagină publică /beta cu formular (prenume, nume, email, telefon, profesie) + Turnstile
  • Tabel beta_waitlist + model BetaWaitlist cu scopuri pending/approved/rejected
  • Admin panel /admin/beta-waitlist cu tab-uri status, statistici, buton Aprobă/Respinge
  • La aprobare: generează cod BetaInvite, trimite email automat cu codul (BetaInviteApproved)
  • Modal confirmare la respingere cu notițe interne
  • Badge roșu în sidebar admin când există cereri în așteptare
  • Register page: banner „Closed Beta" cu link spre /beta când beta_closed=true
  • Turnstile adăugat și pe /feedback (FeedbackController + view)
27 May 2026, 12:28
formular feedback nativ pentru beta testeri (/feedback)
  • Tabel beta_feedbacks: NPS (0-10), rating stele (1-5), 4 câmpuri text
  • FeedbackController: protecție dublă trimitere, afișare răspunsuri existente
  • View /feedback: butoane NPS colorate (roșu/galben/verde), stele JS,
  • Admin /admin/beta-feedbacks: stats cards NPS score (-100/+100),
  • Email beta-feedback: buton mailto înlocuit cu link direct la /feedback
  • Sidebar: link "Feedback Beta" vizibil doar pentru beta testeri
27 May 2026, 12:19
stats azi / total în header-ul paginilor de articole
27 May 2026, 10:29
Beta Testers system — closed beta invite-only complet
  • Migrare beta_invite_code pe users + tabel beta_invites (code, email_invited,
  • Model BetaInvite: scope unused(), markAsUsed(), generateCode() 8 chars uppercase
  • Middleware BetaClosedMiddleware: blochează /register dacă beta_closed=true în settings
  • RegisterController: consumă invite la signup, aplică BETA100-30Z via session,
  • SubscriptionController: aplică session('beta_coupon') la checkout cu withCoupon(),
  • Admin /admin/beta-invites: generare coduri, tabel status, toggle beta_closed,
  • Mailuri: BetaWelcome (activare), BetaFeedback (ziua 14), BetaEnding (ziua 30)
  • Command beta:emails schedulat zilnic 09:15
  • Badge "Beta Tester" în sidebar și /account
  • Cupoane Stripe BETA50 (50% off, 12 luni) + BETA100-30Z (100% off, once)
27 May 2026, 10:27
sistem complet Beta Testers (Tier 1, primii 100 useri)
  • Migrări: beta_invite_code + beta_feedback/ending_sent_at pe users, tabel beta_invites (code unique 8ch, email_invited, used_at, used_by, created_by)
  • Model BetaInvite cu scope unused(), markAsUsed(), generateCode()
  • Middleware BetaClosedMiddleware: blochează POST /register dacă beta_closed=true și codul lipsește/invalid
  • RegisterController actualizat: consumă invite-ul beta, marchează codul ca folosit, salvează BETA100-30Z în sesiune, trimite BetaWelcome mail
  • Admin panel /admin/beta-invites: listă coduri, generare cod nou (cu email opțional), counter X/100, buton copy link, buton șterge (nefolosite), toggle beta_closed
  • Stripe coupons create: BETA100-30Z (100% off, once) + BETA50 (50% off, 12 luni) în test mode
  • 3 mailuri: BetaWelcome (la înregistrare), BetaFeedback (ziua 14), BetaEnding (ziua 30 cu cupon BETA50)
  • Command beta:emails cu --dry-run, schedulat zilnic la 09:15
  • Badge Beta Tester în sidebar + /account (lângă rol și lângă tipul planului)
  • Link Beta Invites în dropdown admin din navbar
  • User model: isBetaTester(), fillable + casts actualizate
27 May 2026, 09:35
infrastructură video Playwright + sursă RSS ANSPDCP
  • 22 spec files Playwright (V01–V22) organizate pe grupuri (Guest, Demo, Trial, Pro, Business, Transversal)
  • 22 fișiere narațiune română pentru TTS (edge-tts ro-RO-AlinaNeural)
  • Script generate-all-videos.sh cu filtre grup
  • Helpers: credentials.ts, cursor-highlight.js (cursor DOM vizibil în video)
  • Pagina /tutoriale cu galerie filtrată pe plan, suport YouTube embed + MP4 local
  • CSP fix: media-src 'self' adăugat în SecurityHeaders.php
  • playwright.config.ts: slowMo 600ms, viewport 1280×720, cursor highlighter
  • package.json: scripturi npm video:V* și videos:* per grup
  • Sursă RSS ANSPDCP adăugată în DB (categoria legal, credibility 5/5, interval 60min)
26 May 2026, 22:46
Google OAuth (Socialite) + Playwright demo video infrastructure
  • Instaleaza laravel/socialite; adauga SocialiteController cu redirect + callback
  • Migrare: google_id (unique nullable) si avatar_url pe users
  • Cont nou via Google: email_verified_at setat automat, parola aleatorie
  • Cont existent cu acelasi email: google_id asociat automat
  • Buton 'Continua cu Google' in login.blade.php si register.blade.php
  • 7 teste Pest (US-G-01...G-05) toate trec; chei dummy in .env de inlocuit
  • User stories Google OAuth (US-G-01...G-07) adaugate in user_stories_osint.md
  • Playwright + chromium: playwright.config.ts cu video recording 1280x720
  • Teste V1/V2/V3/V8 + scripturi de naratiune in romana (edge-tts Alina)
  • Script generate-demo-videos.sh: record Playwright + TTS + ffmpeg combine
  • GDPR anonimizare bifata in todo (17/17 Pest trec)
26 May 2026, 14:47
AutoAgent ticketing + rute legale fixate + UI contrast îmbunătățit
  • Model AutoAgentTicket + migrare autoagent_tickets
  • SelfHeal rescris complet: deschide/închide tickete per tip de problemă,
  • Email la deschidere și la rezolvare cu timp de răspuns
  • Pagină admin /admin/autoagent cu stats, filtre, tabel, modal rezolvare manuală
  • Link AutoAgent în sidebar cu badge roșu (număr tickete open)
  • Mutate din routes/web.php în AppServiceProvider::boot() la URL-uri
  • Actualizate toate link-urile din views cu route() helpers
  • AccountController: try-catch în jurul asStripeSubscription() pentru
  • response_seconds: max(0, (int) diffInSeconds(..., true)) — fix overflow
  • Trial expiry banner: redesign cu contrast corect light/dark,
  • GdprAccountTest: Art.15 (5 teste) + Art.17 (8 teste) — toate trec
  • PublicPagesTest: URL-uri actualizate la noile rute legale
26 May 2026, 10:20
GDPR Art.15/17 + self-healing automat
  • AccountController: myData() (Art.15 — vizualizare date în browser),
  • /account: card "Datele mele" + card "Zona de pericol" cu modal confirmare parolă
  • /account/my-data: pagină completă cu profil, keywords, surse, abonament, consimțăminte
  • SelfHeal command: verifică la 15min permisiuni, cache, log, disk, queue;
  • Fix: surse query url → rss_url (QueryException 500)
  • Fix: rută duplicată cookie.policy → legal.cookies
  • Pagina 500: mesaj "în curs de rezolvare automată"
26 May 2026, 02:07
modul GDPR complet + consimțământ la înregistrare + linkuri legale footer
  • Instalat pachetul blackbit/gdpr (^1.12) cu toate migrările aplicate
  • Adăugat checkboxuri GDPR în formularul de înregistrare:
  • checkbox obligatoriu: acceptare Termeni + Politică Confidențialitate
  • checkbox opțional separat: consimțământ newsletter/marketing
  • RegisterController salvează consimțăm ântul în `gdpr_consents` (tip + IP + user agent + timestamp)
  • Footer landing page și guest layout completat cu linkuri obligatorii:
  • Model GdprConsent adăugat în app/Models/
  • Publicate controllere, modele și view-uri GDPR din pachet (legal docs, cookie management, gdpr requests)
  • Rute admin: /dashboard/settings/legal-docs, /cookies, /gdpr-requests, /gdpr-widget
  • Rute publice: /legal, /terms, /privacy, /cookie-policy, /gdpr/info, /gdpr/delete-request
25 May 2026, 10:55
support tickets pentru guest-uri + redesign pagină suport
  • Migrare: user_id nullable pe tickets/messages, adăugat guest_name/email/token
  • Controller: flux dual guest/auth, rate limit 3 tichete/zi/IP cu RateLimiter,
  • Rute: support/create și support/store mutate în afara auth middleware;
  • Model SupportTicket: helper-e displayName(), displayEmail(), isGuest()
  • Admin views: afișează guest name/email + badge "guest" în inbox și thread
  • View create: redesign complet pentru guest (dark theme, grid 2 coloane,
  • Footer links: adăugat Suport în welcome.blade.php, pricing și layouts/landing
  • Guest layout: footer minimal cu Suport, Contact, Politică securitate
  • CSS: .dropdown-item padding 7px 14px
23 May 2026, 16:46
gate enforcement per plan + auto-sync campanii sezoniere
  • SoundSettingsController + RobotSettingsController: gate settings-sounds/settings-robots cu abort_unless (demo blocat)
  • PlanAbilitiesController: DEFAULTS completat cu toate cele 22 abilities (investigation-export/ai/share/upload/create, keyword-email-alerts, settings-sounds/robots, justitie-search); LIMITS extins cu investigation-create(demo:1) + justitie-search(demo:3) + keyword-alerts demo corectat la 2
  • Pro plan: wordpress-publish + custom-publish setate pe 0 în DEFAULTS (conform user_stories — doar Agency)
  • plan-abilities.blade.php: câmp limit_value adăugat pentru investigation-create și justitie-search
  • campaigns:sync: command nou care activează/închide automat campaniile sezoniere după dată (draft→active / active→ended), scheduler zilnic 00:05
  • todo.md: adăugat secțiunea override temporar de capabilități per user
23 May 2026, 14:36
restricții demo + modal upgrade pentru features locked
23 May 2026, 13:45
mecanism raportare conținut ilegal (DSA — Reg. UE 2022/2065)
23 May 2026, 12:10
integrare Portal Justiție — căutare dosare și ședințe
  • JustitieService: CautareDosare, CautareDosare2, CautareSedinte, HelloWorld
  • 246 instanțe grupate (Curți de Apel, Tribunale, Judecătorii) din WSDL
  • JustitieController cu validare, timeout 15s, gestionare erori conexiune
  • View tabbed cu accordion de rezultate (dosare, părți, ședințe, căi de atac)
  • Rute sub auth+verified+demo.active, secțiune Legal în sidebar
23 May 2026, 11:50
demo autologin + navbar rute publice pe welcome (admin only)
23 May 2026, 11:19
restructurare completă pricing — 5 planuri în EUR
23 May 2026, 08:05
identificare user autentificat în Tawk.to chat + fix CSP font-src
23 May 2026, 07:20
Tawk.to live chat widget integrat
23 May 2026, 07:19
sistem ticketing suport cu atașamente și guard per user
  • Formular creare protejat cu Cloudflare Turnstile
  • Mesaje sanitizate: strip_tags + html_entity_decode + whitespace norm
  • Atașamente: jpg, jpeg, png, webp, heic, heif (iPhone) — NO gif
  • MIME verification dubla: extensie + finfo server-side
  • Guard atașamente: /support/attachments/{userId}/{filename}
  • Cale stocare: storage/app/private/support/{user_id}/
23 May 2026, 06:56
navigatie admin completata — sidebar + dropdown
23 May 2026, 06:54
rapoarte admin in navbar dropdown
  • Raport Landing Pages (/admin/reports/landing-pages)
  • Log WordPress (/admin/wordpress-logs)
23 May 2026, 06:46
landing pages verticale + funnel tracking
  • Tabel landing_page_views (page, event, ip_hash, referrer, user_agent)
  • LandingPageController: logheaza view la fiecare vizita + CTA click
  • Admin report la /admin/reports/landing-pages: stats per pagina
23 May 2026, 06:26
hero /pentru-jurnalisti redesign — typewriter SVG + chip AI
  • Stanga: SVG masina de scris cu taste animate (key press highlight
  • Centru: titlu + subtitlu + CTA (text ramas identic)
  • Dreapta: SVG chip AI cu 12 trasee de circuit animate (flow data
23 May 2026, 06:18
landing page /pentru-jurnalisti
  • Hero split: stanga typewriter animat (5 comenzi ciclice cu
  • Stats bar: 80+ surse, 15 min refresh, <10s alert, 100% date RO
  • Sectiune comparativ "Cum faci acum vs Cu OSINT Romania" (5 puncte)
  • Features grid: alerte keyword, workbench, breaking news, export WP
  • Workflow 4 pasi cu timeline vizual si timpi estimati
  • Quote section + CTA cu trial 14 zile
  • Design: dark, Inter + JetBrains Mono, gradiente purple/cyan,
  • Standalone HTML (fara layouts.app), consistent cu /about si /security-policy
23 May 2026, 06:02
workflow editorial review investigatii (Business team)
  • Migrare: review_status, submitted_for_review_at, reviewer_note,
  • Flux complet: membru trimite la editor → email notificare →
  • InvestigationController: submitForReview, reviewDecision,
  • Index: sectiune "De revazut" cu badge counter pentru editori
  • Show: buton "Trimite la editor" pentru membri, banner
  • Mail: ReviewSubmittedMail (to owner) + ReviewDecisionMail (to member)
  • Gate: submitForReview validat ca user e team member acceptat
23 May 2026, 05:47
audit log WordPress + pagini /about echipa + /security-policy
  • Audit log publicări WordPress: tabel wordpress_publish_logs, logging
  • /about: secțiune echipă adăugată (Cătălin Negru, Fondator & Developer)
  • /security-policy: pagină publică nouă — domeniu de aplicare, ce
  • Notă: /security era deja ocupat de news feed; pagina de disclosure e la
23 May 2026, 05:26
delivery log webhooks + Investigations API docs Scribe
  • /account/webhooks: buton clock-history per endpoint, rând expandabil
  • WebhookController: eager load deliveries limitat la 10 în loc de 1
  • InvestigationApiController: docblocks Scribe complete (@group, @authenticated,
  • Scribe regenerat: grup "Investigations API" apare în /docs
  • todo.md: Investigation Workbench bifat complet (era desincronizat față de cod)
22 May 2026, 23:37
Laravel AI SDK + InvestigationAssistant agent
  • Instalat laravel/ai v0.7.0 cu provider Anthropic (Claude Haiku 4.5)
  • Agent InvestigationAssistant cu structured output: draft, seo_title,
  • Tool FetchInvestigationSources — citește sursele din DB fără prompt manual
  • InvestigationAiController cu ownership check + JSON responses
  • Modal "Generează cu AI" în workbench cu spinner, badge entități/tags,
  • Actualizate OSINT_ROMANIA.md, README.md, cost_analysis.md cu
22 May 2026, 22:59
pricing page actualizată să reflecte features reale
  • Corect: 5 keywords (nu 20), Investigation Workbench, factură fiscală
  • Fără: export CSV, webhook, API
  • Corect: 20 keywords, export CSV, Investigation Workbench complet
  • NOU: Webhook custom, publish WordPress
  • Fără: API access, multi-seat
  • Corect: keywords nelimitate, API access, multi-seat 5 useri, priority support
  • Factură B2B SmartBill
  • Buton Stripe checkout (nu mai e mailto)
  • Toggle anual include acum și form-biz
22 May 2026, 22:47
Custom Publish — Webhook outbound + API pull investigations
  • WebhookEndpoint::isSafeUrl(): HTTPS only, anti-SSRF (no private IPs,
  • Payload signed HMAC-SHA256 (X-OSINT-Signature header)
  • Delivery log in webhook_deliveries table
  • Gate custom-publish: Pro + Business only
  • /account/webhooks: configurare endpoint URL + method + headers custom
  • POST /investigations/{id}/dispatch-webhook: trimite payload JSON semnat
  • Modal webhook în workbench cu feedback HTTP status
  • Dropdown „Publică": WordPress / Webhook custom / note HMAC
  • GET /api/v1/investigations: lista investigațiilor cu metadate
  • GET /api/v1/investigations/{id}: conținut complet + surse + credibility
  • GET /api/v1/investigations/{id}/sources: doar sursele
  • Disclaimer copyright în fiecare răspuns
22 May 2026, 22:16
pagina /surse publică + disclaimer securitate WordPress
  • /surse: pagină publică standalone cu toate sursele active
  • Disclaimer WordPress /account/wordpress:
  • Todo: secțiune Trust & Credibilitate adăugată
22 May 2026, 21:50
publish direct pe WordPress din investigation workbench
  • Model WordpressConnection cu App Password criptat (Laravel Crypt)
  • WordpressController: store, test, destroy, getCategories, publish
  • Pagină /account/wordpress: adaugă/testează/șterge conexiuni WP
  • Buton „Publică" în workbench → modal:
  • Selectare site WP (dacă ai mai multe)
  • Status: Draft sau Publicat imediat
  • Categorii WordPress (încărcate dinamic via REST API)
  • Conținut TinyMCE + surse investigate adăugate automat la final
  • Link direct la post după publicare
  • Link „WordPress" în dropdown navbar cont
22 May 2026, 21:47
duplicate detection în investigation workbench
  • La 10s după fiecare auto-save, caută în Meilisearch articole similare
  • Exclude automat articolele deja adăugate ca surse în investigație
  • Panel galben cu lista de articole similare + link direct + sursă + dată
  • Mesaj contextual: „adaugă ca sursă dacă e intentionat, altfel verifică originalitatea"
  • Silențios la erori (nu întrerupe fluxul de scris)
  • Backend: POST /investigations/{id}/check-duplicates cu text plain
22 May 2026, 21:46
source credibility score — rating 1-5 per sursă
  • Migrare: credibility_score (1-5) pe tabela sources
  • Default-uri inteligente: Reuters/BBC/Agerpres=5, Digi24/G4Media/BleepingComputer=4, etc.
  • Admin form surse: radio buttons 1-5 cu labels vizuale
  • Index surse: coloana Credibilitate cu dots ●●●○○ color-coded
  • Workbench: dots de credibilitate lângă fiecare sursă din investigație
  • Preview panel: dots + label (Verificat/Standard/Verifică)
  • Meilisearch: credibility_score indexat în toSearchableArray
  • addArticle response: include credibility_score + summary
22 May 2026, 21:43
templates articol în TinyMCE — 4 structuri pre-definite
  • 🔍 Articol de investigație: context, fapte, cronologie, impact, concluzie
  • ⚡ Breaking News: lead, ce s-a întâmplat, context, actualizări
  • 📊 Analiză: intro, date, pro/contra, comparație, prognoză
  • 🎙️ Interviu: intro persoană, format Q&A, notă editorială
22 May 2026, 21:42
timeline cronologică surse în investigation workbench
  • Buton „Timeline" în header-ul listei de surse
  • Click → sortează articolele cronologic (cel mai vechi primul)
  • Separatori de dată între articole din zile diferite (violet, cu icon calendar)
  • Click din nou → revine la ordinea originală de adăugare
  • data-timestamp + data-position pe fiecare source item
22 May 2026, 21:40
reading time estimate — workbench + preview public
  • Workbench: „⏱ ~X min" lângă word count, calculat din totalWords / 200 wpm
  • Preview public /i/{token}: timp citire + cuvinte + surse în header articol
22 May 2026, 21:36
fetch interval per sursă configurat din admin
  • Migrare: fetch_interval_minutes + is_breaking pe tabela sources
  • Default-uri inteligente per categorie:
  • FetchFeeds: skip surse care nu au ajuns la intervalul lor
  • Form surse: select interval + toggle is_breaking
  • Index surse: coloana Interval cu badge breaking
22 May 2026, 21:11
Investigation Workbench v2 — raport plagiat, note, share, Word export, image upload
  • Raport plagiat în timp real: original% / citat% cu badge color-coded
  • Word count target cu progress (cuvinte originale vs țintă setată)
  • Note private per sursă — salvate auto la blur, afișate în lista de surse
  • Mark as cited — checkmark verde automat la insert citat/selecție
  • Share investigație — generează link public /i/{token}, copiază în clipboard
  • Export Word (.docx) via PhpWord — titlu, conținut, surse cu link-uri
  • Image upload în TinyMCE — stocate în storage/public/investigations/{id}/images/
  • Pagină publică /i/{token} — read-only pentru investigații finalizate
  • Keyboard shortcut Alt+Q = Inserează selecția
  • data-note în source items pentru persistență notă în panel preview
22 May 2026, 20:32
Investigation Workbench — editor TinyMCE + search + export + 7 surse RSS noi
  • Migrare: tabele investigations + investigation_articles
  • Modele: Investigation, InvestigationArticle + relații
  • InvestigationController: CRUD + add/remove/reorder articole + export PDF/JSON
  • View /investigations: listă cards cu status, articole count, creare rapidă
  • View /investigations/{id}: workbench complet
  • Export PDF via dompdf (template cu surse citate), JSON cu conținut TinyMCE
  • Link „Investigații" în sidebar secțiunea Intelligence
  • config/services.php: tinymce.api_key din .env
  • 7 surse RSS noi: The Hacker News, BleepingComputer, ZDNet, Economica.net,
22 May 2026, 18:47
campanii sezoniere — helper active(), overlay dashboard, Paște dinamic + 30 cupoane Stripe
  • OrthodoxEaster::date() — algoritm Meeus/Jones/Butcher, calcul corect verificat 2026-2031
  • SeasonalPage::active() — detectare campanie activă azi din DB (cache 1h),
  • x-seasonal-overlay — banner festiv pe dashboard cu gradient tematic, dismiss sessionStorage,
  • 30 cupoane + promotion codes create în Stripe test mode via API (price_policy.md complet)
  • Paginator::useBootstrapFive() — paginare Bootstrap 5 globală (fix Tailwind)
  • Todo: toate itemii sezonieri bifați
22 May 2026, 18:35
campanii sezoniere — admin calendar + 30 campanii + 6 pagini custom
  • Tabel campaigns în DB cu migrare + seeder (30 campanii din price_policy.md)
  • Admin /admin/campaigns/calendar — cards pe luni, preview modal iframe
  • 6 pagini sezoniere cu design dedicat (CSS animații pure):
  • Template generic cu temă vizuală specifică pentru celelalte 24 campanii
  • Rută publică /sezon/{slug} pentru toate paginile sezoniere
  • SeasonalController cu map slug → view/temă
  • CampaignController: CRUD + toggle status + calendar view
  • Navbar admin: link Campanii → calendar
22 May 2026, 18:01
facturi utilizator + multi-seat Business + SmartBill PDF stocat local
  • SmartBill: PDF descărcat după emitere și stocat în storage/app/private/invoices/
  • /account/invoices: tabel Bootstrap responsive cu buton PDF inline (tab nou)
  • Multi-seat Business: tabel team_members, TeamMember model, TeamController
  • Navbar: linkuri „Facturile mele" și „Echipa mea" (vizibil doar @can multi-seat)
  • Todo actualizat: multi-seat bifat complet, strategie demo marcată optional
22 May 2026, 15:23
barryvdh/laravel-dompdf instalat + dosar juridic OSINT România
  • barryvdh/laravel-dompdf v3.1 instalat via Composer
  • dosar_juridic.md — analiză juridică completă în română:
  • dosar_juridic.pdf generat (1.9MB, A4)
22 May 2026, 14:54
Export CSV articole (Pro/Business) + Export date personale (GDPR)
  • Exportează articolele din filtrul curent (source, category, search, date)
  • Max 5.000 rânduri, CSV cu BOM UTF-8 (Excel-compatibil)
  • Buton verde în header pagina /articles; pentru planuri fără acces →
  • Exportează datele personale: profil, keywords, setări alerte, abonament
  • Format JSON pretty-print, filename cu data curentă
  • Card dedicat în /account înainte de secțiunea parolă (GDPR Art. 20)
22 May 2026, 14:23
SmartBill API — toate cele 20 endpoint-uri acoperite
  • restoreInvoice() — PUT /invoice/restore
  • softCancelEstimate() — PUT /estimate/cancel
  • restoreEstimate() — PUT /estimate/restore
  • getEstimateInvoiceStatus() — GET /estimate/invoices
  • cancelChitanta() — DELETE /payment/chitanta (endpoint corect)
  • cancelPaymentV2() — DELETE /payment/v2 (OP/Card/alte tipuri)
  • getPaymentText() — GET /payment/text (bon fiscal)
  • sendDocument() — POST /document/send (email factură/proformă)
22 May 2026, 14:11
Meilisearch search-as-you-type — instalare completă
  • Meilisearch v1.44.0 instalat pe server, serviciu systemd activ
  • Bound pe 127.0.0.1:7700 (inaccesibil extern), master key configurat
  • API keys separate: admin (Scout) + search (read-only frontend)
  • 41.934 articole indexate cu toSearchableArray()
  • laravel/scout + meilisearch/meilisearch-php instalate
  • SCOUT_DRIVER=meilisearch în .env
  • Article model: Searchable trait + toSearchableArray() + meilisearchSettings()
  • SecurityApiController: LIKE → Scout search cu filtre Meilisearch
  • Rută /api/search/instant (auth, throttle 30/min) pentru frontend
  • Dropdown sugestii sub câmpul de search din topbar
  • Search-as-you-type cu debounce 250ms, max 8 rezultate
  • Fiecare sugestie: titlu + sursă colorată per categorie + dată
  • Icon spinner în timpul fetch-ului
22 May 2026, 12:52
SmartBill API complet — toate metodele relevante implementate
  • cancel() — DELETE /invoice (anulare, la refund Stripe)
  • reverse() — GET /invoice/reverse (storno complet)
  • markAsPaid() — PUT /invoice/paymentstatus (marcare ca încasată)
  • getInvoice() — GET /invoice (detalii factură)
  • issueReceipt() — POST /receipt (emitere chitanță)
  • downloadReceiptPdf() — GET /receipt/pdf
  • cancelReceipt() — DELETE /receipt
  • getSeries() — GET /invoice/series (listare serii disponibile)
  • ping() — test conectivitate + autentificare
  • http() — helper comun withBasicAuth + timeout + acceptJson
  • HandleInvoicePaymentSucceeded: după issue() reușit → markAsPaid('Card')
  • HandleChargeRefunded (nou): la charge.refunded Stripe → reverse() (storno complet)
  • Coloane cancelled_at + storno_number pe smartbill_invoices
  • SmartBillInvoice model actualizat cu noile câmpuri
22 May 2026, 12:42
Demo Account — implementare completă
  • Coloane is_demo (boolean) + demo_expires_at (timestamp) pe users
  • Middleware DemoExpired → redirect /pricing cu mesaj dacă demo a expirat
  • Alias 'demo.active' înregistrat în bootstrap/app.php
  • Middleware aplicat pe grupul ['auth', 'verified'] din web routes
  • User model: is_demo + demo_expires_at în fillable + casts
  • Command demo:reset — resetează keywords, parolă, reînnnoiește expirarea
  • Scheduler: demo:reset săptămânal luni 03:00
  • User demo@osint-romania.ro / Demo1234! creat, expiră 29.05.2026
  • Pagină /demo publică — credențiale cu copy-to-clipboard, features list,
22 May 2026, 12:00
admin referral report — /admin/referral-report
22 May 2026, 11:51
Email Onboarding — 4 emailuri automate pentru conversie trial → plată
  • Coloana onboarding_step tinyint pe users (0=nou, 1=welcome, 2=day3, 3=day10, 4=day14)
  • OnboardingMail (un singur Mailable, 4 step-uri)
  • SendWelcomeEmail listener — ascultă Registered event, trimite step 1 în coadă
  • SendOnboardingEmails command (onboarding:send --dry-run):
  • Day 3: articole matching keywords + îndemn configurare dacă nu au keywords
  • Day 10: reminder activare cu prețuri, 4 zile rămase
  • Day 14: trial expirat, reactivare
  • Avansează un singur pas per rulare (nu spamează dacă scheduler a lipsit)
  • Ignoră useri mai vechi de 90 zile
22 May 2026, 11:42
Keyword Email Alerts — instant + daily per user
  • Coloana keyword_alert_mode enum(instant,daily,off) default daily pe users
  • KeywordAlertMail + template emails/keyword-alert.blade.php
  • Command alerts:keywords: digest zilnic 08:00, per user, per keyword, gate aware
  • FetchFeeds: după Article::create colectează articolele noi relevante și trimite
  • buildMatches() static — refolosit în ambele contexte (instant + daily)
  • /settings/keywords: card Alerte email cu 3 opțiuni radio (instant/daily/off)
  • UserKeywordController::updateAlertMode() + rută POST settings/keywords/alert-mode
  • alerts:keywords rulează zilnic la 08:00 (lângă digest:weekly)
21 May 2026, 03:16
sistem referral complet — cod personal, tracking, recompense Stripe
  • Migrație users: referral_code (OSR-XXXXXXXX) + is_referral
  • Tabel referrals: tracking referrer/referred, IP, conversie, recompensă
  • User model: generateReferralCode(), referralUrl(), convertedReferrals()
  • GET /r/{code} → cookie 30 zile + redirect /register
  • RegisterController: la înregistrare, dacă există cookie → salvează Referral
  • HandleInvoicePaymentSucceeded: la prima plată → marchează converted_at
  • /account/referral: link personal, share WhatsApp/LinkedIn/Email,
  • Link 🎁 Program Referral în meniul navbar
21 May 2026, 02:46
subscription badge în navbar + banner expirare + card în /account
  • Badge plan colorat în navbar (Trial/Individual/Pro/Business/Admin)
  • Banner dismissible când trial expiră în ≤ 5 zile
  • Card abonament în /account: plan, status, dată expirare/reînnoire,
21 May 2026, 02:01
weekly digest — email săptămânal per categorie pentru abonați
  • Command artisan digest:weekly cu --dry-run support
  • Filtrare useri după gate weekly-digest (Pro + Business)
  • Articolele săptămânii trecute: security/crypto/finance/news (max 8/cat)
  • Template email HTML responsive cu secțiuni per categorie
  • Scheduler: luni 08:00 via weeklyOn(1, '08:00')
  • todo.md: marcat done forgot/reset password, log rotation, FPM, SmartBill items
21 May 2026, 01:49
SmartBill integration — audit trail complet Stripe → SmartBill
  • Migrație smartbill_invoices: request/response payload, status, retry, PDF tracking
  • Migrație gdpr_consents: consimțăminte GDPR cu tip, IP, user agent, versiune
  • SmartBillService: emitere factură, descărcare PDF, trimitere email client
  • Neplătitor TVA (art.310 Cod Fiscal), seria FFBBD
  • isDraft=true până la activare cont live
  • Listener HandleInvoicePaymentSucceeded: hook pe Stripe invoice.payment_succeeded
  • Creare înregistrare audit → emitere SmartBill → PDF → email client
  • Deduplicare automată per stripe_invoice_id
  • config/services.php: configurare SmartBill din .env
21 May 2026, 01:14
API key dashboard, rate limit headers, Scribe auth
  • Dashboard admin la /admin/api-keys — creare, revocare, ștergere API keys
  • Rate limit headers în fiecare response: X-RateLimit-Limit/Remaining/Reset/Tier
  • Scribe: autentificare Bearer documentată, docs regenerate
  • .gitignore: exclud public/vendor/scribe/ și storage/app/private/scribe/
21 May 2026, 01:03
Security Intelligence API cu autentificare API key și rate limiting
  • Adaugă 9 endpoint-uri REST: /api/v1/security, /crypto, /finance, /news, /search
  • Autentificare Bearer token cu model ApiKey (SHA256 hash, tiere Free/Developer/Business)
  • Rate limiting per tier cu reset zilnic automat
  • Controller unificat cu filtru per categorie sursă
  • Migrație api_keys, middleware ApiKeyMiddleware, routes/api.php
  • Fix UserKeywordController — funcție index lipsă (upload corupt PhpStorm)
  • Future features documentate în todo.md
20 May 2026, 07:33
Gates & Policies enforcement — 5 abilities active
  • keyword-alerts: gate + limită per plan (limit_value din DB), counter
  • view-dashboard: redirect la /billing dacă planul nu permite accesul
  • analytics: @can('analytics') în dashboard cu upgrade card fallback;
  • breaking-news: ticker Breaking News vizibil doar cu @can('breaking-news')
  • sources-custom: gate în SettingsController::toggleSource() pentru
17 May 2026, 18:55
reset defaults în Roles & Permissions + pagina /breaking completă
  • Buton reset per plan + reset toate planurile (cu confirm JS)
  • Constante DEFAULTS și LIMITS în controller pentru seed reproducibil
  • Rută POST /admin/plan-abilities/reset
  • Design standalone (fără layout app) — accesibil și pentru guest
  • Card per știre: badge surse, timp relativ, titlu clickabil, chips surse
  • Auto-refresh la 60s
  • Fallback 1h→3h→6h (refolosește logica din /api/breaking-news)
  • Topbar cu link înapoi la dashboard/homepage
17 May 2026, 18:17
Gates & Policies cu DB — Roles & Permissions matrix în admin
  • Migrare plan_abilities (8 planuri × 10 abilities) cu seed-uri implicite
  • Model PlanAbility cu cache 60s
  • Helper UserPlan::of($user) — detectează tipul planului activ
  • AppServiceProvider: Gate::define() dinamic din DB la boot
  • PlanAbilitiesController: index + update (bulk save)
  • View matrix: toggle switch per celulă + limit_value pentru keyword-alerts/multi-seat
  • Indicator "modificări nesalvate" + buton Save sticky la bottom
  • Link "Roles & Permissions" în dropdown user (vizibil doar admin)
17 May 2026, 17:34
email verification — controller, view, rute, middleware verified
  • User implements MustVerifyEmail
  • VerificationController: notice, verify, resend
  • View auth/verify.blade.php — pagină așteptare + buton retrimite
  • Rute: GET /email/verify, GET /email/verify/{id}/{hash} (signed),
  • Middleware 'verified' adăugat pe grupul auth principal
  • Traduceri ro + en pentru toate mesajele de verificare
17 May 2026, 17:13
PWA banner — apare imediat, mini-buton după dismiss
  • Eliminat delay (era 3s/3.6s) — bannerul apare instantaneu
  • Eliminat sessionStorage — nu mai dispare permanent
  • La dismiss (×): bannerul se ascunde, apare un mini-buton cu
  • Click pe mini-buton → redeschide bannerul complet
  • Mini-butonul dispare la instalare reușită (appinstalled event)
17 May 2026, 17:10
PWA banner — timeout dublat (Android 3s, iOS 3.6s)
17 May 2026, 17:05
banner instalare PWA iOS cu instrucțiuni vizuale
  • Detectare: iOS + Safari + nu Chrome/Firefox + nu standalone + mobil
  • Banner cu 2 pași vizuali ilustrați:
  • Apare după 1.8s, dismiss salvat în sessionStorage
  • Separat de bannerul Android (nu apar simultan)
17 May 2026, 17:04
banner instalare PWA pe mobil pentru utilizatori nelogați
  • Iconiță app + titlu + descriere scurtă
  • Buton "Instalează" → declanșează beforeinstallprompt nativ
  • × dismiss → ascuns pentru sesiunea curentă (sessionStorage)
  • Nu apare dacă: deja instalat (standalone mode), desktop, sau dismissed
  • Apare după 1.5s pentru a nu întrerupe încărcarea paginii
  • Animație slide-up la apariție
17 May 2026, 16:22
breaking news — sessionStorage + fallback progresiv timp
  • Înlocuit localStorage cu sessionStorage: ascunderea se resetează
  • Fallback progresiv dacă nu există breaking din ultima oră:
17 May 2026, 16:19
burtieră breaking news — ticker TV cu detecție automată
  • grupare articole din ultima oră după cuvinte cheie comune (≥5 chars)
  • confirmare breaking dacă ≥3 surse diferite publică același subiect
  • returnează max 10 știri cu titlu, url și surse
  • label BREAKING NEWS roșu (22% lățime) cu blink puls
  • bandă derulantă CSS cu titluri + surse, loop continuu
  • click pe titlu → deschide articolul în tab nou
  • buton × ascunde burtiera (salvat în localStorage)
  • auto-refresh la 60 secunde, dispare dacă nu există breaking
17 May 2026, 16:11
timeline — scroll custom aliniat + easing cubic
  • calculează exact poziția astfel încât bila evenimentului să se
  • folosește easing cubic ease-in-out cu durată proporțională cu
17 May 2026, 16:06
timeline — bilă activă la overlap cursor, hover permanent, click scroll
  • bila evenimentului crește (scale 1.7) cu border alb + glow cyan pronunțat
  • cursorul se micșorează (scale 0.65) simulând "intrarea în gaură"
  • card-ul corespunzător primește efectul de hover permanent (is-active)
  • hover suplimentar pe card → border și glow și mai pronunțate
17 May 2026, 13:06
timeline — buton preview guest pentru admin
17 May 2026, 13:04
timeline — filtrare pe rol admin vs utilizator
16 May 2026, 11:13
HTML email template for 500 error alerts
  • Add resources/views/emails/error500.blade.php: dark-themed HTML email with
  • Switch bootstrap/app.php from Mail::raw() to Mail::send() with the new
16 May 2026, 10:54
email alert on 500 errors + full form input audit in SECURITY_AUDIT.md
  • bootstrap/app.php: report() hook sends email to admin@osint-romania.ro on
  • SECURITY_AUDIT.md: added F1–F29 form inventory with validation status,
16 May 2026, 10:22
timeline page with centered line, alternating layout & scroll cursor
  • GET /timeline (noindex) renders git log as a two-column alternating timeline
  • Center vertical line with commits alternating left/right via CSS grid (1fr 60px 1fr)
  • Scroll-tracking cursor dot uses requestAnimationFrame to follow viewport position
  • Mobile fallback: single-column with left-side line at ≤680px
  • Not linked in any frontend nav
16 May 2026, 08:00
billing (Stripe/Cashier), i18n (ro/en), error pages, performance & stability fixes
  • Laravel Cashier installed; subscriptions, subscription_items, customer columns migrated
  • SubscriptionController with Stripe Checkout, Customer Portal, trial support
  • /pricing and /about public pages (dark theme, orbs, animations)
  • price_policy.md with seasonal discount calendar
  • 17 lang files × 2 locales (556+ keys) covering all views
  • LocaleController: GET /locale/{ro|en} with ?return= param (immune to Referrer-Policy: no-referrer)
  • preferred_locale column on users table; SetUserLocale middleware already in place
  • Language selector in General Settings (/settings)
  • Translation agent ran over 29 blade views; fixed \$var escaping bug in article-table
  • DashboardController cache stores plain PHP arrays (not Collections) — fixes __PHP_Incomplete_Class deserialization 500s after OPcache reloads
  • CoinMarketCapService: web requests never call external API; bitcoin:fetch background command (every 5 min) owns all fetches
  • CoinMarketCap retry(2) removed; timeout 10s → 8s
  • BNR HTTP timeout 30s → 10s
  • PHP-FPM request_terminate_timeout raised 30s → 60s; max_children stays at 20
  • AvatarProxy: d=404 → d=mp (mystery person fallback, eliminates 404 flood)
  • errors/404, 500, 403, 419, 429 in dark-theme standalone layout
  • 500 page: removed auto-reload (was causing infinite browser loop)
  • 419 page: 5-second redirect to /login
  • AGENTS.md: FPM config, cache-lock pattern, optimize-app workflow, bilingual rules
  • OSINT_ROMANIA.md: scheduled commands, cache drivers, deploy workflow
  • SECURITY_AUDIT.md: May-16 fixes (double-submit, FPM exhaustion, ownership)
  • todo.md: Stripe + SmartBill setup steps, infra TODOs
15 May 2026, 19:58
push notifications, article read tracking, Turnstile auth & dashboard performance
  • Add web push notification system (PushSubscription model, PushController,
  • Track article read state per user (article_reads table, UI indicators,
  • Integrate Cloudflare Turnstile on login form to block bots
  • Add account password-change page
  • Dashboard performance: cache feed widgets (1 min), BNR rates snapshot (10 min),
  • Push notification summary sent per category (security, crypto, finance, news)
14 May 2026, 15:45
auth, SEO audit, trading bot, user sources & admin hardening
  • Adăugat forgot/reset password (ForgotPasswordController, ResetPasswordController, views, migrare password_resets)
  • Locale switch per utilizator (SetUserLocale middleware, rută account.locale)
  • Feed-urile /security, /crypto, /finance restricționate la admini
  • Gestionarea surselor (sources resource) mutată sub middleware admin
  • Lock pe cache pentru /feeds/fetch-all — previne dispatch-uri concurente
  • TradingBotController + TradingSimulatorService + view trading/bot
  • SeoAuditCommand, SeoAuditLatestCommand + model SeoAudit + migrare
  • Model UserSource + migrare user_sources
  • TrackPageVisit middleware pentru urmărirea vizitelor
  • Refactorizare majoră layouts/app.blade.php (navigație, iconițe flag RO/EN)
  • Îmbunătățiri views: articles, login, crypto, finance, security, settings, sources
  • Panou admin login-monitor extins
14 May 2026, 12:06
PWA, mobile UX, performance, security & admin features
  • **PWA complet**: manifest.json, service worker (cache-first/network-first), offline.html, icoane 192/512px, apple-touch-icon, meta tags iOS/Android
  • **Laravel Pulse**: instalat și configurat la /dashboard/pulse, acces restricționat la admini, lazy=false pe toate componentele (fix blank screen), date în timp real
  • **Login Monitor** (/dashboard/login-monitor): dashboard admin cu speed dials (total/online/idle/away), tabel sesiuni active cu device detection, browser detection, IP, status colorat, auto-refresh 15s
  • **Coloana is_admin** pe users cu middleware AdminMiddleware, gate viewPulse, contul catalinnegru84@gmail.com setat admin
  • **Conturi noi**: iulik2k1@gmail.com și andreea.cocheci@yahoo.com
  • **AccountController** cu pagina /account: schimbare nume, parolă, link Gravatar, badge Admin/Analyst
  • **Avatar Proxy** (/avatar/{hash}): proxy Gravatar prin serverul propriu, elimină third-party cookies
  • **bitcoin-card-head portret**: flex-column, grid 2-col pentru currency switcher + preț, subtitlu ascuns
  • **bitcoin-metrics portret**: 1 metric/rând; landscape: 2/rând
  • **Sidebar mobil**: pornește de la top: var(--topbar-height) — nu se mai ascunde sub header
  • **Topbar z-index 1031** pe mobil (deasupra backdrop 1025) — toggle hamburger funcționează când meniu e deschis
  • **notifPanel mobil**: position fixed, full-width, sub topbar
  • **notifWidget click toggle**: deschide/închide la click; animație has-new persistă până la acknowledge; hover (@media hover:hover) separat de click
  • Eliminat Bootstrap CSS (227KB), Bootstrap Icons CSS (85KB), Bootstrap JS (79KB) — înlocuit cu CSS minimal 1KB + SVG inline
  • Eliminat browser-logger dev tool din producție
  • Self-hosted assets: /assets/css/, /assets/js/, /assets/fonts/
  • Preconnect pentru fonts.googleapis.com + fonts.gstatic.com
  • Font Inter non-blocking (media=print onload)
  • Manifest lazy (încărcat post-load via JS)
  • Turnstile lazy (încărcat la prima interacțiune)
  • bfcache: pageshow handler pentru Turnstile reset
  • h1→h2 pe secțiunea notify (heading order WCAG)
  • Meta description adăugată
  • Contrast fix: footer-vbar/dot 0.22→0.45 opacity, placeholder 0.35→0.55
  • **gzip compression** via mod_deflate în .htaccess
  • **Cache headers**: CSS/JS/fonturi/imagini max-age=31536000 immutable
  • **Meta descriptions** pe 10 pagini principale din app layout
  • **preconnect cdn.jsdelivr.net** pentru font-src și connect-src în CSP
  • **pulse:work** schedulat la fiecare minut în console.php
  • Sidebar admin cu link Login Monitor și Pulse Metrics (vizibil doar admins)
  • CSP extins: cdn.jsdelivr.net în font-src și connect-src, fonts.bunny.net pentru Pulse
  • Permissions-Policy păstrat, HSTS pe HTTPS
11 May 2026, 09:01
Security, Crypto and Finance sections + legal analysis + timezone fix + feed engine improvements
  • /security — 14 sources: DNSC, CVEfeed.io, CISA, NCSC UK, The Hacker News, BleepingComputer,
  • /crypto — 12 sources: CoinDesk, Cointelegraph, Bitcoin Magazine, Decrypt, CryptoSlate,
  • /finance — 15 sources: Capital.ro, Curs de Guvernare, BVB (Google News), Bankier.pl (PL),
  • /time/check — NTP sync controller comparing server time vs worldtimeapi.org
  • FeedIoClient: custom PSR-18 adapter replacing debril/feed-io's default HTTP client
  • FetchFeeds: UniqueConstraintViolationException catch for race-condition duplicate hashes
  • 2-digit year fix: pubDate year<1000 → addYears(2000) (CISA RSS sends year=26)
  • FeedFetchService: Artisan::call() synchronous instead of Process::start() (Herd FPM fix)
  • Heartbeat route: lock-based synchronous fetch, returns news_total + sec_total + crypto_total
  • 4 independent counters: News / Security / Crypto / Finance (each with own meta tag + JS poll)
  • News counter now excludes security, crypto, finance categories
  • Each section has distinct Web Audio API sound (tone frequencies differ per section)
  • Sidebar badges animate (pop+glow) on new articles; auto-reload on /section page
  • 5 cards: România / Internațional / Securitate / Crypto / Piețe Financiare
  • Per-source freshness indicator: Fresh / Stale Xh / RSS stale Xh (>36h)
  • Toggle active/inactive inline, Fetch now per source
  • Sortable # column (ID asc/desc) added to all four section tables
  • Sursă column centered in all tables
  • Filter by ID field added
  • Keywords column center-aligned
  • Source filter uses <optgroup> by country in Finance view
  • diffForHumans() now compares against Europe/Bucharest timezone
  • APP_DISPLAY_TIMEZONE=Europe/Bucharest in .env
  • config/app.php: display_timezone key reads env
  • Article::localPublishedAt() converts UTC→Bucharest for all display
  • Fixed 24 articles with corrupted timestamps from brief Bucharest timezone period
  • FetchFeeds: year<1000 guard on pubDate (CISA Advisories bug)
  • Full legal review of RSS aggregation rights under Romanian law + EU DSM Directive
  • Per-source licensing cost estimates (€0 to €80k/year range)
  • Private use assessment (legally sound); monetization roadmap
  • Extracted from user's financial planning conversation: S&P500, ETFs, pension, BVB interests
  • Added security and finance to SQLite CHECK constraint via two migrations (table recreation)
  • SourceController and source forms updated to accept all 9 categories
  • Each source belongs to exactly one category → appears only in its section
10 May 2026, 21:27
RSS news aggregator with full Bootstrap UI, auto-translate & real-time notifications
  • RSS aggregator: sources, articles, user_keywords tables with migrations & models
  • 26 RSS sources seeded (13 RO + 13 INT: BBC, Guardian, DW, Al Jazeera, FT, MarketWatch,
  • `php artisan feeds:fetch` command — deduplication via sha1(title+url), image extraction,
  • `php artisan articles:translate` — auto-translation of INT articles to Romanian via
  • FeedFetchService — background dispatch via PHP_BINARY exec, login-trigger + JS heartbeat
  • Full Bootstrap 5 scaffolding replacing Tailwind: dark sidebar, sticky topbar, responsive
  • Auth pages (login/register) with dark guest layout
  • Dashboard with stat cards and live activity feed
  • /articles — sortable table (date, source, title) with keyword highlighting, translated
  • /sources — CRUD with per-source fetch button
  • /settings — two-card layout (🇷🇴 România / 🌍 Internațional) with freshness indicators
  • /keywords — user keyword management with quick-add suggestions and active/inactive toggle
  • Functional global search (Ctrl+K shortcut) → /articles?search=
  • Fetch All button with spinner animation → background feed update
  • Theme toggle: sun/moon/system orbit animation (requestAnimationFrame, easeInOutQuad,
  • Notification widget (!) — hover dropdown with last 10 articles, new-article dot indicator,
  • Sidebar article badge — pop+glow animation on new articles detected
  • debril/feed-io ^6.0 — RSS/Atom parser
  • stichoza/google-translate-php ^5.3 — unofficial Google Translate
  • bootstrap ^5.3.3, bootstrap-icons ^1.11.3, @popperjs/core ^2.11.8
  • @fortawesome/fontawesome-free ^7.2.0, jquery ^4.0.0
  • Added proper Laravel .gitignore (vendor/, public/build/, .env, storage/, DB file)