IMG-BLOG-202 blog-hero-sqlite-electron-illustration.svg · 1200×500 DE CREAT
Două arhitecturi, două filosofii: cloud SaaS vs local-first cu SQLite + Electron.

Trei luni am discutat intern cu echipa cum construim SEO Master PRO MAX. Nu „două săptămâni de research", trei luni reale de dezbatere cu oameni care au construit ambele tipologii înainte. Întrebarea de bază: SaaS cloud cu front-end React Native (model Ahrefs / SEMrush / Surfer) sau aplicație desktop local-first cu SQLite + Electron (model unic în nișă)? Articolul ăsta e dezbaterea aia condensată — argumentele pro și contra pentru fiecare drum, ce a decis în final, ce am pierdut prin alegerea făcută.

Setup-ul: ce voiam să construim și pentru cine

Înainte de orice decizie tehnică, întrebare de business: pentru cine construim?

Audiența țintă inițială:

  • Consultanți SEO români și est-europeni care fac audit-uri pentru clienți cu obligații compliance (medical, juridic, financiar, fintech).
  • Agenții mici (2-10 oameni) care nu vor să plătească 500+ EUR/lună la 3-5 abonamente (Ahrefs + SEMrush + Surfer + Screaming Frog + ChatGPT Plus).
  • In-house SEO la companii cu politică strictă pe protecția datelor (multe departamente IT au interzis tool-uri SaaS care procesează date proprietare fără DPA semnat).

Ce voiam să avem:

  • Audit complet pe site-uri client fără să trimitem URL-uri pe servere terțe.
  • Multi-AI integration (Claude + GPT + Gemini + Perplexity + DeepSeek) cu cheile clientului.
  • Funcționare 100% offline pentru momentele când lucrezi în avion / fără net.
  • Preț predictibil, fără abonament obligatoriu lunar.
  • Date persistente pe device-ul utilizatorului, exportabile oricând.

Cu spec-ul ăsta în mână, am început dezbaterea arhitecturală.

Opțiunea cloud + React Native

Cum ar fi arătat aplicația cu acest stack:

  • Front-end: React Native cu Expo, build cross-platform (Windows / macOS / Linux desktop + iOS / Android mobile).
  • Back-end: Node.js sau Python pe AWS / GCP / Hetzner.
  • DB: PostgreSQL managed (Supabase / Neon / RDS).
  • Auth: Auth0 sau Clerk.
  • Background jobs: Redis + BullMQ pentru audit crawls.
  • Stripe pentru subscriptions, CDN pentru asset-uri.

Ce câștigam:

  • Build o singură codebase, deploy peste tot. Update-uri instant la toți users.
  • Cross-device sync gratis: utilizatorul deschide pe laptop dimineața, pe telefon seara, vede aceleași date.
  • Multi-user collaboration ușor: agenții pot vedea aceleași audit-uri, comentarii pe rapoarte, history partajat.
  • Pornire fără frecușuri: account, password, login, gata. Nu „download installer 150MB, rulează NSIS, restart Windows".

Costul real:

  • Infrastructure costs: la 1.000 users activi cu audit zilnic = ~3.000-5.000 EUR/lună (compute + bandwidth + storage). La 10.000 users = ~25.000-40.000 EUR/lună.
  • Asta înseamnă obligație de subscription minimum 30-50 EUR/lună pe user pentru break-even, ceea ce te scoate complet din segmentul agențiilor mici.
  • DPA-uri de semnat cu fiecare client (sub-procesatori AWS în SUA, transfer date trans-atlantic, retenție etc.).
  • Dependency completă pe uptime cloud provider — un AWS outage = downtime pentru toți.

Opțiunea SQLite + Electron

Cum ar fi arătat aplicația cu stack-ul ales:

  • Front-end: Electron (Chromium + Node.js) cu React în renderer process.
  • Back-end: Node.js în main process, IPC între main și renderer.
  • DB: SQLite cu WAL mode, fișier .db local pe disk-ul utilizatorului.
  • Auth: license key local + verificare semnătură (no server roundtrip).
  • Background jobs: child_process pentru audit crawls (worker pool intern).
  • AI calls: direct la Anthropic / OpenAI / Google / Perplexity / DeepSeek cu cheia utilizatorului.
  • Update: NSIS installer auto-update prin Electron Updater + GitHub Releases.

