SaaS platform for managing your brand links. Under active development. Primary goal of this project is to create sample that does more than just simple CRUD.
Frontend is still in very early stage of development. It lacks proper error handling and will receive major upgrade when core features will be done.
Currently only downloading as PNG is possible. In the future SVG and JPEG will be added.
Account settings interactions example
Link in Bio feature. More features to come after major refactor.
- Node.js
- NestJS
- PostgreSQL (Drizzle ORM)
- Redis (ioredis)
- Next.js
- React
- Docker
- Zookeeper (node-zookeeper)
- Clickhouse (clickhouse-js)
- AWS S3 (MinIO)
- Asynchronous messaging (with BullMQ)
- Caching
- Rate-limiting
- Error monitoring (with Sentry)
- Email Verification
- Social Authentication (Google, GitHub)
- Email & Password Authentication
- Reset Password flow
- Google Recaptcha support
- Paid monthly subscriptions (Stripe)
- URL shortening
- QR Codes generation
- Reporting malicious URLs
- UTM Generator
- Mobile Redirects
- Link Redirect Expiration
- Statistics for shortened URLs
- Health checks
- Link in bio
- Custom domains
- Workspaces with members management
- write e2e tests (currently partially written for user, workspace and auth modules)
- create CI pipeline
Project uses Nx workspaces for building and handling monorepo structure.
cd docker
docker compose up
# will install depedencies and create .env file
npm run setup
# run migrations (will run migrations against database defined in env.POSTGRES_URI)
npm run db:migrate
# run migrations for stats database (definied CLICKHOUSE_ env variables)
npm run stats:migrate
Purly uses MinIO to simulate AWS S3 for local development. We suggest to use AWS CLI for initial configuration.
Read about S3 local setup in /tools/s3-local/README.md
npm run serve
Purly uses STRIPE_WEBHOOK_PATH
variable for webhook URL obfuscation. Don't forget to replace it in production with your own random value.
stripe login # only once - stripe will remember your session
stripe listen --forward-to localhost:8000/api/stripe/webhook/e7a42abb5d31ec92bdfeec3cb0a4fa1b
Stripe CLI will give you webhook signing secret like
whsec_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
. Save this value in .env as STRIPE_WEBHOOK_SECRET and restart API. CLI gives you the same secret so no need to repeat this step every time you run listen command.
Currently project is in early stage of development and many things are changing so often. Keep it in mind if you want to contribute.
- Use conventional commits for commits and PRs.
- If you want to introduce bigger change I recommend to create issue first with feature request and get approval from mantainer :) Otherwise your pull request can be declined and you will waste your time.
- After changes in table schemas, run
db:generate
script to generate migrations and rundb:migrate
to run migration.
Distributed under the MIT License. See LICENSE
for more information.