Source: https://seerepo.com/r/omnivore-app/omnivore/built
Markdown source: https://seerepo.com/r/omnivore-app/omnivore/built.md
Description: omnivore is a TypeScript repo built with androidx.compose.runtime:runtime-livedata, Jetpack Compose, androidx.navigation:navigation-compose,…

# What is omnivore built with?

omnivore is a TypeScript repo built with androidx.compose.runtime:runtime-livedata, Jetpack Compose, androidx.navigation:navigation-compose, androidx.hilt:hilt-navigation-compose, com.google.dagger:hilt-android, and 10 more. It stores its data in bullmq, Google Cloud, and Postgres, reaches it with room-ktx, room-runtime, and TypeORM, signs people in with jsonwebtoken, bcryptjs, and jwks-rsa, uses AI through LangChain, microsoft-cognitiveservices-speech-sdk, natural, and OpenAI, measures its use with PostHog, watches its errors with Sentry, connects to Google, makes its content with coil-compose, compose-markdown, linkedom, showdown, rss-parser, and 21 more, is tested with espresso-core, ui-test-junit4, ui-test-manifest, androidx.test.ext:junit-ktx, junit:junit, and 15 more, deploys with prom-client, winston, @google-cloud/opentelemetry-cloud-trace-exporter, @opentelemetry/exporter-jaeger, and express-prom-bundle, and uses androidx.datastore:datastore-preferences, Firebase, Redis, aws-sdk, rate-limit-redis, and 1 more. It has 540,180 written lines, with 470 test files.

Read on November 7, 2026, at commit 4cdfc3d.

Repository: https://github.com/omnivore-app/omnivore

## Frontend (/)

### The base