Ce câștigam:

  • Zero infrastructure costs pentru noi. Utilizatorul plătește doar API costs proprii la providers AI (~1-5 USD/lună tipic).
  • Datele utilizatorului nu părăsesc niciodată device-ul (decât când el explicit trimite la AI provider). DPA simplu: „nu procesăm nimic, nu vedem nimic".
  • Funcționare 100% offline pentru audit-uri (crawl + parse + report fără internet).
  • Subscription model devine opțional, nu obligatoriu — putem oferi planuri Pro / Studio cu features extra fără să oblige utilizatorul la plată recurentă.
  • Performance — SQLite local e ordine de magnitudine mai rapid decât query la PostgreSQL remote pentru toate operațiile standard.

Costul real:

  • Bundle size mare: 150-180 MB instalator Windows (Chromium = ~120 MB). Pe 2025-2026 e acceptabil, dar nu e 5 MB ca un .exe nativ.
  • Multi-platform support cere build separate: Windows .exe (NSIS), macOS .dmg (notarized), Linux .AppImage / .deb / .rpm.
  • Cross-device sync nu e gratuit: trebuie implementat manual prin export/import sau prin servicii de sync opt-in.
  • Update flow mai complex: utilizatorul trebuie să accepte update, restart aplicație, vs „refresh tab" în SaaS.

Ce a decis în final: patru factori critici

IMG-BLOG-203 diagram-cloud-vs-local-architecture.svg · 1000×600 DE CREAT
Comparativ vizual: data flow cloud SaaS vs data flow local-first cu SQLite + Electron.

Am decis SQLite + Electron pe baza la patru factori, în ordinea importanței.

Factorul 1 — GDPR și compliance strict: audiența noastră (consultanți cu clienți medical / juridic / financiar) NU își poate permite să trimită URL-uri și conținut client la un server terț. Un singur incident de breach pe partea noastră = sfârșitul afacerii pentru clientul lor + atragerea responsabilității juridice către consultant. Local-first elimină categoria asta de risc complet.

Factorul 2 — Predictibilitate cost pentru utilizator: SaaS cloud înseamnă subscription lunar. Pentru un consultant care face 3-5 audit-uri/lună la diferiți clienți, 49-99 EUR/lună abonament e nepractic. Local-first înseamnă plată one-time (sau abonament opțional pentru features Pro), iar API costs (1-5 USD/lună) sunt direct la providers, transparent.

Factorul 3 — Control complet UX: Electron îți dă chrome browser embedded, dar restul = control total. Putem face shortcut-uri keyboard sistem, integrare cu file system local (open in Explorer / Finder), notification native, system tray. SaaS cloud te limitează la ce permite browser-ul.

Factorul 4 — Portabilitate codbase: dacă mâine apare un framework superior la Electron (Tauri se maturizează, Wails crește), migrare cu SQLite + business logic în TypeScript pură = rescrii doar UI shell-ul, nu DB sau backend. SaaS cloud = blocked în provider's stack pentru ani.

Ce am pierdut prin alegerea asta (pe bune)

Trei lucruri concrete pe care nu le avem și nu le-am avea curând.

Multi-device sync nativ: utilizatorul nu poate deschide aplicația pe laptop și pe desktop și să vadă aceleași audit-uri automat. Workaround actual: export .smp (formatul nostru) → transfer manual → import. Pe roadmap: integrare opțională cu Dropbox / Google Drive / iCloud pentru sync transparent (utilizatorul controlează cu ce cont, noi nu vedem nimic).

Bundle size: instalatorul Windows e de zeci de MB — comparabil cu alte aplicații desktop populare. Nu putem reduce semnificativ atâta timp cât folosim Electron (Chromium ocupă singur cea mai mare parte a bundle-ului). Trade-off acceptat — versionăm aplicația, update-urile sunt diff-only (mult mai mici decât bundle-ul complet).

