Salt la conținut
Înapoi la proiectele selectate
În producție
Sigla crwsync

crwsync

Spațiu de lucru colaborativ în timp real, care îmbină tablourile Kanban de sarcini, mesageria live a echipei și stocarea de fișiere într-un monorepo distribuit de înaltă disponibilitate.

Panoul de control al spațiului de lucru crwsync

O platformă distribuită de colaborare în timp real, concepută pentru a elimina schimbarea continuă de context din companii. Prin unificarea urmăririi sarcinilor în stil Kanban, a comunicării de echipă cu latență redusă și a stocării centralizate de fișiere într-un monorepo Turborepo decuplat, crwsync sincronizează starea instantaneu între organizații și medii distribuite — cu o căutare globală Cmd+K care acoperă sarcinile, mesajele și fișierele.

// Arhitectură

Turborepo distribuit

3 aplicații decuplate (@crwsync/backend, @crwsync/dash, @crwsync/web).

// Motor în timp real

Socket.IO + Redis 7

Scalare orizontală WebSocket cu adaptorul Redis Pub/Sub.

// Backend și bază de date

NestJS 11 + Prisma 7

Persistență PostgreSQL 16 cu protecții RBAC la nivel de spațiu de lucru.

// Infrastructură

Docker Swarm

Orchestrare containerizată multi-serviciu, cu verificări de stare.

// prezentare generală

Ce este crwsync

crwsync îmbină tablourile de sarcini în stil Kanban cu mesageria live a echipei într-o singură interfață, astfel încât echipa trage un card între coloane și vede în același panou, în timp real, mesajul de chat al unui coleg — cu fișiere partajate, comentarii la sarcini și liste de verificare la fel de aproape. Este construit ca un monorepo Turborepo de nivel enterprise — un API NestJS, un panou de control Next.js și un portal web public — decuplat în containere și orchestrat pentru înaltă disponibilitate.

Un sistem de gestionare a rolurilor pe două niveluri adaptează spațiul de lucru la ierarhia reală și la cerințele de acces ale echipei, în loc de un singur model plat de permisiuni.

// 01. Context strategic

De ce este construit crwsync astfel

01 // Problema

Instrumente fragmentate și schimbare continuă de context

Echipele moderne de inginerie navighează zilnic între 9 și 15 aplicații separate. Alternarea între tablouri Kanban izolate, sisteme de urmărire a problemelor și canale de chat independente fragmentează concentrarea, provoacă diferențe între date și creează fricțiuni în comunicare, care încetinesc ritmul de execuție al echipei.

Dinamica-cheie: 9–15 aplicații fragmentate per echipă
02 // Soluția

Tablouri de sarcini și mesagerie live, în același loc

crwsync unifică execuția prin integrarea tablourilor Kanban cu drag-and-drop direct cu mesageria în timp real, pe camere și directă, într-o singură fereastră. Construit pe un monorepo Turborepo modular, îmbină starea optimistă a interfeței cu difuzări WebSocket și cu permisiuni bazate pe roluri la nivel de spațiu de lucru.

Dinamica-cheie: Spațiu colaborativ într-un singur panou
03 // Rezultatul

Latență sub 100 ms și arhitectură decuplată

Separând tranzacțiile sincrone din baza de date PostgreSQL de difuzările live efemere prin Redis Pub/Sub, sistemul oferă o latență de sincronizare sub 100 ms între clienții distribuiți, delegând sarcinile grele de fundal, precum e-mailurile, unor cozi de joburi BullMQ asincrone.

Dinamica-cheie: Propagarea evenimentelor sub 100 ms
// principiu arhitectural
„Prin decuplarea difuzărilor live WebSocket de tranzacțiile persistente din baza de date relațională, crwsync oferă o latență de sincronizare sub 100 ms, păstrând garanțiile ACID stricte.”
— Principiu arhitectural
// 02. Turul produsului

crwsync în acțiune

