Open-source corporate messenger built on the Zulip API.
Single React codebase, multiple targets:
- Web SPA
- PWA
- Electron desktop app (Windows, macOS, Linux)
- Embedded WebView shell (mobile hosts)
- React 19 + TypeScript 5.9 (
strict,noUncheckedIndexedAccess) - Feature-Sliced Design (FSD):
app -> pages -> widgets -> features -> entities -> shared - Zustand domain stores + API middleware pipeline
- Tailwind design tokens (dark/light + multiple palettes)
- i18n (English + Russian)
- 3800+ tests (Vitest + Testing Library + MSW + Playwright)
- Security-focused defaults: CSP, sanitization, guarded APIs, secret checks in hooks
- Node.js 22+
- npm 10+
Use .nvmrc:
nvm usegit clone https://github.com/exordos/workspace_ui.git
cd workspace_ui
npm install
cp packages/web/.env.example packages/web/.env
npm run dev:webDefault app URL: http://localhost:5173
| Command | Purpose |
|---|---|
npm run dev:web |
Web app in Vite dev mode |
npm run dev:electron |
Web + Electron desktop shell |
npm run dev |
Monorepo dev mode (parallel) |
npm run check |
Typecheck + lint + tests |
npm run test |
Unit/integration tests |
npm run e2e |
Playwright E2E |
npm run lint |
ESLint |
npm run typecheck |
TypeScript checks |
npm run package:electron |
Build desktop package (current OS) |
Workspace UI uses Feature-Sliced Design with strict downward dependencies:
app -> pages -> widgets -> features -> entities -> shared
Core flow:
main.tsxmounts the app shell and routeswidgets/layout/layout-zulip-event-loop.hook.ts+shared/lib/event-loop.tsstart Zulip event queue pollingshared/api/client.tshandles auth/logging/retry middleware- Entity stores (
entities/*) provide domain state - UI subscribes through minimal selectors
workspace_ui/
├── packages/
│ ├── web/ React SPA
│ ├── electron/ Electron shell
├── docs/ Technical docs + ADRs
├── e2e/ Playwright tests
├── scripts/ Tooling utilities
└── .cursor/ Agent rules, skills, prompts
AGENTS.md— architecture and coding standards for AI/dev workflowsCONTRIBUTING.md— contribution process and quality gatesSECURITY.md— vulnerability reporting processCHANGELOG.md— release historyCODE_OF_CONDUCT.md— community guidelines
docs/PROJECT_FACTS.mddocs/fsd-architecture.mddocs/STORES_REFERENCE.mddocs/API_CLIENT_REFERENCE.mddocs/COMPONENT_CATALOG.mddocs/INTEGRATION_GUIDE.mddocs/USE_CASES.mddocs/MACOS_SIGNING.mddocs/SECURITY_ARCHITECTURE.md
- Import concrete segment files (
*.model.ts,*.api.ts,*.ui.tsx) — no barrel-onlyindex.ts - No hardcoded UI strings (
t("key")for all user-facing text) - No hardcoded brand values (use
brand.*) - No
console.login app code (use logger) - Sanitize untrusted HTML before render
- Add or adjust tests for behavior changes
- Run
npm run checkbefore commit
Project license: Apache 2.0.
Contributions are welcome via pull requests and issues. Start from CONTRIBUTING.md.