I built Futureself as a simple app for writing messages today and receiving them later in my inbox. It uses a NestJS API with a React (Vite) frontend, PostgreSQL for storage, Redis + BullMQ for scheduling and background jobs, and Brevo for email delivery.
Users can write a message, choose a delivery date, and let the system handle the scheduling and sending automatically.
Most reminder apps are built around tasks and notifications. I wanted something more personal: a way to leave notes for myself that arrive at the right time.
Sometimes it's a reflection I want to revisit months later, a message for an important milestone, encouragement before a difficult period, or just context I know I'll forget with time. Futureself is built around that idea: delayed personal communication instead of productivity tooling.
- Node.js 22.x or current LTS
- pnpm 11.x (
npm install -g pnpm) - PostgreSQL and Redis (local install or your own containers)
- Brevo API key only if you want real email (optional locally)
- Docker
Setup Futureself in production mode in your VPS or locally.
cp .env.example .envThis step is only required if you want to receive emails.
Provide the following credentials in .env:
EMAIL_SENDER_EMAIL= # Obtain from https://app.brevo.com/senders/list
BREVO_API_KEY= # Obtain from https://app.brevo.com/settings/keys/apidocker compose upAccess your Futureself instance at: http://localhost:8010
Note If you are running Futureself from a VPS, then your instance will be available at
http://<your-vps-host>:8010
The configurations for both Postgres and Redis are located in ./compose.yml
Run the local instance of Postgres using the following command:
docker compose up futureself-postgresRun the local instance of Redis using the following command:
docker compose up futureself-redispnpm installThis installs dependencies for both apps/api and apps/web in one shot.
Create .env from .env.example with the following command:
cp .env.example .envUpdate .env:
- Set
REDIS_HOST=127.0.0.1 - Set
POSTGRES_HOST=127.0.0.1 - Set
NODE_ENVIRONMENT=local - Set
VITE_NODE_ENVIRONMENT=local - Set
DONT_SEND_EMAIL=true
A few things to note:
- Setting
DONT_SEND_EMAIL=trueskips sending emails in local development. If set to false, ensure to provide values forEMAIL_SENDER_EMAILandBREVO_API_KEY- Use a strong
APP_KEYand passwords outside local.
Run both from the repo root:
pnpm dev # starts both api and web concurrentlyOr in separate terminals:
| Terminal | Command |
|---|---|
| API | pnpm dev:api |
| Web | pnpm dev:web |
- Web: http://localhost:5173.
- API: http://localhost:5001.
Register, compose a message, pick a future delivery time. With DONT_SEND_EMAIL=true, the queue still runs; email is skipped.
All scripts run from the repo root via pnpm:
| Command | Purpose |
|---|---|
pnpm dev |
Start both api and web |
pnpm dev:api |
API dev server with watch |
pnpm dev:web |
Vite dev server |
pnpm build |
Production build for both |
pnpm build:api |
Production build for api only |
pnpm build:web |
Production build for web only |
pnpm test |
Run all tests |
pnpm lint |
Lint all packages |
pnpm format |
Format all packages |