Mobile app: nu există versiune iOS / Android. SQLite + Electron nu rulează pe mobile. Pentru SEO Master PRO MAX nu e blocant (consultanții lucrează pe desktop), dar e limitare pe care o anunțăm transparent.

Cum am rezolvat compromisurile

Pentru bundle size: differential updates prin Electron Updater (utilizatorul descarcă doar diff-ul între versiuni, nu tot bundle-ul). Update-ul mediu e mult mai mic decât bundle-ul complet — câteva MB tipic.

Pentru multi-device sync: am construit format export .smp (SEO Master Project) care conține audit + reports + history compresat. Export → upload manual la Dropbox / Drive → import pe alt device. Pe roadmap vine integrare Dropbox / Drive opt-in (o singură click, cont al utilizatorului).

Pentru auto-update predictibil: Electron Updater verifică o dată pe zi, notifică non-intrusiv, utilizatorul decide când acceptă. Update-urile critice (security) marcate explicit cu badge.

Pentru cross-platform consistency: pipeline CI care construiește simultan pentru Windows + macOS + Linux la fiecare release, cu test runner E2E care rulează aceleași teste pe toate trei. Niciun release fără test pass pe toate platformele.

Pentru cine e bună fiecare opțiune (recomandare neutră)

Dacă tu însuți te gândești la trade-off, iată regulile pe care le-am formulat în sesiunile noastre.

SaaS cloud + React Native e potrivit pentru tine dacă:

  • Ai audiență cu collaboration nevoie centrală (multi-user, comentarii, share live, audit shared).
  • Datele NU sunt sensibile sau ai DPA semnat acceptabil cu users.
  • Ai resurse financiare să acoperi infrastructure costs până la break-even (12-24 luni runway).
  • Vrei mobile-first (iOS / Android) ca propunere de valoare.
  • Update-urile frecvente (push la main → deploy) sunt parte din value prop.

SQLite + Electron e potrivit pentru tine dacă:

  • Ai audiență cu obligații compliance pe protecția datelor (sau care ține mult la privacy).
  • Vrei zero infrastructure costs și business model independent de scale (10 users sau 10.000 users = aceeași infrastructure).
  • Funcționarea offline e core, nu nice-to-have.
  • Cross-device sync nu e P0 (e P2 sau opțional).
  • Vrei portabilitate codbase pe termen lung (3-5 ani).
Idee de păstrat: Ambele sunt drumuri valide. Nu există „varianta corectă", există varianta care se aliniază cu audiența și business model-ul tău.

Concluzie + ce urmează

IMG-BLOG-204 screenshot-electron-app-running-windows.png · 1200×700 DE LIVRAT de PM
SEO Master PRO MAX rulând nativ pe Windows — Electron app, SQLite database, zero traffic spre cloud-ul nostru.

Trei luni de dezbatere intern s-au redus la patru factori critici: GDPR strict, predictibilitate cost, control UX, portabilitate codbase. Pentru audiența noastră (consultanți SEO cu clienți serioși și agenții mici) SQLite + Electron a fost răspunsul. Pentru altă audiență, SaaS cloud poate fi alegerea corectă.

Ce am învățat de când am luat decizia:

  • Bundle size de zeci de MB nu a fost problema percepută inițial. Utilizatorii sunt ok cu un installer sub 100 MB pentru ceva ce folosesc zilnic — comparativ, alte aplicații desktop populare ajung la sute de MB.
  • Update flow non-intrusiv (notificare + accept) e mai bun perceput decât „refresh tab" forced. Utilizatorul controlează când se schimbă comportamentul aplicației.
  • Performance local SQLite vs PostgreSQL remote nu e doar marketing. Audit cu mii de pagini durează zeci de secunde local, vs minute întregi pe un setup cloud equivalent. Diferența e perceptibilă brutal.
  • Lipsa mobile e mai puțin problematică decât anticipam — consultanții SEO lucrează aproape exclusiv pe desktop oricum.

Restul articolelor de fond:

Întrebări tehnice pe stack? contact@seo-master.ro.