O prezentare orientată spre client a fiecărui modul — ce face și cum se simte folosirea lui

Module globale

Trei vizualizări la nivel de spațiu de lucru, disponibile din bara de navigare de sus

Captură de ecran Panoul de start

Panoul de start

Centrul de pornire al spațiului de lucru — fluxul activității recente, proiecte fixate, sarcini în așteptare și un instantaneu al prezenței echipei în timp real, dintr-o privire.

⌘KOmni-căutare globală

Omni-căutare globală

Apăsați Cmd+K (sau Ctrl+K) de oriunde din spațiul de lucru pentru a deschide o fereastră unificată de căutare. Sarcini, mesaje, fișiere și membri — toate pot fi căutate într-un singur loc, cu rezultate fuzzy instantanee pe măsură ce tastați.

Captură de ecran a ferestrei de omni-căutare Cmd+K a crwsync, deschisă, cu rezultate din sarcini și mesaje
02Gestionarea sarcinilor

Tabloul de sarcini

Un tablou Kanban cu drag-and-drop, prin care echipa dumneavoastră duce munca înainte împreună — în timp real. Plasați un card într-o coloană nouă și fiecare coleg îl vede mutându-se instantaneu, fără reîncărcare.

  • Coloane cu drag-and-drop: Mutați sarcinile între etapele fluxului de lucru printr-un drag-and-drop fluid — reordonările se păstrează instantaneu la toți colegii.
  • Panoul de detalii al sarcinii: Deschideți orice sarcină pentru o suprafață completă de editare: descriere în text îmbogățit, liste de verificare cu progres, termene limită și etichete de prioritate.
  • Liste de verificare pentru subsarcini: Împărțiți munca în pași, cu liste de verificare integrate. O insignă de progres arată dintr-o privire stadiul, direct din vizualizarea tabloului.
  • Comentarii și @mențiuni: Comentarii pe fire de discuție la fiecare sarcină, cu notificări prin @mențiune, astfel încât contextul rămâne atașat de munca în sine.
  • Atașamente și previzualizări: Trageți fișiere direct pe o sarcină sau lipiți imagini. Miniaturile și vizualizatorul lightbox se încarcă direct în panoul de detalii.
  • Filtre, vizualizări și activitate: Filtrați după responsabil, prioritate sau etichetă. Comutați între vizualizările Kanban, Listă și Tabel. Fiecare modificare este consemnată în jurnalul de activitate al sarcinii.
Socket.IO@dnd-kitTanStack QueryTipTapFractional Indexing
03Comunicare în echipă

Camera de chat

Un strat complet de mesagerie live, integrat în aceeași fereastră cu sarcinile dumneavoastră. Canale de proiect, mesaje directe, partajare de fișiere și reacții cu emoji — totul difuzat în sub 100 ms.

  • Canale de proiect: Fiecare proiect primește propriul canal dedicat. Contextul rămâne lângă tablou, nu într-o aplicație separată.
  • Mesaje directe: Conversații private între două persoane cu orice membru al spațiului de lucru — căsuță separată, aceeași livrare în timp real.
  • Indicatori de scriere: Vedeți când colegii redactează un răspuns — semnale efemere care fac comunicarea asincronă să pară live.
  • Prezență online: Stare online/absent în timp real lângă avatarul fiecărui membru, în bara laterală și în firele de mesaje.
  • Reacții cu emoji: Reacționați la orice mesaj cu emoji. Contoarele se actualizează live pentru toți cei din cameră.
  • Partajare de fișiere și imagini: Trageți atașamente în orice mesaj. Imaginile se deschid într-un lightbox. Insignele pentru mesaje necitite și alertele de notificare țin echipa sincronizată.
Redis 7NestJS GatewaySocket.IOMotor de prezențăPub/Sub
04Stocare de fișiere

Unitatea echipei

