191 lines
7.9 KiB
Markdown
191 lines
7.9 KiB
Markdown
# Fullstack monorepo template feat. Expo, Turbo, Next.js, Convex, Clerk
|
||
|
||
This is a modern TypeScript monorepo template with AI web and native apps
|
||
featuring:
|
||
|
||
- Turborepo: Monorepo management
|
||
- React 19: Latest React with concurrent features
|
||
- Next.js 15: Web app & marketing page with App Router
|
||
- Tailwind CSS v4: Modern CSS-first configuration
|
||
- React Native [Expo](https://expo.dev/): Mobile/native app with New Architecture
|
||
- [Convex](https://convex.dev): Backend, database, server functions
|
||
- [Clerk](https://clerk.dev): User authentication
|
||
- OpenAI: Text summarization (optional)
|
||
|
||
The example app is a note taking app that can summarize notes using AI. Features
|
||
include:
|
||
|
||
- Marketing page
|
||
- Dashboard page (web & native)
|
||
- Note taking page (web & native)
|
||
- Backend API that serves web & native with the same API
|
||
- Relational database
|
||
- End to end type safety (schema definition to frontend API clients)
|
||
- User authentication
|
||
- Asynchronous call to an OpenAI
|
||
- Everything is realtime by default
|
||
|
||
## Using this example
|
||
|
||
### 1. Install dependencies
|
||
|
||
If you don't have `yarn` installed, run `npm install --global yarn`.
|
||
|
||
Run `yarn`.
|
||
|
||
### 2. Configure Convex
|
||
|
||
> Note: The following command will print an error and ask you to add the
|
||
> appropriate environment variable to proceed. Continue reading on for how to do
|
||
> that.
|
||
|
||
```sh
|
||
npm run setup --workspace packages/backend
|
||
```
|
||
|
||
The script will log you into Convex if you aren't already and prompt you to
|
||
create a project (free). It will then wait to deploy your code until you set the
|
||
environment variables in the dashboard.
|
||
|
||
Configure Clerk with [this guide](https://docs.convex.dev/auth/clerk). Then add
|
||
the `CLERK_ISSUER_URL` found in the "convex" template
|
||
[here](https://dashboard.clerk.com/last-active?path=jwt-templates), to your
|
||
Convex environment variables
|
||
[here](https://dashboard.convex.dev/deployment/settings/environment-variables&var=CLERK_ISSUER_URL).
|
||
|
||
Make sure to enable **Google and Apple** as possible Social Connection
|
||
providers, as these are used by the React Native login implementation.
|
||
|
||
After that, optionally add the `OPENAI_API_KEY` env var from
|
||
[OpenAI](https://platform.openai.com/account/api-keys) to your Convex
|
||
environment variables to get AI summaries.
|
||
|
||
The `setup` command should now finish successfully.
|
||
|
||
### 3. Configure both apps
|
||
|
||
In each app directory (`apps/web`, `apps/native`) create a `.env.local` file
|
||
using the `.example.env` as a template and fill out your Convex and Clerk
|
||
environment variables.
|
||
|
||
- Use the `CONVEX_URL` from `packages/backend/.env.local` for
|
||
`{NEXT,EXPO}_PUBLIC_CONVEX_URL`.
|
||
- The Clerk publishable & secret keys can be found
|
||
[here](https://dashboard.clerk.com/last-active?path=api-keys).
|
||
|
||
### 4. Run both apps
|
||
|
||
Run the following command to run both the web and mobile apps:
|
||
|
||
```sh
|
||
npm run dev
|
||
```
|
||
|
||
This will allow you to use the ⬆ and ⬇ keyboard keys to see logs for each
|
||
of the Convex backend, web app, and mobile app separately.
|
||
If you'd rather see all of the logs in one place, delete the
|
||
`"ui": "tui",` line in [turbo.json](./turbo.json).
|
||
|
||
## Deploying
|
||
|
||
In order to both deploy the frontend and Convex, run this as the build command from the apps/web directory:
|
||
|
||
```sh
|
||
cd ../../packages/backend && npx convex deploy --cmd 'cd ../../apps/web && turbo run build' --cmd-url-env-var-name NEXT_PUBLIC_CONVEX_URL
|
||
```
|
||
|
||
There is a vercel.json file in the apps/web directory with this configuration for Vercel.
|
||
|
||
## What's inside?
|
||
|
||
This monorepo template includes the following packages/apps:
|
||
|
||
### Apps and Packages
|
||
|
||
- `web`: a [Next.js 15](https://nextjs.org/) app with Tailwind CSS and Clerk
|
||
- `native`: a [React Native](https://reactnative.dev/) app built with
|
||
[expo](https://docs.expo.dev/)
|
||
- `packages/backend`: a [Convex](https://www.convex.dev/) folder with the
|
||
database schema and shared functions
|
||
|
||
Each package/app is 100% [TypeScript](https://www.typescriptlang.org/).
|
||
|
||
To install a new package, `cd` into that directory, such as [packages/backend](./packages/backend/), and then run `yarn add mypackage@latest`
|
||
|
||
### Utilities
|
||
|
||
This Turborepo has some additional tools already setup for you:
|
||
|
||
- [Expo](https://docs.expo.dev/) for native development
|
||
- [TypeScript](https://www.typescriptlang.org/) for static type checking
|
||
- [Prettier](https://prettier.io) for code formatting
|
||
|
||
# What is Convex?
|
||
|
||
[Convex](https://convex.dev) is a hosted backend platform with a built-in
|
||
reactive database that lets you write your
|
||
[database schema](https://docs.convex.dev/database/schemas) and
|
||
[server functions](https://docs.convex.dev/functions) in
|
||
[TypeScript](https://docs.convex.dev/typescript). Server-side database
|
||
[queries](https://docs.convex.dev/functions/query-functions) automatically
|
||
[cache](https://docs.convex.dev/functions/query-functions#caching--reactivity)
|
||
and [subscribe](https://docs.convex.dev/client/react#reactivity) to data,
|
||
powering a
|
||
[realtime `useQuery` hook](https://docs.convex.dev/client/react#fetching-data)
|
||
in our [React client](https://docs.convex.dev/client/react). There are also
|
||
clients for [Python](https://docs.convex.dev/client/python),
|
||
[Rust](https://docs.convex.dev/client/rust),
|
||
[ReactNative](https://docs.convex.dev/client/react-native), and
|
||
[Node](https://docs.convex.dev/client/javascript), as well as a straightforward
|
||
[HTTP API](https://github.com/get-convex/convex-js/blob/main/src/browser/http_client.ts#L40).
|
||
|
||
The database supports
|
||
[NoSQL-style documents](https://docs.convex.dev/database/document-storage) with
|
||
[relationships](https://docs.convex.dev/database/document-ids) and
|
||
[custom indexes](https://docs.convex.dev/database/indexes/) (including on fields
|
||
in nested objects).
|
||
|
||
The [`query`](https://docs.convex.dev/functions/query-functions) and
|
||
[`mutation`](https://docs.convex.dev/functions/mutation-functions) server
|
||
functions have transactional, low latency access to the database and leverage
|
||
our [`v8` runtime](https://docs.convex.dev/functions/runtimes) with
|
||
[determinism guardrails](https://docs.convex.dev/functions/runtimes#using-randomness-and-time-in-queries-and-mutations)
|
||
to provide the strongest ACID guarantees on the market: immediate consistency,
|
||
serializable isolation, and automatic conflict resolution via
|
||
[optimistic multi-version concurrency control](https://docs.convex.dev/database/advanced/occ)
|
||
(OCC / MVCC).
|
||
|
||
The [`action` server functions](https://docs.convex.dev/functions/actions) have
|
||
access to external APIs and enable other side-effects and non-determinism in
|
||
either our [optimized `v8` runtime](https://docs.convex.dev/functions/runtimes)
|
||
or a more
|
||
[flexible `node` runtime](https://docs.convex.dev/functions/runtimes#nodejs-runtime).
|
||
|
||
Functions can run in the background via
|
||
[scheduling](https://docs.convex.dev/scheduling/scheduled-functions) and
|
||
[cron jobs](https://docs.convex.dev/scheduling/cron-jobs).
|
||
|
||
Development is cloud-first, with
|
||
[hot reloads for server function](https://docs.convex.dev/cli#run-the-convex-dev-server)
|
||
editing via the [CLI](https://docs.convex.dev/cli). There is a
|
||
[dashboard UI](https://docs.convex.dev/dashboard) to
|
||
[browse and edit data](https://docs.convex.dev/dashboard/deployments/data),
|
||
[edit environment variables](https://docs.convex.dev/production/environment-variables),
|
||
[view logs](https://docs.convex.dev/dashboard/deployments/logs),
|
||
[run server functions](https://docs.convex.dev/dashboard/deployments/functions),
|
||
and more.
|
||
|
||
There are built-in features for
|
||
[reactive pagination](https://docs.convex.dev/database/pagination),
|
||
[file storage](https://docs.convex.dev/file-storage),
|
||
[reactive search](https://docs.convex.dev/text-search),
|
||
[https endpoints](https://docs.convex.dev/functions/http-actions) (for
|
||
webhooks),
|
||
[streaming import/export](https://docs.convex.dev/database/import-export/), and
|
||
[runtime data validation](https://docs.convex.dev/database/schemas#validators)
|
||
for [function arguments](https://docs.convex.dev/functions/args-validation) and
|
||
[database data](https://docs.convex.dev/database/schemas#schema-validation).
|
||
|
||
Everything scales automatically, and it’s
|
||
[free to start](https://www.convex.dev/plans).
|