- **androidx.compose.runtime:runtime-livedata**: 59 files
- **[Jetpack Compose](https://seerepo.com/uses/jetpack-compose)**: 59 files
- **androidx.navigation:navigation-compose**: 18 files
- **androidx.hilt:hilt-navigation-compose**: 12 files

### Interface

- **ui-util**
- **MarkdownUI**: 4 files
- **[androidx.appcompat:appcompat](https://seerepo.com/uses/androidxappcompat-appcompat)**: 2 files
- **androidx.core:core-splashscreen**: 1 file
- **com.google.accompanist:accompanist-flowlayout**: 1 file

### Icons

- **material-icons-extended**

## Backend (/)

### Data

- **androidx.datastore:datastore-preferences**: 1 file

### Data access

- **room-ktx**
- **room-runtime**

### Services

- **[Firebase](https://seerepo.com/uses/firebase)**: 2 files · [packages/api/src/services/user.ts, line 1](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/services/user.ts#L1)
- **[PostHog](https://seerepo.com/uses/posthog)**: 1 file · [packages/api/src/utils/analytics.ts, line 2](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/utils/analytics.ts#L2)

## Support (/)

### The base

- **com.google.dagger:hilt-android**
- **[core-ktx](https://seerepo.com/uses/core-ktx)**
- **lifecycle-livedata-ktx**
- **[lifecycle-runtime-compose](https://seerepo.com/uses/lifecycle-runtime-compose)**
- **lifecycle-viewmodel-savedstate**

### Content

- **[coil-compose](https://seerepo.com/uses/coil-compose)**
- **compose-markdown**

### Testing

- **espresso-core**
- **ui-test-junit4**
- **ui-test-manifest**
- **androidx.test.ext:junit-ktx**: 1 file
- **junit:junit**: 1 file

### Tools

- **com.google.dagger:hilt-android-compiler**
- **gradle**
- **hilt-android-gradle-plugin**
- **hilt-compiler**
- **kotlin-gradle-plugin**
- **room-compiler**
- **ui-tooling**
- **ui-tooling-preview**

### Other

- **converter-gson**
- **[JetBrains](https://seerepo.com/uses/jetbrains)**
- **lifecycle-viewmodel-compose**
- **lifecycle-viewmodel-ktx**
- **retrofit**
- **security-crypto**
- **[Google](https://seerepo.com/uses/google)**: 10 files
- **androidx.work:work-runtime-ktx**: 4 files
- **androidx.hilt:hilt-work**: 3 files

## Backend (mobile/apple/gql-server)

### The base

- **[Express](https://seerepo.com/uses/express)**: 1 file · [in packages/api/package.json](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/package.json)

## Support (mobile/apple/gql-server)

### The base

- **express-graphql**: 1 file

### Other

- **GraphQL**: 1 file

## Frontend (mobile/appreader)

### The base

- **[React](https://seerepo.com/uses/react)**: 1 file · [in packages/web/package.json](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/web/package.json)

## Support (mobile/appreader)

### Other

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

## Backend (packages/api)

### The base

- **[Express](https://seerepo.com/uses/express)**: 33 files · [in packages/api/package.json](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/package.json)

### Data

- **[bullmq](https://seerepo.com/uses/bullmq)**: 4 files
- **[Redis](https://seerepo.com/uses/redis)**: 4 files · [packages/api/src/jobs/sync_read_positions.ts, line 1](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/jobs/sync_read_positions.ts#L1)
- **[Google Cloud](https://seerepo.com/uses/google-cloud)**: 2 files · [packages/api/src/pubsub.ts, line 1](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/pubsub.ts#L1)
- **[Postgres](https://seerepo.com/uses/postgres)**: 2 files · [packages/api/src/repository/index.ts, line 2](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/repository/index.ts#L2)
- **[aws-sdk](https://seerepo.com/uses/aws-sdk)**: 1 file
- **rate-limit-redis**: 1 file

### Data access

- **TypeORM**: 83 files

### Sign-in

- **[jsonwebtoken](https://seerepo.com/uses/jsonwebtoken)**: 14 files
- **[bcryptjs](https://seerepo.com/uses/bcryptjs)**: 1 file
- **jwks-rsa**: 1 file

### AI

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

### Services

- **[Sentry](https://seerepo.com/uses/sentry)**: 3 files · [packages/api/src/apollo.ts, line 10](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/apollo.ts#L10)
- **[Firebase](https://seerepo.com/uses/firebase)**: 2 files · [packages/api/src/services/user.ts, line 1](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/services/user.ts#L1)
- **[Google](https://seerepo.com/uses/google)**: 1 file · [packages/api/src/routers/auth/google_auth.ts, line 1](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/routers/auth/google_auth.ts#L1)
- **[PostHog](https://seerepo.com/uses/posthog)**: 1 file · [packages/api/src/utils/analytics.ts, line 2](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/utils/analytics.ts#L2)

## Support (packages/api)

### The base

- **@apollo/server**: 2 files
- **@as-integrations/express5**: 2 files

### Content

- **[linkedom](https://seerepo.com/uses/linkedom)**: 8 files
- **showdown**: 3 files
- **rss-parser**: 2 files
- **[sanitize-html](https://seerepo.com/uses/sanitize-html)**: 2 files
- **@sendgrid/mail**: 1 file
- **addressparser**: 1 file
- **[dompurify](https://seerepo.com/uses/dompurify)**: 1 file
- **[fast-xml-parser](https://seerepo.com/uses/fast-xml-parser)**: 1 file
- **[html-entities](https://seerepo.com/uses/html-entities)**: 1 file
- **image-size**: 1 file
- **mailparser**: 1 file
- **node-html-markdown**: 1 file
- **node-mailjet**: 1 file
- **[nodemailer](https://seerepo.com/uses/nodemailer)**: 1 file
- **sax**: 1 file
- **[yaml](https://seerepo.com/uses/yaml)**: 1 file

### Testing

- **Chai**: 88 files
- **Mocha**: 86 files
- **sinon**: 20 files
- **chai-string**: 10 files
- **nock**: 10 files
- **sinon-chai**: 6 files
- **supertest**: 4 files
- **chai-as-promised**: 2 files
- **fingerprint-generator**: 1 file

### Deploy

- **[prom-client](https://seerepo.com/uses/prom-client)**: 5 files
- **[winston](https://seerepo.com/uses/winston)**: 3 files
- **@google-cloud/opentelemetry-cloud-trace-exporter**: 1 file
- **@opentelemetry/exporter-jaeger**: 1 file
- **express-prom-bundle**: 1 file

### Tools

- **@graphql-tools/schema**: 1 file

### Other

- **Axios**: 23 files
- **cors**: 20 files
- **uuid**: 13 files
- **Lodash**: 7 files
- **luxon**: 6 files
- **nanoid**: 5 files
- **GraphQL**: 3 files
- **dataloader**: 2 files
- **diff-match-patch**: 2 files
- **normalize-url**: 2 files
- **[OpenTelemetry](https://seerepo.com/uses/opentelemetry)**: 2 files
- **.ENV**: 1 file
- **@graphql-tools/utils**: 1 file
- **@notionhq/client**: 1 file
- **alfaaz**: 1 file
- **archiver**: 1 file
- **compression**: 1 file
- **cookie**: 1 file
- **cookie-parser**: 1 file
- **express-rate-limit**: 1 file
- **fast-safe-stringify**: 1 file
- **graphql-tag**: 1 file
- **underscore**: 1 file
- **url-pattern**: 1 file

## Backend (packages/content/content-fetch)

### The base

- **[Express](https://seerepo.com/uses/express)**: 1 file · [in packages/api/package.json](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/package.json)

### Data

- **[bullmq](https://seerepo.com/uses/bullmq)**: 3 files
- **[aws-sdk](https://seerepo.com/uses/aws-sdk)**: 1 file
- **[Google Cloud](https://seerepo.com/uses/google-cloud)**: 1 file · [packages/api/src/pubsub.ts, line 1](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/pubsub.ts#L1)
- **[Redis](https://seerepo.com/uses/redis)**: 1 file · [packages/api/src/jobs/sync_read_positions.ts, line 1](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/jobs/sync_read_positions.ts#L1)

### Sign-in

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

### Services

- **[PostHog](https://seerepo.com/uses/posthog)**: 1 file · [packages/api/src/utils/analytics.ts, line 2](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/utils/analytics.ts#L2)

## Support (packages/content/content-fetch)

### Testing

- **Chai**: 1 file
- **Mocha**: 1 file

### Other

- **.ENV**: 1 file
- **Axios**: 1 file

## Support (packages/content/content-handler)

### Content

- **[linkedom](https://seerepo.com/uses/linkedom)**: 13 files
- **addressparser**: 4 files

### Testing

- **Chai**: 6 files
- **nock**: 5 files
- **Mocha**: 3 files
- **chai-as-promised**: 1 file
- **chai-string**: 1 file

### Other

- **Axios**: 16 files
- **underscore**: 3 files
- **luxon**: 2 files
- **uuid**: 1 file

## Support (packages/content/liqe)

### Testing

- **ava**: 11 files
- **Faker**: 1 file

### Tools

- **benny**: 1 file

### Other

- **nearley**: 1 file

## Support (packages/content/puppeteer-parse)

### Testing

- **Puppeteer**: 2 files
- **Chai**: 1 file
- **Mocha**: 1 file
- **puppeteer-extra-plugin-stealth**: 1 file

## Support (packages/content/readabilityjs)

### Content

- **[linkedom](https://seerepo.com/uses/linkedom)**: 3 files
- **[html-entities](https://seerepo.com/uses/html-entities)**: 1 file
- **parse-srcset**: 1 file

### Testing

- **Chai**: 3 files
- **chai-as-promised**: 1 file
- **nock**: 1 file
- **puppeteer-extra-plugin-stealth**: 1 file
- **sinon**: 1 file

### Tools

- **js-beautify**: 1 file

### Other

- **Axios**: 1 file

## Backend (packages/content/text-to-speech)

### Data

- **[Google Cloud](https://seerepo.com/uses/google-cloud)**: 1 file · [packages/api/src/pubsub.ts, line 1](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/pubsub.ts#L1)

### Sign-in

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

### AI

- **microsoft-cognitiveservices-speech-sdk**: 1 file
- **natural**: 1 file

### Services

- **[Sentry](https://seerepo.com/uses/sentry)**: 1 file · [packages/api/src/apollo.ts, line 10](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/apollo.ts#L10)

## Support (packages/content/text-to-speech)

### Content

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

### Testing

- **Chai**: 1 file
- **Mocha**: 1 file

### Other

- **Axios**: 2 files
- **underscore**: 2 files
- **.ENV**: 1 file

## Backend (packages/db)

### Data

- **[bullmq](https://seerepo.com/uses/bullmq)**: 1 file
- **[Postgres](https://seerepo.com/uses/postgres)**: 1 file · [packages/api/src/repository/index.ts, line 2](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/repository/index.ts#L2)

## Support (packages/db)

### Other

- **.ENV**: 1 file

## Backend (packages/discover)

### Data

- **[Postgres](https://seerepo.com/uses/postgres)**: 4 files · [packages/api/src/repository/index.ts, line 2](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/repository/index.ts#L2)
- **[bullmq](https://seerepo.com/uses/bullmq)**: 1 file
- **[Redis](https://seerepo.com/uses/redis)**: 1 file · [packages/api/src/jobs/sync_read_positions.ts, line 1](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/jobs/sync_read_positions.ts#L1)

### Services

- **[OpenAI](https://seerepo.com/uses/openai)**: 1 file · [packages/discover/src/lib/clients/ai/openAi.ts, line 2](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/discover/src/lib/clients/ai/openAi.ts#L2)

## Support (packages/discover)

### Content

- **[linkedom](https://seerepo.com/uses/linkedom)**: 2 files
- **[fast-xml-parser](https://seerepo.com/uses/fast-xml-parser)**: 1 file

### Testing

- **jsdom**: 3 files

### Other

- **rxjs**: 12 files
- **Axios**: 3 files
- **.ENV**: 1 file
- **aws4-axios**: 1 file
- **Lodash**: 1 file
- **uuid**: 1 file

## Support (packages/mail/imap-mail-watcher)

### Content

- **mailparser**: 3 files
- **imapflow**: 2 files

### Other

- **rxjs**: 2 files
- **Axios**: 1 file

## Backend (packages/mail/local-mail-watcher)

### The base

- **[Express](https://seerepo.com/uses/express)**: [in packages/api/package.json](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/package.json)

### Data

- **[bullmq](https://seerepo.com/uses/bullmq)**: 1 file
- **[Redis](https://seerepo.com/uses/redis)**: 1 file · [packages/api/src/jobs/sync_read_positions.ts, line 1](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/jobs/sync_read_positions.ts#L1)

## Support (packages/mail/local-mail-watcher)

### Content

- **mailparser**: 3 files

### Tools

- **chokidar**: 1 file

### Other

- **Axios**: 1 file

## Backend (packages/utils)

### Data

- **[Redis](https://seerepo.com/uses/redis)**: 1 file · [packages/api/src/jobs/sync_read_positions.ts, line 1](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/jobs/sync_read_positions.ts#L1)

## Support (packages/utils)

### Testing

- **Chai**: 1 file
- **Mocha**: 1 file

## Frontend (packages/web)

### The base

- **[React](https://seerepo.com/uses/react)**: 221 files · [in packages/web/package.json](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/web/package.json)
- **[Next.js](https://seerepo.com/uses/nextjs)**: 88 files · [in packages/web/package.json](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/web/package.json)

### Interface

- **[Radix UI](https://seerepo.com/uses/radix-ui)**: 17 files
- **kbar**: 11 files
- **[@floating-ui/react](https://seerepo.com/uses/floating-ui-react)**: 6 files
- **[antd](https://seerepo.com/uses/antd)**: 5 files
- **[react-hot-toast](https://seerepo.com/uses/react-hot-toast)**: 5 files
- **react-markdown-editor-lite**: 5 files
- **react-topbar-progress-indicator**: 5 files
- **[react-dropzone](https://seerepo.com/uses/react-dropzone)**: 3 files
- **react-spinners**: 3 files
- **react-arborist**: 2 files
- **allotment**: 1 file
- **re-resizable**: 1 file
- **react-color**: 1 file
- **react-input-autosize**: 1 file
- **use-resize-observer**: 1 file
- **yet-another-react-lightbox**: 1 file

### Icons

- **[@phosphor-icons/react](https://seerepo.com/uses/phosphor-icons-react)**: 67 files

## Backend (packages/web)

### Data

- **[@react-native-async-storage/async-storage](https://seerepo.com/uses/react-native-async-storage-async-storage)**: 1 file

### Sign-in

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

### Services

- **[Sentry](https://seerepo.com/uses/sentry)**: 4 files · [packages/api/src/apollo.ts, line 10](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/apollo.ts#L10)

## Support (packages/web)

### Content

- **[pdfjs-dist](https://seerepo.com/uses/pdfjs-dist)**: 5 files
- **[react-markdown](https://seerepo.com/uses/react-markdown)**: 3 files
- **[remark-gfm](https://seerepo.com/uses/remark-gfm)**: 3 files
- **[markdown-it](https://seerepo.com/uses/markdown-it)**: 2 files
- **epubjs**: 1 file
- **node-html-markdown**: 1 file

### Testing

- **Testing Library**: 1 file

### Tools

- **@next/bundle-analyzer**: 1 file

### Other

- **graphql-request**: 75 files
- **SWR**: 20 files
- **uuid**: 14 files
- **[TanStack](https://seerepo.com/uses/tanstack)**: 12 files
- **Lodash**: 5 files
- **dayjs**: 4 files
- **nanoid**: 4 files
- **Axios**: 2 files
- **cookie**: 2 files
- **diff-match-patch**: 2 files

## Support (web-extensions/extension-v3)

### Other

- **uuid**: 1 file

## Other repos with a similar stack

- [twentyhq/twenty](https://seerepo.com/r/twentyhq/twenty/built): Express, React, bullmq, Redis, Postgres, aws-sdk, Sentry, Google, OpenAI, TypeORM, jsonwebtoken, sanitize-html, dompurify, nodemailer, html-to-text, @floating-ui/react, react-dropzone, react-markdown, remark-gfm · [Compare](https://seerepo.com/compare/omnivore-app/omnivore/vs/twentyhq/twenty)
- [n8n-io/n8n](https://seerepo.com/r/n8n-io/n8n/built): PostHog, Express, Redis, Postgres, Sentry, OpenAI, jsonwebtoken, bcryptjs, LangChain, linkedom, rss-parser, sanitize-html, nodemailer, yaml, winston, html-to-text, pdfjs-dist, markdown-it · [Compare](https://seerepo.com/compare/n8n-io/n8n/vs/omnivore-app/omnivore)
- [TryGhost/Ghost](https://seerepo.com/r/TryGhost/Ghost/built): Express, React, bullmq, Sentry, jsonwebtoken, sanitize-html, dompurify, image-size, node-html-markdown, nodemailer, html-to-text, Radix UI, react-dropzone, markdown-it · [Compare](https://seerepo.com/compare/omnivore-app/omnivore/vs/TryGhost/Ghost)
- [CherryHQ/cherry-studio](https://seerepo.com/r/CherryHQ/cherry-studio/built): React, Sentry, OpenAI, dompurify, fast-xml-parser, yaml, winston, html-to-text, Radix UI, react-dropzone, react-spinners, pdfjs-dist, remark-gfm, markdown-it · [Compare](https://seerepo.com/compare/CherryHQ/cherry-studio/vs/omnivore-app/omnivore)
- [calcom/cal.diy](https://seerepo.com/r/calcom/cal.diy/built): PostHog, React, Redis, Postgres, Sentry, Google, Next.js, bcryptjs, sanitize-html, dompurify, nodemailer, winston, Radix UI, markdown-it · [Compare](https://seerepo.com/compare/calcom/cal.diy/vs/omnivore-app/omnivore)
- [LibreChat-AI/LibreChat](https://seerepo.com/r/LibreChat-AI/LibreChat/built): Firebase, Express, React, Redis, rate-limit-redis, jsonwebtoken, bcryptjs, jwks-rsa, sanitize-html, dompurify, prom-client, winston, Radix UI, pdfjs-dist · [Compare](https://seerepo.com/compare/LibreChat-AI/LibreChat/vs/omnivore-app/omnivore)

## Frequently asked questions

### What language is omnivore written in?

omnivore is written in TypeScript, with 540,180 written lines.

### What framework does omnivore use?

omnivore is built with androidx.compose.runtime:runtime-livedata, Jetpack Compose, androidx.navigation:navigation-compose, androidx.hilt:hilt-navigation-compose, com.google.dagger:hilt-android, core-ktx, lifecycle-livedata-ktx, lifecycle-runtime-compose, lifecycle-viewmodel-savedstate, Express, express-graphql, React, @apollo/server, @as-integrations/express5, and Next.js.

### What database does omnivore use?

omnivore stores its data in bullmq, Google Cloud, and Postgres and reaches it with room-ktx, room-runtime, and TypeORM.

### What does omnivore sign people in with?

omnivore signs people in with jsonwebtoken, bcryptjs, and jwks-rsa.

### Does omnivore use AI?

Yes. omnivore uses AI through LangChain, microsoft-cognitiveservices-speech-sdk, natural, and OpenAI.

### What services does omnivore use?

omnivore measures its use with PostHog, watches its errors with Sentry, connects to Google, and uses androidx.datastore:datastore-preferences, Firebase, Redis, aws-sdk, rate-limit-redis, and @react-native-async-storage/async-storage.

The proof: [packages/api/src/utils/analytics.ts, line 2](https://github.com/omnivore-app/omnivore/blob/4cdfc3d75bd1b7de203f24b812541c58df30209f/packages/api/src/utils/analytics.ts#L2)

### Does omnivore have tests?

Yes. omnivore has 470 test files and is tested with espresso-core, ui-test-junit4, ui-test-manifest, androidx.test.ext:junit-ktx, junit:junit, Chai, Mocha, sinon, chai-string, nock, sinon-chai, supertest, chai-as-promised, fingerprint-generator, ava, Faker, Puppeteer, puppeteer-extra-plugin-stealth, jsdom, and Testing Library.

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

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

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