O bibliotecă comună de fișiere a spațiului de lucru, alături de tablouri și chat — încărcați, previzualizați și organizați resursele echipei fără a părăsi aplicația. Fișierele atașate sarcinilor și mesajelor se află și ele aici.

  • Biblioteca de fișiere a spațiului de lucru: Fiecare fișier încărcat în spațiul de lucru — atașamente ale sarcinilor, media din chat, încărcări independente — apare într-o singură unitate organizată.
  • Comutare grilă și listă: Treceți de la o grilă vizuală de miniaturi la o vizualizare compactă, listă, cu coloane de metadate.
  • Încărcare prin drag-and-drop: Plasați fișierele oriunde în panoul unității pentru a le încărca. Indicatori de progres și generare instantanee a miniaturilor la final.
  • Previzualizare și descărcare: Faceți clic pe orice fișier pentru a deschide o fereastră completă de previzualizare, cu lightbox pentru imagini. Descărcare dintr-un singur clic.
  • Acces limitat la spațiul de lucru: Fișierele sunt private pentru fiecare spațiu de lucru. Accesul bazat pe roluri asigură că doar membrii autorizați pot vedea sau descărca resursele sensibile.
MinIOCompatibil S3Presigned UploadsCloudflare R2
// 03. Arhitectură și topologie

Arhitectura monorepo distribuită

Containere decuplate, orchestrate pentru înaltă disponibilitate și sincronizare cu latență redusă

topology.ascii
                      [ Client Browser / Mobile Web ]
                                     │
                                     │ HTTPS / WSS (TLS Termination)
                                     ▼
         ┌───────────────────────────────────────────────────────────┐
         │           Reverse Proxy & Edge Ingress (NGINX)            │
         │            Routes *.crwsync.xyz with SSL & Gzip           │
         └──────────────┬─────────────────────────────┬──────────────┘
                        │                             │
        ┌───────────────┴───────────────┐             │
        ▼                             ▼            ▼
    ┌───────────────────────┐   ┌───────────────────────┐   ┌───────────────────────────┐
    │     @crwsync/web      │   │     @crwsync/dash     │   │     @crwsync/backend      │
    │   (Next.js 16 SSR)    │   │   (Next.js 16 SPA)    │   │        (NestJS 11)        │
    │   crwsync.xyz:3000    │   │ dash.crwsync.xyz:3001 │   │    api.crwsync.xyz:4000   │
    │   • Marketing Portal  │   │   • Kanban Viewport   │   │  • REST API Controllers   │
    │   • Auth Redirection  │   │   • Live Chat Panels  │   │  • Socket.IO Gateways     │
    │   • Static Docs/Legal │   │   • Zustand State     │   │  • Dual-Layer RBAC Guards │
    └───────────────────────┘   └───────────┬───────────┘   │  • BullMQ Queue Producers │
                                            │               └─────────────┬─────────────┘
                                            │ REST / WSS Events           │
                                            └─────────────────────────────┘
                                                          │
                           ┌──────────────────────────────┴──────────────────────────────┐
                           │                                                             │
                           ▼                                                           ▼
           ┌───────────────────────────────┐                             ┌───────────────────────────────┐
           │     PostgreSQL Relational     │                             │        Redis 7 In-Memory      │
           │       Database Instance       │                             │      Pub/Sub & Queue Broker   │
           ├───────────────────────────────┤                             ├───────────────────────────────┤
           │ • Prisma 7 ORM Data Modeling  │                             │ • Socket.IO Redis Adapter     │
           │ • Relational Integrity & ACID │                             │ • BullMQ Worker Queue State   │
           │ • Scoped Multi-Tenant Tables  │                             │ • Ephemeral User Presence     │
           │ • Indexed Foreign Keys & DTOs │                             │ • Real-time Typing Streams    │
           └───────────────────────────────┘                             └───────────────────────────────┘
                           ▲                                                           ▲
                           │                                                             │
                           └──────────────────────────────┬──────────────────────────────┘
                                                          │
                                                          ▼
                           ┌─────────────────────────────────────────────────────────────┐
                           │               Docker Swarm Orchestration Engine             │
                           │   • Stack Compose Deployment (`stack.yml`)                  │
                           │   • Isolated Virtual Overlay Network (`crwsync_net`)        │
                           │   • Automated Container Health Checks & Zero-Downtime Rolls │
                           │   • Memory Hard Limits & Restart Policies (512MB/service)   │
                           └─────────────────────────────────────────────────────────────┘

