Awesome
<a name="readme-top"></a>
<!-- PROJECT SHIELDS --> <div align="center"> </div> <!-- PROJECT LOGO --> <br /> <div align="center"> <p align="center"> Reduced.to is a modern web application that reduces the length of link URL. So it's easier to remember, share and track. <br /> <br /> <a href="https://reduced.to">App</a> ยท <a href="https://github.com/origranot/reduced.to/issues/new?assignees=&labels=bug%2Ctriage&template=bug.yml">Report Bug</a> ยท <a href="https://github.com/origranot/reduced.to/issues/new?assignees=&labels=enhancement%2Ctriage&template=feature_request.yml">Request Feature</a> </p> </div> <br /> <!-- TABLE OF CONTENTS --> <details> <summary>๐ Table of Contents</summary> <ol> <li> <a href="#-about-the-project">๐ About The Project</a> <ul> <li><a href="#-built-with">๐ฅ Built With</a></li> </ul> </li> <li> <a href="#-getting-started">๐ Getting Started</a> <ul> <li><a href="#-prerequisites">๐ Prerequisites</a></li> <li><a href="#-installation">๐ป Installation</a></li> <li><a href="#-development">๐ฉโ๐ป Development</a></li> <li><a href="#-docker">๐ณ Docker</a></li> <li><a href="#-docker-compose">๐ Docker Compose</a></li> <li><a href="#-configuration">๐ท Configuration</a></li> </ul> </li> <li><a href="#-usage">๐ฑโ๐ป Usage</a></li> <li><a href="#-roadmap">๐งฑ Roadmap</a></li> <li><a href="#-contributing">๐ฅ Contributing</a></li> <li><a href="#-contributors">๐ Contributors</a></li> <li><a href="#-license">๐ License</a></li> <li><a href="#-contact">๐ Contact</a></li> </ol> </details> <br/> <!-- ABOUT THE PROJECT -->๐ About The Project
<div align="center"> <img src="docs/reduced-to.gif" width="600" height="254"> </div>๐ฅ Built With
List of frameworks/libraries used to bootstrap the project.
<p align="right">(<a href="#readme-top">back to top</a>)</p> <!-- GETTING STARTED -->๐ Getting Started
๐ Prerequisites
List of things you need to run the project locally and how to install them.
- npm
npm install npm@latest -g
- docker
https://docs.docker.com/get-docker/
๐ป Installation
- Fork / Clone this repository
- Install NPM packages
npm install
- Copy
.example.env
to.env
and fill it properly (see Configuration) - Make sure you have a local instance of PostgreSQL running on port 5432. If not, you can run it using docker:
docker run --name reduced_to_db -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=reduced_to_db -p 5432:5432 -d postgres
- Run Prisma migration from root folder:
npx nx migrate-dev prisma --name=init
- Run the backend from root folder:
npx nx serve backend
- Run the frontend from root folder:
npx nx serve frontend
๐ฉโ๐ป Development
The project is structured in the following way:
.
โโโ apps/
โ โโโ backend
โ โโโ frontend
โโโ libs/
โโโ config
โโโ prisma
๐ณ Docker
You can build the docker images by running the following nx command:
npx nx run-many -t docker-build
- This command will automatically build the dependencies and the backend and frontend images.
๐ Docker compose
-
In case you have docker installed, you can single-click deploy and test your changes by running the following and going to
http://localhost:5000/
on your browser. -
When you run the command below, don't forget to change the .env file with the correct values.
docker compose -f docker/local/docker-compose.yml -p reduced-to up
โธ Deployment
You can deploy the app to a Kubernetes cluster by installing the Helm chart.
- Navigate to the
chart
directory (/docker/k8s/chart) - Update the values in the
values.yaml
file - Run the following command to deploy the app to your cluster:
helm install reduced-to . --namespace reduced-to --create-namespace
๐ท Configuration
For the minimal configuration you can just rename the .example.env
files to .env
.
General
- BACKEND_APP_PORT: Backend port
- FRONTEND_APP_PORT: Frontend port
- NODE_ENV: Node environment (development / production)
Database
- DATABASE_URL: Database connection string
Rate Limit
- RATE_LIMIT_TTL: Rate limit TTL (time to live)
- RATE_LIMIT_COUNT: Number of requests within the ttl
Paddle - (Payment Gateway - https://www.paddle.com/ - Optional)
- PADDLE_ENABLE: Wethter to enable Paddle or not
- PADDLE_WEBHOOK_KEY: Get it from your Paddle account
- PADDLE_SECRET_KEY: Get it from your Paddle account
Logger
- LOGGER_CONSOLE_THRESHOLD: Threshold level of the console transporter.
Frontend
- DOMAIN: Domain of your frontend app
- PUBLIC_PADDLE_KEY: Get it from your Paddle account (Not needed when running locally)
- API_DOMAIN: Domain of your backend instance (used for server side requests)
- CLIENTSIDE_API_DOMAIN: Domain of your backend instance (used for client side requests)
- STORAGE_DOMAIN=Domain of your bucket (used for storing images)
Redis
- REDIS_ENABLE: Whether to use external Redis store or not
- REDIS_HOST: Redis instance host
- REDIS_PORT: Redis instance port
- REDIS_PASSWORD: Redis instance password
- REDIS_TTL: Redis ttl (in seconds)
Auth
- JWT_ACCESS_SECRET: Jwt secret (used for access tokens)
- JWT_REFRESH_SECRET: Jwt secret (used for refresh tokens)
Safe Browsing API
- SAFE_URL_ENABLE: Whether to use Google Safe Browsing API or not
- SAFE_URL_GOOGLE_SAFE_BROWSING_API_KEY: Get it from https://developers.google.com/safe-browsing/v4/get-started
Novu
- NOVU_API_KEY: Get it from https://novu.co/, you don't need this when running locally (just verify your email from the database)
Happy Hacking !
Change my plan on development
If you want to change your plan on developemnt (Assuming you have a local instance of PostgreSQL running on port 5432 and you don't have Paddle configured):
- Register locally on the app.
- Go to your database and create a new row in the
Subscription
table:id
: 1userId
: (you can find your user id in theUser
table)plan
: (FREE / PRO / BUSINESS)status
: activeendDate
: Choose a date in the futurescheduledToBeCancelled
: falseendDate
: empty (NULL)nextBilledAt
: empty (NULL)createdAt
: current dateupdatedAt
: current date
- Relogin to the app (refresh the JWT token)
- You can now access the premium features.
๐ฑโ๐ป Usage
Simply copy and paste a URL into the provided area. Then click shorten URL! Your URL has now been shortened!
<div align="center"> <img src="docs/reduced-to.gif" width="600" height="254"> </div> <p align="right">(<a href="#readme-top">back to top</a>)</p> <!-- ROADMAP -->๐งฑ Roadmap
- Migrate backend to NestJS
- Migrate frontend to Qwik
- Better README
- Generate QRCode
- Split front-end into components
- Better UI
- Animations
- Logo
- Dark/Light mode
- Improve front-end components
- Backend tests
- Migration to Nx
- Split backend into libs
- Support k8s deployment (helm)
- Front-end Tests
- Logs
- Add a statistics page
- Add more ideas
Just create a Pull request already ๐
See the open issues for a full list of proposed features (and known issues).
<p align="right">(<a href="#readme-top">back to top</a>)</p> <!-- CONTRIBUTING -->๐ฅ Contributing
Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star โญ!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature
) - Commit your Changes (
git commit -m 'Add some AmazingFeature'
) - Push to the Branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
๐ Contributors
<a href = "https://github.com/origranot/reduced.to/graphs/contributors"> <img src = "https://contrib.rocks/image?repo=origranot/reduced.to"/> </a> <p align="right">(<a href="#readme-top">back to top</a>)</p> <!-- LICENSE -->๐ License
This project is licensed under the terms of the MIT License
<p align="right">(<a href="#readme-top">back to top</a>)</p> <!-- CONTACT -->๐ Contact
Project Link: https://github.com/origranot/reduced.to
<p align="right">(<a href="#readme-top">back to top</a>)</p> <!-- MARKDOWN LINKS & IMAGES -->