Source: https://seerepo.com/r/element-hq/element-web/built
Markdown source: https://seerepo.com/r/element-hq/element-web/built.md
Description: element-web is a TypeScript repo built with Electron, React, Express, and Vite. It signs people in with @peculiar/webcrypto and zxcvbn-ts.

# What is element-web built with?

element-web is a TypeScript repo built with Electron, React, Express, and Vite. It signs people in with @peculiar/webcrypto and zxcvbn-ts, measures its use with PostHog, watches its errors with Sentry, makes its content with html-react-parser, escape-html, highlight.js, html-entities, pdfjs-dist, and 11 more, validates its data with Zod, is tested with Vitest, memfs, @playwright/test, Testing Library, vitest-canvas-mock, and 4 more, and uses electron-store. It has 500,790 written lines, with 1,252 test files.

Read on November 9, 2026, at commit abe9fbc.

Repository: https://github.com/element-hq/element-web

## Backend (apps/desktop)

### Data

- **[electron-store](https://seerepo.com/uses/electron-store)**: 1 file

### Services

- **[Sentry](https://seerepo.com/uses/sentry)**: 1 file · [apps/web/src/sentry.ts, line 9](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/apps/web/src/sentry.ts#L9)

## Support (apps/desktop)

### The base

- **[Electron](https://seerepo.com/uses/electron)**: 23 files

### Testing

- **Vitest**: 21 files
- **memfs**: 6 files
- **@playwright/test**: 1 file

### Tools

- **app-builder-lib**: 1 file
- **electron-builder**: 1 file
- **electron-devtools-installer**: 1 file
- **png-to-ico**: 1 file

### Other

- **auto-launch**: 1 file
- **electron-window-state**: 1 file
- **minimist**: 1 file
- **uuid**: 1 file

## Frontend (apps/web)

### The base

- **[React](https://seerepo.com/uses/react)**: 776 files · [in modules/banner/package.json](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/modules/banner/package.json)

### Styles

- **[classnames](https://seerepo.com/uses/classnames)**: 149 files
- **[fontsource](https://seerepo.com/uses/fontsource)**: 2 files

### Interface

- **[MapLibre](https://seerepo.com/uses/maplibre)**: 6 files
- **react-focus-lock**: 4 files
- **[re-resizable](https://seerepo.com/uses/re-resizable)**: 3 files
- **react-beautiful-dnd**: 2 files
- **react-blurhash**: 1 file
- **[react-transition-group](https://seerepo.com/uses/react-transition-group)**: 1 file

## Backend (apps/web)

### The base

- **[Express](https://seerepo.com/uses/express)**: 1 file

### Sign-in

- **@peculiar/webcrypto**: 3 files
- **zxcvbn-ts**: 2 files

### Services

- **[Sentry](https://seerepo.com/uses/sentry)**: 2 files · [apps/web/src/sentry.ts, line 9](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/apps/web/src/sentry.ts#L9)
- **[PostHog](https://seerepo.com/uses/posthog)**: 1 file · [apps/web/src/PosthogAnalytics.ts, line 9](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/apps/web/src/PosthogAnalytics.ts#L9)

## Support (apps/web)

### Content

- **html-react-parser**: 6 files
- **[escape-html](https://seerepo.com/uses/escape-html)**: 4 files
- **[highlight.js](https://seerepo.com/uses/highlightjs)**: 3 files
- **[html-entities](https://seerepo.com/uses/html-entities)**: 3 files
- **[pdfjs-dist](https://seerepo.com/uses/pdfjs-dist)**: 3 files
- **blurhash**: 2 files
- **commonmark**: 2 files
- **domutils**: 2 files
- **[katex](https://seerepo.com/uses/katex)**: 2 files
- **[yaml](https://seerepo.com/uses/yaml)**: 2 files
- **jsqr**: 1 file
- **png-chunks-extract**: 1 file
- **[qrcode](https://seerepo.com/uses/qrcode)**: 1 file
- **[sanitize-filename](https://seerepo.com/uses/sanitize-filename)**: 1 file
- **[sanitize-html](https://seerepo.com/uses/sanitize-html)**: 1 file

### Testing

- **Vitest**: 826 files
- **Testing Library**: 123 files
- **@playwright/test**: 69 files
- **vitest-canvas-mock**: 7 files
- **playwright-core**: 6 files
- **testcontainers**: 5 files
- **fake-indexeddb**: 2 files

### Tools

- **Webpack**: 2 files
- **browserslist**: 1 file
- **css-tree**: 1 file

### Other

- **Matrix**: 827 files
- **Lodash**: 59 files
- **events**: 20 files
- **file-saver**: 3 files
- **emojibase-regex**: 2 files
- **memoize-one**: 2 files
- **opus-recorder**: 2 files
- **rfc4648**: 2 files
- **ua-parser-js**: 2 files
- **await-lock**: 1 file
- **diff-match-patch**: 1 file
- **filesize**: 1 file
- **glob-to-regexp**: 1 file
- **is-ip**: 1 file
- **jsrsasign**: 1 file
- **jszip**: 1 file
- **mime**: 1 file
- **pako**: 1 file
- **react-string-replace**: 1 file
- **what-input**: 1 file

## Frontend (modules/banner)

### The base

- **[Vite](https://seerepo.com/uses/vite)**: [in modules/banner/package.json](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/modules/banner/package.json)
- **[React](https://seerepo.com/uses/react)**: 5 files · [in modules/banner/package.json](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/modules/banner/package.json)

### Styles

- **[styled-components](https://seerepo.com/uses/styled-components)**: 5 files

### Interface

- **[motion](https://seerepo.com/uses/motion)**: 1 file
- **[Radix UI](https://seerepo.com/uses/radix-ui)**: 1 file

## Support (modules/banner)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 3 files

### Testing

- **Vitest**: 6 files
- **Testing Library**: 5 files

## Frontend (modules/restricted-guests)

### The base

- **[Vite](https://seerepo.com/uses/vite)**: [in modules/banner/package.json](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/modules/banner/package.json)
- **[React](https://seerepo.com/uses/react)**: 3 files · [in modules/banner/package.json](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/modules/banner/package.json)

### Styles

- **[styled-components](https://seerepo.com/uses/styled-components)**: 3 files

## Support (modules/restricted-guests)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Testing

- **testcontainers**: 1 file
- **Vitest**: 1 file

## Support (modules/widget-lifecycle)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Testing

- **Vitest**: 4 files
- **@playwright/test**: 1 file

## Frontend (modules/widget-toggles)

### The base

- **[Vite](https://seerepo.com/uses/vite)**: [in modules/banner/package.json](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/modules/banner/package.json)
- **[React](https://seerepo.com/uses/react)**: 2 files · [in modules/banner/package.json](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/modules/banner/package.json)

### Styles

- **[styled-components](https://seerepo.com/uses/styled-components)**: 1 file

## Support (modules/widget-toggles)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Testing

- **Vitest**: 5 files
- **Testing Library**: 3 files
- **@playwright/test**: 1 file

## Support (packages/eslint-plugin-element-web)

### Testing

- **Vitest**: 6 files

### Tools

- **oxlint**: 1 file

## Frontend (packages/module-api)

### The base

- **[React](https://seerepo.com/uses/react)**: 8 files · [in modules/banner/package.json](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/modules/banner/package.json)
- **[Vite](https://seerepo.com/uses/vite)**: 1 file · [in modules/banner/package.json](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/modules/banner/package.json)

## Support (packages/module-api)

### Testing

- **Vitest**: 3 files

### Tools

- **rollup-plugin-external-globals**: 1 file

### Other

- **SemVer**: 1 file

## Support (packages/playwright-common)

### Content

- **[yaml](https://seerepo.com/uses/yaml)**: 2 files

### Testing

- **@playwright/test**: 18 files
- **testcontainers**: 7 files
- **Vitest**: 4 files
- **playwright-core**: 3 files
- **@axe-core/playwright**: 2 files

### Tools

- **glob**: 1 file

### Other

- **Lodash**: 1 file
- **strip-ansi**: 1 file

## Frontend (packages/shared-components)

### The base

- **[React](https://seerepo.com/uses/react)**: 158 files · [in modules/banner/package.json](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/modules/banner/package.json)

### Styles

- **[classnames](https://seerepo.com/uses/classnames)**: 75 files

### Interface

- **[react-virtuoso](https://seerepo.com/uses/react-virtuoso)**: 6 files
- **[dnd-kit](https://seerepo.com/uses/dnd-kit)**: 4 files
- **[react-resizable-panels](https://seerepo.com/uses/react-resizable-panels)**: 4 files
- **react-blurhash**: 2 files
- **linkify-react**: 1 file
- **[TanStack](https://seerepo.com/uses/tanstack)**: 1 file

## Support (packages/shared-components)

### Content

- **html-react-parser**: 2 files
- **linkify-html**: 1 file

### Testing

- **Vitest**: 124 files
- **Testing Library**: 58 files

### Tools

- **Storybook**: 2 files

### Other

- **react-merge-refs**: 5 files
- **Lodash**: 4 files
- **events**: 1 file
- **linkifyjs**: 1 file
- **temporal-polyfill**: 1 file

## Support (packages/shared-utils)

### Content

- **[sanitize-html](https://seerepo.com/uses/sanitize-html)**: 1 file

### Testing

- **Vitest**: 4 files

## Other repos with a similar stack

- [CherryHQ/cherry-studio](https://seerepo.com/r/CherryHQ/cherry-studio/built): electron-store, Sentry, Electron, React, PostHog, Vite, pdfjs-dist, katex, yaml, qrcode, motion, Radix UI, Zod, dnd-kit, react-resizable-panels, TanStack · [Compare](https://seerepo.com/compare/CherryHQ/cherry-studio/vs/element-hq/element-web)
- [usebruno/bruno](https://seerepo.com/r/usebruno/bruno/built): electron-store, Electron, React, Express, PostHog, classnames, escape-html, highlight.js, pdfjs-dist, yaml, styled-components, Zod, react-virtuoso · [Compare](https://seerepo.com/compare/element-hq/element-web/vs/usebruno/bruno)
- [chatboxai/chatbox](https://seerepo.com/r/chatboxai/chatbox/built): electron-store, Sentry, Electron, React, Vite, pdfjs-dist, sanitize-filename, Radix UI, Zod, react-virtuoso, dnd-kit, TanStack · [Compare](https://seerepo.com/compare/chatboxai/chatbox/vs/element-hq/element-web)
- [ToolJet/ToolJet](https://seerepo.com/r/ToolJet/ToolJet/built): Sentry, React, Express, PostHog, classnames, react-beautiful-dnd, qrcode, sanitize-html, Radix UI, react-virtuoso, dnd-kit, TanStack · [Compare](https://seerepo.com/compare/element-hq/element-web/vs/ToolJet/ToolJet)
- [anomalyco/opencode](https://seerepo.com/r/anomalyco/opencode/built): Sentry, Electron, React, Vite, commonmark, katex, yaml, jsqr, Zod, dnd-kit, TanStack · [Compare](https://seerepo.com/compare/anomalyco/opencode/vs/element-hq/element-web)
- [multica-ai/multica](https://seerepo.com/r/multica-ai/multica/built): Electron, React, PostHog, katex, yaml, motion, Zod, react-virtuoso, dnd-kit, react-resizable-panels, TanStack · [Compare](https://seerepo.com/compare/element-hq/element-web/vs/multica-ai/multica)

## Frequently asked questions

### What language is element-web written in?

element-web is written in TypeScript, with 500,790 written lines.

### What framework does element-web use?

element-web is built with Electron, React, Express, and Vite.

### What does element-web sign people in with?

element-web signs people in with @peculiar/webcrypto and zxcvbn-ts.

### What services does element-web use?

element-web measures its use with PostHog, watches its errors with Sentry, and uses electron-store.

The proof: [apps/web/src/PosthogAnalytics.ts, line 9](https://github.com/element-hq/element-web/blob/abe9fbc07bf3a57265b1d3f25ebe917e15a0c4f4/apps/web/src/PosthogAnalytics.ts#L9)

### Does element-web have tests?

Yes. element-web has 1,252 test files and is tested with Vitest, memfs, @playwright/test, Testing Library, vitest-canvas-mock, playwright-core, testcontainers, fake-indexeddb, and @axe-core/playwright.

### Which repos have a stack like element-web's?

The ones that share most of its stack: CherryHQ/cherry-studio, usebruno/bruno, and chatboxai/chatbox.

## What is your repo built with?

Any public repo, with no account: https://seerepo.com/r/owner/repo/built, with the owner and name it has on GitHub.
