{"id":27781226,"url":"https://github.com/jukelyn/badge-maker","last_synced_at":"2026-04-11T03:16:10.146Z","repository":{"id":290116689,"uuid":"961637070","full_name":"Jukelyn/badge-maker","owner":"Jukelyn","description":"A website that generates markdown badges using simpleicons icons.","archived":false,"fork":false,"pushed_at":"2025-04-27T00:19:19.000Z","size":1396,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-04-27T01:21:11.536Z","etag":null,"topics":["flask","flask-api","nextjs","python","radix","react","shadcn","shadcn-ui","tailwindcss","tsx","typescript"],"latest_commit_sha":null,"homepage":"https://badge-maker.jukelyn.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Jukelyn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-06T23:05:05.000Z","updated_at":"2025-04-27T00:19:22.000Z","dependencies_parsed_at":"2025-04-27T01:21:17.295Z","dependency_job_id":"a1345f36-bb78-4f51-85ad-0e1ff5f9c371","html_url":"https://github.com/Jukelyn/badge-maker","commit_stats":null,"previous_names":["jukelyn/badge-maker"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jukelyn%2Fbadge-maker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jukelyn%2Fbadge-maker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jukelyn%2Fbadge-maker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jukelyn%2Fbadge-maker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Jukelyn","download_url":"https://codeload.github.com/Jukelyn/badge-maker/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251702681,"owners_count":21630071,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flask","flask-api","nextjs","python","radix","react","shadcn","shadcn-ui","tailwindcss","tsx","typescript"],"created_at":"2025-04-30T12:43:18.003Z","updated_at":"2026-04-11T03:16:10.115Z","avatar_url":"https://github.com/Jukelyn.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \n### Status\n\n![PyPI](https://img.shields.io/pypi/v/simplepycons?logo=python\u0026logoColor=%23cccccc)\n![Simple Icons Ver](https://img.shields.io/badge/dynamic/regex?url=https%3A%2F%2Fraw.githubusercontent.com%2Fcarstencodes%2Fsimplepycons%2Frefs%2Fheads%2Fmain%2F.gitmodules\u0026search=%5C%5Bsubmodule%20%22vendor%5C%2Fsimple-icons%22%5C%5D%5B%5E%5C%5B%5D%2Bbranch%5Cs*%3D%5Cs*%28%3F%3Cversion%3E%5Cd%2B%5C.%5Cd%2B%5C.%5Cd%2B%3F%29\u0026replace=%24%3Cversion%3E\u0026flags=ims\u0026label=Simple%20Icons%20Version)\n![Latest Simple Icons Release](https://img.shields.io/github/v/release/simple-icons/simple-icons?label=Latest%20Simple%20Icons%20Release)\n\n![Docker Deploy Workflow Badge](https://github.com/Jukelyn/badge-maker/actions/workflows/docker-deploy.yaml/badge.svg)\n![CI-SFTP Workflow Badge](https://github.com/Jukelyn/badge-maker/actions/workflows/ci-sftp.yaml/badge.svg)\n\n### Built using\n\n![React](https://img.shields.io/badge/react-%2320232a.svg?style=for-the-badge\u0026logo=react\u0026logoColor=%2361DAFB)\n![TypeScript](https://img.shields.io/badge/typescript-%23007ACC.svg?style=for-the-badge\u0026logo=typescript\u0026logoColor=white)\n![Next JS](https://img.shields.io/badge/Next_JS-%23000000?style=for-the-badge\u0026logo=next.js\u0026logoColor=white)\n![TailwindCSS](https://img.shields.io/badge/tailwind_css-%2338B2AC.svg?style=for-the-badge\u0026logo=tailwind-css\u0026logoColor=white)\n![Python](https://img.shields.io/badge/python-%233776AB.svg?style=for-the-badge\u0026logo=python\u0026logoColor=white)\n![Flask](https://img.shields.io/badge/flask-%23000000.svg?style=for-the-badge\u0026logo=flask\u0026logoColor=white)\n\n### Deployed using\n\n![Ubuntu](https://img.shields.io/badge/Ubuntu-E95420?style=for-the-badge\u0026logo=ubuntu\u0026logoColor=white)\n![Docker](https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge\u0026logo=docker\u0026logoColor=white)\n![Node.js](https://img.shields.io/badge/node.js-6DA55F?style=for-the-badge\u0026logo=node.js\u0026logoColor=white)\n![Nginx Proxy Manager](https://img.shields.io/badge/nginx_proxy_manager-%23F15833.svg?style=for-the-badge\u0026logo=nginxproxymanager\u0026logoColor=white)\n\n\u003c/div\u003e\n\n## Table of Contents\n\n- [Introduction](#introduction)\n- [Local Development](#local-development)\n- [Deployment Workflows](#deployment-workflows)\n  - [Workflow Actions Secrets](#workflow-actions-secrets)\n  - [CI-SFTP Workflow](#ci-sftp-workflow)\n  - [Docker Deploy Workflow](#docker-deploy-workflow)\n\n# Introduction\nThe frontend of this web application is built with Next.JS (React) and TypeScript, while the backend utilizes Python's Flask framework. The input area can recieve comma seperated simpleicons slugs. All the available valid slugs can be found [here](https://badge-maker-api.jukelyn.com/available_icons). The outputted badges are made to used in markdown enviornments but since the url is in the output, that can be easily extracted and used in other places as well.\n\n# Local Development\n\nFirst, run the Python API:\n\n```bash\n$ python3 -m venv api/venv\n$ source api/venv/bin/activate\n$ pip install --upgrade pip  # (optional)\n$ pip install -r api/requirements.txt\n$ python api/run.py\n```\n\nthen, run the development (frontend) server:\n\n```bash\n$ pnpm run dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n\n# Deployment Workflows\n\nThere are two [workflows](https://docs.github.com/en/actions/writing-workflows/about-workflows) that I have written (`ci-sftp.yaml` and `docker-deploy.yaml`) that will automatically copy files from the repo to a server and use docker compose to deploy containers for the API and frontend.\n\n## Workflow Actions Secrets\nIn order for the workflows to work, there needs to be 5 repository secrets set. Here are some examples of what those are and example values:\n\n```yaml\nREMOTE_PATH = \"/home/user/git_repos/repo/\"\nSSH_SERVER = \"domain.tld\"\nSSH_SERVER_PORT = 12345\nSSH_USER = \"user\"\n```\n\nThe last one is the `SSH_PRIVATE_KEY`. For this one, you need to generate a SSH key pair for your server. You can re-use a key that you already have or make a new one just for this workflow. \n\n\u003cdetails\u003e\u003csummary\u003eCreating an SSH Key Pair\u003c/summary\u003e\nHere's how you would create a SSH key pair:\n\n```bash\n$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/example  # On your local machine\n$ ssh-copy-id -i ~/.ssh/example [USER]@[SERVER IP OR DOMAIN]  # Copies the key to the server\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eExample RSA Private Key\u003c/summary\u003e\n\n```bash\n-----BEGIN RSA PRIVATE KEY-----\nMIIBOwIBAAJBAMxovdzKkOsXrIs69c1SaaEM0aFlQjBf8MFwEYoyKAnzYstjUH+j\nwiTCQynKG5HUzwMISeRiocDoAzA19wFsgj0CAwEAAQJAFQiOHjhl3cW2MS7O+OK1\nuycOMcpb8OMJFg6JxNZREmeJfoK5SoOQtRr7m1IDhdwJZKk+tQUCSFnzzJMjtfgF\njQIhAPGr90xleWdHSwZpA21wudnRfqQwkkBPKNBIyG9O4wYPAiEA2Ic2kt3WXOo1\nEZEMKx2+UnBDjmjGWOojqii/1R9IHvMCIQCyxeNKQEZuf+6f7075xkm1N6PXEZce\nu3AVo8GhlVmbQQIhALOFZ3nc8x2WEOm/mJcm0eUHrvsjY0/U0D0EDAhnJySBAiBb\nzqzMjrgHcYIto69BD1iD+aASfhGM4PdXD5lxrM/G8A==\n-----END RSA PRIVATE KEY-----\n(leave newline here)\n```\n\nRead [this](https://jukelyn.com/posts/ssh-keys/) for more info on SSH keys.\n\n\u003c/details\u003e\n\nOnce you have the SSH public key on the server copy the contents of the *private* key to the `SSH_PRIVATE_KEY` repository secret. Don't forget the newline at the end.\n\n## CI-SFTP Workflow\nThe `CI-SFTP.yaml` workflow uses the SFTP-Deploy-Action from wlixcc. The workflow has one job that runs on a Linux server provided by GitHub. First, it downloads the code. It then copies all the files from your project to a specific folder on the server (specified by `REMOTE_PATH` and `SSH_SERVER`), and it first deletes everything that's already in that folder on the server. It also sets a short time limit for connecting to the server.\n\n## Docker Deploy Workflow\n\nThe `docker-deploy.yaml` uses the `docker compose` command so make sure that the server you are pushing to has the Docker Engine, CLI, and compose plugin. See [here](https://docs.docker.com/compose/install/#scenario-two-install-the-docker-compose-plugin) for more info on installing Docker (compose). It connects to the remote server using SSH with a private key stored securely as a secret. Once connected, it navigates to a specific directory and runs `docker compose up --build -d`. This command rebuilds the Docker images if needed and then starts or updates the containers defined in the `docker-compose.yaml` file on the server. Finally, it cleans up by deleting the temporary private key file from the workflow runner.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjukelyn%2Fbadge-maker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjukelyn%2Fbadge-maker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjukelyn%2Fbadge-maker/lists"}