Matricea deciziilor tehnice și a justificărilor

Compromisurile arhitecturale de bază care susțin stabilitatea, viteza de dezvoltare și scalabilitatea orizontală

Strat și domeniuAlegerea tehnologicăCapabilități-cheie și justificare
Build și dezvoltare
Motorul monorepo
Turborepo + pnpm workspaces

Commit-uri atomice, configurări partajate, build-uri cu cache

Permite configurări TypeScript unificate, preseturi ESLint partajate și cache instantaneu al pipeline-ului de sarcini între @crwsync/backend, @crwsync/dash și @crwsync/web, reducând în același timp balonarea dependențelor prin izolare strictă cu legături simbolice.
API de bază
Framework de server
NestJS 11 (TypeScript)

DI modular strict, DTO-uri tipizate, protecții RBAC personalizate

Arhitectură enterprise, cu injecție declarativă a dependențelor, sanitizare a datelor de intrare cu class-validator și protecții de execuție componibile, care impun RBAC pe două niveluri atât în controlerele REST, cât și în gateway-urile Socket.IO.
Frontend
Framework de client
Next.js 16 + React 19

Componente de server, primitive Radix UI, Tailwind CSS v4

Combină paginile de prezentare randate pe server, extrem de rapide (@crwsync/web), cu un shell de aplicație client-side interactiv, accesibil și cu stare (@crwsync/dash), optimizat pentru un răspuns al interfeței sub 100 ms.
Timp real
Stratul în timp real
Socket.IO + Redis 7 Pub/Sub

Scalare orizontală WebSocket între replicile Swarm

Separă difuzările efemere din socket-uri de tranzacțiile relaționale din baza de date. Adaptorul Redis distribuie difuzările pe camere între mai multe replici NestJS, fără pierderi de pachete.
Fundal
Procesare asincronă
BullMQ + Redis 7

Cozi de joburi tranzacționale decuplate, cu reîncercări și backoff

Izolează joburile grele de fundal (randarea e-mailurilor cu Handlebars, trimiterea token-urilor de invitație, generarea rezumatelor) de firele HTTP, prin politici configurabile de reîncercare exponențială și cozi dead-letter.
Persistență
Bază de date
PostgreSQL 16 + Prisma 7

Driver @prisma/adapter-pg, integritate relațională

Garantează tranzacții ACID stricte pentru organizații, proiecte, tablouri și coloane de sarcini multi-tenant. Folosește driverul performant @prisma/adapter-pg, cu migrări automate ale schemei.
Stocare
Stocare de obiecte
MinIO (dev) + compatibil S3 (prod)

Încărcări presigned, acces limitat la spațiul de lucru

Deservește avatarele, atașamentele sarcinilor, media din chat și modulul dedicat Fișiere al spațiului de lucru. Ruta publică a avatarelor rămâne deschisă, în timp ce rutele fișierelor din spațiul de lucru rămân protejate prin autentificare, deoarece atașamentele sunt private pentru un spațiu de lucru.
DevOps
Orchestrare
Docker Swarm

stack.yml declarativ, actualizări rolling fără întrerupere, limite de memorie

Orchestrare ușoară a containerelor prin daemonul Docker nativ, fără povara Kubernetes. Oferă rețele overlay izolate, verificări automate de stare, implementări rolling fără întrerupere și plafoane de 512 MB RAM.
// 02b. Sub capotă

Construit pentru colaborare de înaltă frecvență

Patru capabilități de bază, decuplate între client și server

// 01 • Sincronizarea stării și UI optimist

