Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

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!

Awesome Lists containing this project

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



  1. ๐ŸŒ About The Project



  2. ๐Ÿš€ Getting Started


  3. ๐Ÿฑโ€๐Ÿ’ป Usage

  4. ๐Ÿงฑ Roadmap

  5. ๐Ÿฅ‡ Contributing

  6. ๐Ÿ† Contributors

  7. ๐Ÿ“ License

  8. ๐Ÿ’Œ 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]

(back to top)

## ๐Ÿš€ 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.

(back to top)

## ๐Ÿฑโ€๐Ÿ’ป Usage

Simply copy and paste a URL into the provided area. Then click shorten URL! Your URL has now been shortened!



(back to top)

## ๐Ÿงฑ 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 ideas

Just 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)._

(back to top)

## ๐Ÿฅ‡ 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




(back to top)

## ๐Ÿ“ License

This project is licensed under the terms of the [MIT License](LICENSE)

(back to top)

## ๐Ÿ’Œ Contact

Project Link: [https://github.com/origranot/reduced.to](https://github.com/origranot/reduced.to)

(back to top)

[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/