Source: https://seerepo.com/r/plankanban/planka/built
Markdown source: https://seerepo.com/r/plankanban/planka/built.md
Description: planka is a JavaScript repo built with React, React Router, Vite, and history. It stores its data in Postgres and reaches it with knex.

# What is planka built with?

planka is a JavaScript repo built with React, React Router, Vite, and history. It stores its data in Postgres, reaches it with knex, signs people in with zxcvbn, jwt-decode, bcrypt, otplib, and jsonwebtoken, stores files in AWS S3, makes its content with highlight.js, papaparse, qrcode.react, sharp, escape-html, and 2 more, validates its data with prop-types and validator, is tested with Cucumber, playwright, Chai, and supertest, deploys with winston, and uses @aws-sdk/lib-storage. It has 129,073 written lines, with 19 test files.

Read on November 10, 2026, at commit 2cf4238.

Repository: https://github.com/plankanban/planka

## Frontend (client)

### The base

- **[React](https://seerepo.com/uses/react)**: 260 files · [in client/package.json](https://github.com/plankanban/planka/blob/2cf423824a09f84df7dc3acf0ded9a700292d882/client/package.json)
- **[React Router](https://seerepo.com/uses/react-router)**: 10 files
- **[Vite](https://seerepo.com/uses/vite)**: 1 file · [in client/package.json](https://github.com/plankanban/planka/blob/2cf423824a09f84df7dc3acf0ded9a700292d882/client/package.json)

### Styles

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

### Interface

- **semantic-ui-react**: 188 files
- **[react-beautiful-dnd](https://seerepo.com/uses/react-beautiful-dnd)**: 20 files
- **[react-textarea-autosize](https://seerepo.com/uses/react-textarea-autosize)**: 9 files
- **[react-hot-toast](https://seerepo.com/uses/react-hot-toast)**: 5 files
- **[react-intersection-observer](https://seerepo.com/uses/react-intersection-observer)**: 5 files
- **react-photoswipe-gallery**: 4 files
- **[react-datepicker](https://seerepo.com/uses/react-datepicker)**: 3 files
- **[react-dropzone](https://seerepo.com/uses/react-dropzone)**: 2 files
- **react-frame-component**: 2 files
- **react-mentions**: 2 files
- **linkify-react**: 1 file
- **photoswipe**: 1 file
- **react-input-mask**: 1 file

## Backend (client)

### Sign-in

- **[zxcvbn](https://seerepo.com/uses/zxcvbn)**: 2 files
- **[jwt-decode](https://seerepo.com/uses/jwt-decode)**: 1 file

## Support (client)

### The base

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

### Content

- **[highlight.js](https://seerepo.com/uses/highlightjs)**: 1 file
- **[papaparse](https://seerepo.com/uses/papaparse)**: 1 file
- **[qrcode.react](https://seerepo.com/uses/qrcodereact)**: 1 file

### Validation

- **[prop-types](https://seerepo.com/uses/prop-types)**: 169 files
- **[validator](https://seerepo.com/uses/validator)**: 5 files

### Testing

- **Cucumber**: 3 files
- **playwright**: 3 files

### Tools

- **highlightjs-cobol**: 1 file
- **highlightjs-sap-abap**: 1 file

### Other

- **react-redux**: 180 files
- **react-i18next**: 175 files
- **Redux-Saga**: 67 files
- **Lodash**: 41 files
- **date-fns**: 36 files
- **javascript-time-ago**: 35 files
- **dequal**: 16 files
- **Redux**: 3 files
- **@juggle/resize-observer**: 1 file
- **i18next**: 1 file
- **i18next-browser-languagedetector**: 1 file
- **js-cookie**: 1 file
- **redux-logger**: 1 file
- **reselect**: 1 file
- **sails.io.js**: 1 file
- **socket.io-client**: 1 file

## Backend (server)

### Data

- **[Postgres](https://seerepo.com/uses/postgres)**: 2 files · [server/utils/database-config.js, line 17](https://github.com/plankanban/planka/blob/2cf423824a09f84df7dc3acf0ded9a700292d882/server/utils/database-config.js#L17)
- **@aws-sdk/lib-storage**: 1 file

### Data access

- **[knex](https://seerepo.com/uses/knex)**: 4 files

### Sign-in

- **[bcrypt](https://seerepo.com/uses/bcrypt)**: 15 files
- **[otplib](https://seerepo.com/uses/otplib)**: 3 files
- **[jsonwebtoken](https://seerepo.com/uses/jsonwebtoken)**: 2 files
- **[zxcvbn](https://seerepo.com/uses/zxcvbn)**: 2 files

### Services

- **[AWS S3](https://seerepo.com/uses/aws-s3)**: 1 file · [server/api/hooks/file-manager/S3FileManager.js, line 16](https://github.com/plankanban/planka/blob/2cf423824a09f84df7dc3acf0ded9a700292d882/server/api/hooks/file-manager/S3FileManager.js#L16)

## Support (server)

### Content

- **[sharp](https://seerepo.com/uses/sharp)**: 5 files
- **[escape-html](https://seerepo.com/uses/escape-html)**: 4 files
- **[file-type](https://seerepo.com/uses/file-type)**: 3 files
- **[nodemailer](https://seerepo.com/uses/nodemailer)**: 1 file

### Validation

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

### Testing

- **Chai**: 6 files
- **supertest**: 2 files

### Deploy

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

### Tools

- **rimraf**: 5 files
- **read**: 2 files
- **swagger-jsdoc**: 2 files
- **ignore**: 1 file

### Other

- **uuid**: 9 files
- **mime-types**: 4 files
- **Lodash**: 3 files
- **.ENV**: 2 files
- **bytes**: 2 files
- **istextorbinary**: 2 files
- **moment**: 2 files
- **undici**: 2 files
- **apprise**: 1 file
- **fs-extra**: 1 file
- **i18n-2**: 1 file
- **serve-static**: 1 file
- **ua-parser-js**: 1 file

## Other repos with a similar stack

- [twentyhq/twenty](https://seerepo.com/r/twentyhq/twenty/built): React, Vite, Postgres, AWS S3, react-textarea-autosize, react-intersection-observer, react-dropzone, linkify-react, papaparse, bcrypt, otplib, jsonwebtoken, sharp, file-type, nodemailer · [Compare](https://seerepo.com/compare/plankanban/planka/vs/twentyhq/twenty)
- [TryGhost/Ghost](https://seerepo.com/r/TryGhost/Ghost/built): React, React Router, Vite, react-dropzone, papaparse, prop-types, validator, knex, otplib, jsonwebtoken, sharp, file-type, nodemailer · [Compare](https://seerepo.com/compare/plankanban/planka/vs/TryGhost/Ghost)
- [ToolJet/ToolJet](https://seerepo.com/r/ToolJet/ToolJet/built): React, Postgres, classnames, react-beautiful-dnd, react-hot-toast, react-datepicker, react-dropzone, papaparse, knex, bcrypt, nodemailer, winston · [Compare](https://seerepo.com/compare/plankanban/planka/vs/ToolJet/ToolJet)
- [strapi/strapi](https://seerepo.com/r/strapi/strapi/built): React, Vite, react-dropzone, highlight.js, prop-types, knex, jsonwebtoken, sharp, file-type, nodemailer, winston · [Compare](https://seerepo.com/compare/plankanban/planka/vs/strapi/strapi)
- [laurent22/joplin](https://seerepo.com/r/laurent22/joplin/built): React, Postgres, AWS S3, zxcvbn, highlight.js, knex, otplib, sharp, file-type, nodemailer · [Compare](https://seerepo.com/compare/laurent22/joplin/vs/plankanban/planka)
- [payloadcms/payload](https://seerepo.com/r/payloadcms/payload/built): React, Vite, Postgres, @aws-sdk/lib-storage, AWS S3, react-datepicker, sharp, escape-html, file-type, nodemailer · [Compare](https://seerepo.com/compare/payloadcms/payload/vs/plankanban/planka)

## Frequently asked questions

### What language is planka written in?

planka is written in JavaScript, with 129,073 written lines.

### What framework does planka use?

planka is built with React, React Router, Vite, and history.

The proof: [in client/package.json](https://github.com/plankanban/planka/blob/2cf423824a09f84df7dc3acf0ded9a700292d882/client/package.json)

### What database does planka use?

planka stores its data in Postgres and reaches it with knex.

The proof: [server/utils/database-config.js, line 17](https://github.com/plankanban/planka/blob/2cf423824a09f84df7dc3acf0ded9a700292d882/server/utils/database-config.js#L17)

### What does planka sign people in with?

planka signs people in with zxcvbn, jwt-decode, bcrypt, otplib, and jsonwebtoken.

### What services does planka use?

planka stores files in AWS S3 and uses @aws-sdk/lib-storage.

The proof: [server/api/hooks/file-manager/S3FileManager.js, line 16](https://github.com/plankanban/planka/blob/2cf423824a09f84df7dc3acf0ded9a700292d882/server/api/hooks/file-manager/S3FileManager.js#L16)

### Does planka have tests?

Yes. planka has 19 test files and is tested with Cucumber, playwright, Chai, and supertest.

### Which repos have a stack like planka's?

The ones that share most of its stack: twentyhq/twenty, TryGhost/Ghost, and ToolJet/ToolJet.

## 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.