Motor Kanban în timp real

Fluxuri interactive de sarcini cu drag-and-drop, cu reordonare prin indexare fracționară, mutații optimiste în client și difuzare instantanee a evenimentelor către mai mulți clienți.

  • Difuzare Socket.IO: Actualizările multi-tenant ale coloanelor și cardurilor sunt difuzate instantaneu către camerele active ale proiectelor.
  • Indexare fracționară: Reordonare a elementelor în O(1) între carduri, fără actualizări costisitoare în cascadă în baza de date.
  • UI optimist: Rollback al cache-ului TanStack Query dacă erorile de rețea întrerup persistența pe server.
  • Indicatori multi-utilizator: Marcaje vizuale de prezență atunci când colegii consultă sau modifică sarcini în coloană.
  • Liste de verificare și comentarii: Liste de verificare pentru subsarcini cu insigne de progres și comentarii pe fire de discuție cu @mențiuni, pentru fiecare sarcină.
  • Filtre, vizualizări și jurnal de activitate: Filtre după responsabil/prioritate/etichetă, comutator de vizualizare Listă/Tabel și un istoric cronologic al activității pentru fiecare sarcină.
  • Socket.IO
  • @dnd-kit
  • TanStack Query
  • TipTap
  • Fractional Indexing
// 02 • Comunicare prin WebSocket

Mesagerie live pe canale și mesaje directe

O arhitectură persistentă de mesagerie pe camere, care alimentează canalele publice de proiect, discuțiile pe fire legate de sarcini și conversațiile directe între două persoane.

  • Camere socket persistente: Ciclu dinamic de intrare/ieșire din camere, gestionat pentru fiecare proiect și canal de mesagerie directă.
  • Strat Redis Pub/Sub: Mesagerie WebSocket scalabilă orizontal între instanțe NestJS distribuite.
  • Prezență și indicatori: Urmărirea în timp real a stării online/absent a utilizatorilor și indicatori efemeri de scriere.
  • Confirmări de citire și insigne: Urmărire asincronă a mesajelor necitite și sincronizare instantanee a notificărilor în client.
  • Reacții și partajare de fișiere: Reacții cu emoji și contoare live, atașamente cu drag-and-drop și previzualizări lightbox, plus alerte de notificare persistente.
  • Redis 7
  • NestJS Gateway
  • Motor de prezență
  • Pub/Sub
  • Reacții emoji
// 03 • Securitate și autorizare

Controlul accesului pe roluri la nivel de spațiu de lucru

Un singur sistem de roluri, strict ierarhic — Proprietar, Administrator, Membru, Invitat — controlează fiecare acțiune din spațiul de lucru, de la stratul de protecție al API-ului până la interfață, cu administrare în regim self-service pentru promovare, retrogradare și transferul proprietății.

  • Roluri ierarhice: Niveluri OWNER, ADMIN, MEMBER și GUEST, atribuite pe spațiu de lucru și aplicate la fiecare mutație.
  • Guards și decoratori NestJS: Guards declarative @RequireWorkspaceRoles(), evaluate pentru fiecare endpoint REST și gateway WebSocket.
  • Restricționarea pe roluri în frontend: Controalele administrative, precum eliminarea unui membru, ștergerea unei coloane și ștergerea unui proiect, apar doar pentru rolurile autorizate.
  • Fluxuri de invitare și de transfer al proprietății: Invitații cu rol atribuit, promovarea și retrogradarea membrilor și transfer complet al proprietății din setările spațiului de lucru.
  • Guards NestJS
  • RBAC la nivel de spațiu de lucru
  • JWT + HttpOnly Cookies
  • Administrarea rolurilor
// 04 • Stocare și media

Fișiere, atașamente și stocare media

