Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/origranot/reduced.to
Free Modern URL Reducer. Make sure to share love by giving it a star.๐ Have a great day!
https://github.com/origranot/reduced.to
contributions-welcome css docker hacktoberfest html nestjs nodejs nx qwik tailwindcss typescript url-shortener
Last synced: about 2 months ago
JSON representation
Free Modern URL Reducer. Make sure to share love by giving it a star.๐ Have a great day!
- Host: GitHub
- URL: https://github.com/origranot/reduced.to
- Owner: origranot
- License: mit
- Created: 2020-03-18T21:38:54.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2024-04-30T13:33:10.000Z (5 months ago)
- Last Synced: 2024-05-01T00:47:53.034Z (5 months ago)
- Topics: contributions-welcome, css, docker, hacktoberfest, html, nestjs, nodejs, nx, qwik, tailwindcss, typescript, url-shortener
- Language: TypeScript
- Homepage: https://reduced.to
- Size: 19.8 MB
- Stars: 556
- Watchers: 2
- Forks: 257
- Open Issues: 21
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE-OF-CONDUCT.md
Awesome Lists containing this project
- awesome-opensource-israel - Reduced.to - Reduced.to is the FREE, Modern, and Open-Source URL Shortener. ![GitHub last commit](https://img.shields.io/github/last-commit/origranot/reduced.to?style=flat-square) ![GitHub top language](https://img.shields.io/github/languages/top/origranot/reduced.to?style=flat-square) ![GitHub stars](https://img.shields.io/github/stars/origranot/reduced.to?style=flat-square) (Projects by main language / typescript)
- awesome-hacktoberfest - reduced.to
README
[![Contributors][contributors-shield]][contributors-url]
[![Forks][forks-shield]][forks-url]
[![Stargazers][stars-shield]][stars-url]
[![Issues][issues-shield]][issues-url]
[![logo](https://raw.githubusercontent.com/origranot/reduced.to/ec59ee1dfe4c858b89d2d22935e2734d52794ea3/frontend/public/logo.svg)](https://reduced.to)[![Preview](/assets/images/preview.gif)](https://reduced.to)
Reduced.to is a modern web application that reduces the length of link URL. So it's easier to remember, share and track.
App
ยท
Report Bug
ยท
Request Feature
๐ Table of Contents
๐ About The Project
๐ Getting Started
- ๐ Prerequisites
- ๐ป Installation
- ๐ฉโ๐ป Development
- ๐ณ Docker
- ๐ Docker Compose
- ๐ท Configuration
- ๐ฑโ๐ป Usage
- ๐งฑ Roadmap
- ๐ฅ Contributing
- ๐ Contributors
- ๐ License
- ๐ Contact
## ๐ About The Project
### ๐ฅ Built With
List of frameworks/libraries used to bootstrap the project.
- [![NX][nx]][nx-url]
- [![Nest][nestjs]][nest-url]
- [![Qwik][qwik.js]][qwik-url]
- [![Tailwindcss][tailwindcss]][tailwindcss-url]
- [![Novu][novu]][novu-url]## ๐ Getting Started
### ๐ Prerequisites
List of things you need to run the project locally and how to install them.
- npm
```sh
npm install npm@latest -g
```
- docker
```sh
https://docs.docker.com/get-docker/
```### ๐ป Installation
1. [Fork](https://github.com/origranot/reduced.to/fork) / Clone this repository
2. Install NPM packages
```sh
npm install
```
3. Copy `.example.env` to `.env` and fill it properly (see [Configuration](#-configuration))
4. Make sure you have a local instance of PostgreSQL running on port 5432. If not, you can run it using docker:
```sh
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
```
5. Run Prisma migration from root folder:
```sh
npx nx migrate-dev prisma --name=init
```
6. Run the backend from root folder:
```sh
npx nx serve backend
```
7. Run the frontend from root folder:
```sh
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:
```sh
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.```sh
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](https://helm.sh/) chart.
1. Navigate to the `chart` directory (/docker/k8s/chart)
2. Update the values in the `values.yaml` file
3. Run the following command to deploy the app to your cluster:```sh
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):
1. Register locally on the app.
2. Go to your database and create a new row in the `Subscription` table:
- `id`: 1
- `userId`: (you can find your user id in the `User` table)
- `plan`: (FREE / PRO / BUSINESS)
- `status`: active
- `endDate`: Choose a date in the future
- `scheduledToBeCancelled`: false
- `endDate`: empty (NULL)
- `nextBilledAt`: empty (NULL)
- `createdAt`: current date
- `updatedAt`: current date
3. Relogin to the app (refresh the JWT token)
4. 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!
## ๐งฑ Roadmap
- [x] Migrate backend to NestJS
- [x] Migrate frontend to Qwik
- [x] Better README
- [x] Generate QRCode
- [x] Split front-end into components
- [x] Better UI
- [x] Animations
- [x] Logo
- [x] Dark/Light mode
- [ ] Improve front-end components
- [x] Backend tests
- [x] Migration to Nx
- [ ] Split backend into libs
- [ ] Support k8s deployment (helm)
- [ ] Front-end Tests
- [ ] Logs
- [ ] Add a statistics page
- [ ] Add more ideasJust create a [Pull request](https://github.com/origranot/reduced.to/pulls) already ๐
_See the [open issues](https://github.com/origranot/reduced.to/issues) for a full list of proposed features (and known issues)._
## ๐ฅ 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 โญ!1. Fork the Project
2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the Branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request## ๐ Contributors
## ๐ License
This project is licensed under the terms of the [MIT License](LICENSE)
## ๐ Contact
Project Link: [https://github.com/origranot/reduced.to](https://github.com/origranot/reduced.to)
[contributors-shield]: https://img.shields.io/github/contributors/origranot/reduced.to.svg?style=for-the-badge
[contributors-url]: https://github.com/origranot/reduced.to/graphs/contributors
[forks-shield]: https://img.shields.io/github/forks/origranot/reduced.to.svg?style=for-the-badge
[forks-url]: https://github.com/origranot/reduced.to/network/members
[stars-shield]: https://img.shields.io/github/stars/origranot/reduced.to.svg?style=for-the-badge
[stars-url]: https://github.com/origranot/reduced.to/stargazers
[issues-shield]: https://img.shields.io/github/issues/origranot/reduced.to.svg?style=for-the-badge
[issues-url]: https://github.com/origranot/reduced.to/issues
[product-screenshot]: docs/gif.gif
[nx]: https://img.shields.io/static/v1?style=for-the-badge&message=Nx&color=143055&logo=Nx&logoColor=FFFFFF&label=
[nx-url]: https://nx.dev/
[nestjs]: https://img.shields.io/static/v1?style=for-the-badge&message=NestJS&color=E0234E&logo=NestJS&logoColor=FFFFFF&label=
[nest-url]: https://nestjs.com/
[qwik.js]: https://tinyurl.com/y67dv8ub
[qwik-url]: https://qwik.builder.io/
[tailwindcss]: https://img.shields.io/badge/tailwindcss-06B6D4?style=for-the-badge&logo=tailwindcss&logoColor=fff
[tailwindcss-url]: https://tailwindcss.com
[novu]: https://img.shields.io/badge/Novu-000000?style=for-the-badge&logo=novu&color=F30F8A
[novu-url]: https://novu.co/