Stocare de obiecte compatibilă S3, care alimentează o unitate dedicată de fișiere a echipei, atașamentele sarcinilor și media din chat — închizând cercul sincronizării sarcinilor, conversațiilor și fișierelor într-un singur loc.

  • Încărcări presigned: MinIO în dezvoltarea locală, stocare compatibilă S3 în producție, cu URL-uri presigned pentru încărcări directe din client.
  • Modulul Fișiere al spațiului de lucru: O unitate dedicată de fișiere pentru fiecare spațiu de lucru, cu vizualizări grilă/listă, previzualizări și descărcări, alături de tablouri și chat.
  • Atașamente la sarcini și în chat: Încărcări cu drag-and-drop pe sarcini și în chat, cu previzualizări sub formă de miniaturi și un lightbox pentru imagini.
  • Acces limitat la spațiul de lucru: Rutele pentru fișiere și avatare sunt protejate prin autentificare și limitate la spațiul de lucru, spre deosebire de endpointul public pentru avatare.
  • MinIO
  • Stocare compatibilă S3
  • Încărcări presigned
  • Camere de fișiere
// 04. Provocări și obstacole

Obstacole de inginerie și soluții

Principalele obstacole întâlnite în orchestrarea în timp real cu concurență ridicată

// 01 • Concurență în timp real

Condiții de cursă și drag-and-drop concurent

Obstacolul

Reordonarea simultană a sarcinilor de pe mai mulți clienți, cu indexare naivă prin numere întregi (1, 2, 3...), declanșa actualizări SQL în cascadă, blocaje și condiții de cursă în care cardurile își schimbau poziția.

Rezolvarea

Am implementat indexarea fracționară Lexorank pe șiruri, împreună cu blocarea optimistă prin Redis. Mutarea unui card calculează rangul exact de la mijloc în timp O(1), fără a modifica rândurile vecine, iar actualizările sunt difuzate instantaneu prin Socket.IO.

Impact: Zero blocări de rânduri în baza de date, reconciliere instantanee a UI-ului optimist și mutații ale tablourilor fără conflicte între mai mulți utilizatori.

  • Lexorank
  • Blocări Redis
  • Indexare fracționară
  • Reordonare O(1)
// 02 • Autentificare și securitate

Izolarea sesiunilor pe mai multe domenii și handshake-uri WSS

Obstacolul

Monorepo-ul se întinde pe crwsync.xyz, dash.crwsync.xyz și api.crwsync.xyz. Stocarea token-urilor în localStorage expunea autentificarea la XSS, în timp ce cookie-urile standard nu funcționau între subdomenii și nici la verificarea upgrade-ului WebSocket.

Rezolvarea

Am configurat cookie-uri de sesiune semnate criptografic, HttpOnly, SameSite=Lax, cu domeniul Domain=.crwsync.xyz, în spatele terminării TLS din NGINX. Gateway-urile WebSocket NestJS inspectează și validează cookie-ul de sesiune în timpul handshake-ului inițial de upgrade HTTP.

Impact: Am eliminat expunerea token-urilor către scripturile din client, am activat SSO fluent între subdomenii și am securizat conexiunile socket în timp real.

  • Cookie-uri HttpOnly
  • Delimitarea domeniului
  • Handshake WSS
  • Atenuarea XSS
// 03 • DevOps și infrastructură

Saturarea memoriei containerelor și lansări fără întrerupere

Obstacolul

Imaginile Docker ale monorepo-ului depășeau 1,5 GB, cu vârfuri de memorie în timpul SSR și al compilării, ceea ce risca oprirea prin OOM în producție și întreruperea conexiunilor WebSocket active în timpul implementărilor.

Rezolvarea

Am creat Dockerfile-uri multi-stage cu Turborepo prune (turbo prune --scope=<app> --docker), reducând dimensiunea imaginii sub 120 MB. Am orchestrat serviciile Swarm cu limite stricte de memorie de 512 MB și actualizări rolling (parallelism: 1, start-first order).

Impact: Reducere cu 90% a dimensiunii imaginii, consum de RAM strict limitat și implementări rolling fluide, fără întrerupere, cu zero conexiuni socket pierdute.

  • Turbo Prune
  • Docker Swarm
  • Actualizări rolling
  • Plafon RAM de 512 MB
// 05. Stack tehnologic

Matricea arhitecturii full-stack

Defalcare completă, strat cu strat, a bibliotecilor, driverelor și framework-urilor

Monorepo
  • Turborepo
  • pnpm workspaces
  • TypeScript
Frontend și UI
  • Next.js 16
  • React 19
  • Tailwind CSS v4
  • Radix UI
  • @dnd-kit
  • TipTap
Backend și API
  • NestJS 11
  • Prisma 7
  • PostgreSQL 16
  • @prisma/adapter-pg
Timp real și WSS
  • Socket.IO
  • Redis 7 (adaptor Pub/Sub)
Cozi de fundal
  • BullMQ
  • Broker Redis
Stocare și media
  • MinIO (local)
  • Cloudflare R2 (prod)
Stare în client
  • Zustand
  • TanStack Query v5
Autentificare și securitate
  • Passport.js (JWT/Local)
  • bcrypt
  • Cookie-uri HttpOnly
Comunicații
  • Nodemailer
  • Șabloane Handlebars
Localizare
  • Pachet i18n partajat
  • Engleză
  • Spaniolă
DevOps și implementare
  • Docker
  • Docker Swarm
  • NGINX Reverse Proxy
  • GitHub Actions
  • Sentry
  • Playwright E2E
// 06. Rulare locală și evaluare

Încercați live și reproduceți local

Portalul web de la crwsync.xyz este activ în producție. Panoul aplicației se află în spatele autentificării bazate pe sesiune și al protecțiilor multi-tenant la nivel de organizație, așa că datele de autentificare demo nu sunt publicate — contactați-mă direct pentru o prezentare interactivă.

Întregul cod sursă al monorepo-ului este public, pentru revizuirea portofoliului și evaluarea tehnică. Puteți rula local întregul stack decuplat: Docker Compose furnizează PostgreSQL, Redis și MinIO, iar Turborepo pornește API-ul NestJS și ambele aplicații Next.js.

local-setup.sh
# 1. Clone monorepo and install dependencies
git clone https://github.com/JustTunya/crwsync.git
cd crwsync
pnpm install

# 2. Start local infrastructure (PostgreSQL, Redis, MinIO)
docker compose -f docker-compose.dev.yml up -d

# 3. Configure environment variables (fill in secrets, see README)
cp apps/backend/.env.example apps/backend/.env
cp apps/frontend/dash/.env.example apps/frontend/dash/.env
cp apps/frontend/web/.env.example apps/frontend/web/.env

# 4. Generate Prisma client, run migrations, seed demo workspace (optional)
pnpm --filter @crwsync/backend run prisma:generate
pnpm --filter @crwsync/backend run prisma:migrate:dev
pnpm seed

# 5. Start web, dashboard and API via Turborepo
pnpm dev
# Marketing Portal: http://localhost:3000
# App Dashboard:    http://localhost:3001
# Backend API:      http://localhost:8080

Informări privind evaluarea și detalii despre simulare

  • Date simulate ale spațiului de lucru: Echipele, proiectele, sarcinile Kanban și canalele de chat din demo-ul de producție sunt date de test încărcate în prealabil, pentru a proteja confidențialitatea evaluării.
  • Motor live în timp real: Gateway-ul WebSocket, magistrala Redis 7 Pub/Sub, API-ul NestJS și baza de date PostgreSQL rulează live pe infrastructură de producție containerizată, cu propagare reală a evenimentelor.
  • Licența PolyForm Noncommercial: Codul sursă este vizibil public pentru studiu, învățare și revizuirea portofoliului, conform PolyForm Noncommercial License 1.0.0 — utilizarea comercială necesită o licențiere separată.

Descoperiți crwsync în acțiune

Accesibil public pentru evaluare tehnică, revizuirea codului și analiza arhitecturii.