{"id":23400032,"url":"https://github.com/dkhoa-happy/yc-directory","last_synced_at":"2025-06-13T22:07:25.755Z","repository":{"id":266295585,"uuid":"895376802","full_name":"Dkhoa-Happy/YC-Directory","owner":"Dkhoa-Happy","description":"Learning Next.js and Sanity journey.","archived":false,"fork":false,"pushed_at":"2025-04-04T07:32:44.000Z","size":1165,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-04T08:29:15.670Z","etag":null,"topics":["educational-project","nextjs","react19"],"latest_commit_sha":null,"homepage":"https://yc-directory-mu-black.vercel.app/","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/Dkhoa-Happy.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}},"created_at":"2024-11-28T05:07:19.000Z","updated_at":"2025-04-04T07:32:48.000Z","dependencies_parsed_at":"2024-12-03T15:38:39.412Z","dependency_job_id":"8ca6c195-8413-4b6b-b22b-9820133ded2c","html_url":"https://github.com/Dkhoa-Happy/YC-Directory","commit_stats":null,"previous_names":["dkhoa-happy/yc-directory"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Dkhoa-Happy/YC-Directory","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dkhoa-Happy%2FYC-Directory","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dkhoa-Happy%2FYC-Directory/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dkhoa-Happy%2FYC-Directory/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dkhoa-Happy%2FYC-Directory/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Dkhoa-Happy","download_url":"https://codeload.github.com/Dkhoa-Happy/YC-Directory/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dkhoa-Happy%2FYC-Directory/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259727134,"owners_count":22902181,"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":["educational-project","nextjs","react19"],"created_at":"2024-12-22T10:18:47.141Z","updated_at":"2025-06-13T22:07:25.718Z","avatar_url":"https://github.com/Dkhoa-Happy.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cbr /\u003e\n    \u003ca href=\"#\" target=\"_blank\"\u003e\n      \u003cimg src=\"https://github.com/user-attachments/assets/471e2baa-8781-43b8-aaed-62e313d03e99\" alt=\"Project Banner\"\u003e\n    \u003c/a\u003e\n  \u003cbr /\u003e\n\n  \u003cdiv\u003e\n    \u003cimg src=\"https://img.shields.io/badge/-Typescript-black?style=for-the-badge\u0026logoColor=white\u0026logo=react\u0026color=3178C6\" alt=\"typescript\" /\u003e\n    \u003cimg src=\"https://img.shields.io/badge/-Next_JS-black?style=for-the-badge\u0026logoColor=white\u0026logo=nextdotjs\u0026color=000000\" alt=\"nextdotjs\" /\u003e\n    \u003cimg src=\"https://img.shields.io/badge/-Tailwind_CSS-black?style=for-the-badge\u0026logoColor=white\u0026logo=tailwindcss\u0026color=06B6D4\" alt=\"tailwindcss\" /\u003e\n    \u003cimg src=\"https://img.shields.io/badge/-Sanity-black?style=for-the-badge\u0026logoColor=white\u0026logo=sanity\u0026color=F03E2F\" alt=\"sanity\" /\u003e\n\n  \u003c/div\u003e\n\n\u003ch3 align=\"center\"\u003eStartup Directory Platform\u003c/h3\u003e\n\n   \u003cdiv align=\"center\"\u003e\n     Learn to build this project step by step with detailed tutorials from my teacher at \u003ca href=\"https://www.youtube.com/@javascriptmastery/videos\" target=\"_blank\"\u003e\u003cb\u003eJavaScript Mastery\u003c/b\u003e\u003c/a\u003e YouTube. Join the JSM family!\n    \u003c/div\u003e\n\u003c/div\u003e\n\n## 📋 \u003ca name=\"table\"\u003eTable of Contents\u003c/a\u003e\n\n1. 🤖 [Introduction](#introduction)\n2. ⚙️ [Tech Stack](#tech-stack)\n3. 🔋 [Features](#features)\n4. 🤸 [Quick Start](#quick-start)\n5. 🕸️ [Snippets (Code to Copy)](#snippets)\n6. 🔗 [Assets](#links)\n7. 🚀 [More](#more)\n\n## 🚨 Tutorial\n\nThis repository contains the code corresponding to an in-depth tutorial available on my teacher's YouTube channel, \u003ca href=\"https://www.youtube.com/@javascriptmastery/videos\" target=\"_blank\"\u003e\u003cb\u003eJavaScript Mastery\u003c/b\u003e\u003c/a\u003e.\n\nIf you prefer visual learning, this is the perfect resource for you. Follow the tutorial to learn how to build projects like these step-by-step in a beginner-friendly manner!\n\n\u003ca href=\"https://youtu.be/Zq5fmkH0T78?feature=shared\" target=\"_blank\"\u003e\u003cimg src=\"https://github.com/sujatagunale/EasyRead/assets/151519281/1736fca5-a031-4854-8c09-bc110e3bc16d\" /\u003e\u003c/a\u003e\n\n## \u003ca name=\"introduction\"\u003e🤖 Introduction\u003c/a\u003e\n\nA Next.js15 platform where entrepreneurs can submit their startup ideas for virtual pitch competitions, browse other pitches, and gain exposure through a clean minimalistic design for a smooth user experience.\n\nIf you're getting started and need assistance or face any bugs, join our active Discord community with over 34k+ members. It's a place where people help each other out.\n\n\u003ca href=\"https://discord.com/invite/n6EdbFJ\" target=\"_blank\"\u003e\u003cimg src=\"https://github.com/sujatagunale/EasyRead/assets/151519281/618f4872-1e10-42da-8213-1d69e486d02e\" /\u003e\u003c/a\u003e\n\n## \u003ca name=\"tech-stack\"\u003e⚙️ Tech Stack\u003c/a\u003e\n\n- React 19\n- Next.js 15\n- Sanity\n- TailwindCSS\n- ShadCN\n- TypeScript\n\n## \u003ca name=\"features\"\u003e🔋 Features\u003c/a\u003e\n\n👉 **Live Content API**: Displays the latest startup ideas dynamically on the homepage using Sanity's Content API.\n\n👉 **GitHub Authentication**: Allows users to log in easily using their GitHub account.\n\n👉 **Pitch Submission**: Users can submit startup ideas, including title, description, category, and multimedia links (\nimage or video).\n\n👉 **View Pitches**: Browse through submitted ideas with filtering options by category.\n\n👉 **Pitch Details Page**: Click on any pitch to view its details, with multimedia and description displayed.\n\n👉 **Profile Page**: Users can view the list of pitches they've submitted.\n\n👉 **Editor Picks**: Admins can highlight top startup ideas using the \"Editor Picks\" feature managed via Sanity Studio.\n\n👉 **Views Counter**: Tracks the number of views for each pitch instead of an upvote system.\n\n👉 **Search**: Search functionality to load and view pitches efficiently.\n\n👉 **Minimalistic Design**: Fresh and simple UI with only the essential pages for ease of use and a clean aesthetic.\n\nand many more, including the latest **React 19**, **Next.js 15** and **Sanity** features alongside code architecture and\nreusability\n\n## \u003ca name=\"quick-start\"\u003e🤸 Quick Start\u003c/a\u003e\n\nFollow these steps to set up the project locally on your machine.\n\n**Prerequisites**\n\nMake sure you have the following installed on your machine:\n\n- [Git](https://git-scm.com/)\n- [Node.js](https://nodejs.org/en)\n- [npm](https://www.npmjs.com/) (Node Package Manager)\n\n**Cloning the Repository**\n\n```bash\ngit clone https://github.com/Dkhoa-Happy/pitchify.git\ncd pitchify\n```\n\n**Installation**\n\nInstall the project dependencies using npm:\n\n```bash\nnpm install\n```\n\n**Set Up Environment Variables**\n\nCreate a new file named `.env.local` in the root of your project and add the following content:\n\n```env\nNEXT_PUBLIC_SANITY_PROJECT_ID=\nNEXT_PUBLIC_SANITY_DATASET=\nNEXT_PUBLIC_SANITY_API_VERSION='vX'\nSANITY_TOKEN=\n\nAUTH_SECRET= \nAUTH_GITHUB_ID=\nAUTH_GITHUB_SECRET=\n```\n\nReplace the placeholder values with your actual Sanity credentials. You can obtain these credentials by signing up \u0026\ncreating a new project on the [Sanity website](https://www.sanity.io/).\n\n**Running the Project**\n\n```bash\nnpm run dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) in your browser to view the project.\n\n## \u003ca name=\"snippets\"\u003e🕸️ Snippets\u003c/a\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003etailwind.config.ts\u003c/code\u003e\u003c/summary\u003e\n\n```typescript\nimport type {Config} from \"tailwindcss\";\n\nconst config: Config = {\n    darkMode: [\"class\"],\n    content: [\n        \"./pages/**/*.{js,ts,jsx,tsx,mdx}\",\n        \"./components/**/*.{js,ts,jsx,tsx,mdx}\",\n        \"./app/**/*.{js,ts,jsx,tsx,mdx}\",\n        \"./sanity/**/*.{js,ts,jsx,tsx,mdx}\",\n    ],\n    theme: {\n        extend: {\n            screens: {\n                xs: \"475px\",\n            },\n            colors: {\n                primary: {\n                    \"100\": \"#FFE8F0\",\n                    DEFAULT: \"#EE2B69\",\n                },\n                secondary: \"#FBE843\",\n                black: {\n                    \"100\": \"#333333\",\n                    \"200\": \"#141413\",\n                    \"300\": \"#7D8087\",\n                    DEFAULT: \"#000000\",\n                },\n                white: {\n                    \"100\": \"#F7F7F7\",\n                    DEFAULT: \"#FFFFFF\",\n                },\n            },\n            fontFamily: {\n                \"work-sans\": [\"var(--font-work-sans)\"],\n            },\n            borderRadius: {\n                lg: \"var(--radius)\",\n                md: \"calc(var(--radius) - 2px)\",\n                sm: \"calc(var(--radius) - 4px)\",\n            },\n            boxShadow: {\n                100: \"2px 2px 0px 0px rgb(0, 0, 0)\",\n                200: \"2px 2px 0px 2px rgb(0, 0, 0)\",\n                300: \"2px 2px 0px 2px rgb(238, 43, 105)\",\n            },\n        },\n    },\n    plugins: [require(\"tailwindcss-animate\"), require(\"@tailwindcss/typography\")],\n};\n\nexport default config;\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003eglobals.css\u003c/code\u003e\u003c/summary\u003e\n\n```css\n@import url(\"https://fonts.googleapis.com/css2?family=Work+Sans:ital,wght@0,100..900;1,100..900\u0026display=swap\");\n\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n    :root {\n        --radius: 0.5rem;\n    }\n}\n\n@layer utilities {\n    .flex-between {\n        @apply flex justify-between items-center;\n    }\n\n    .text-30-extrabold {\n        @apply text-[30px] font-extrabold text-white;\n    }\n\n    .text-30-bold {\n        @apply text-[30px] font-bold text-black;\n    }\n\n    .text-30-semibold {\n        @apply font-semibold text-[30px] text-black;\n    }\n\n    .text-26-semibold {\n        @apply font-semibold text-[26px] text-black;\n    }\n\n    .text-24-black {\n        @apply text-[24px] font-black text-black;\n    }\n\n    .text-20-medium {\n        @apply font-medium text-[20px] text-black;\n    }\n\n    .text-16-medium {\n        @apply font-medium text-[16px] text-black;\n    }\n\n    .text-14-normal {\n        @apply font-normal text-sm text-white-100/80;\n    }\n\n    .pink_container {\n        @apply w-full bg-primary min-h-[530px] pattern flex justify-center items-center flex-col py-10 px-6;\n    }\n\n    .tag {\n        @apply bg-secondary px-6 py-3 font-work-sans font-bold rounded-sm uppercase relative tag-tri;\n    }\n\n    .heading {\n        @apply uppercase bg-black px-6 py-3 font-work-sans font-extrabold text-white sm:text-[54px] sm:leading-[64px] text-[36px] leading-[46px] max-w-5xl text-center my-5;\n    }\n\n    .sub-heading {\n        @apply font-medium text-[20px] text-white max-w-2xl text-center break-words;\n    }\n\n    .section_container {\n        @apply px-6 py-10 max-w-7xl mx-auto;\n    }\n\n    .card_grid {\n        @apply grid md:grid-cols-3 sm:grid-cols-2 gap-5;\n    }\n\n    .card_grid-sm {\n        @apply grid sm:grid-cols-2 gap-5;\n    }\n\n    .no-result {\n        @apply text-black-100 text-sm font-normal;\n    }\n\n    /* profile */\n    .profile_container {\n        @apply w-full pb-10 pt-20 px-6 max-w-7xl mx-auto lg:flex-row flex-col flex gap-10;\n    }\n\n    .profile_card {\n        @apply w-80 px-6 pb-6 pt-20 flex flex-col justify-center items-center bg-primary border-[5px] border-black shadow-100 rounded-[30px] relative z-0 h-fit max-lg:w-full;\n    }\n\n    .profile_title {\n        @apply w-11/12 bg-white border-[5px] border-black rounded-[20px] px-5 py-3 absolute -top-9 after:absolute after:content-[''] after:-top-1 after:right-0 after:-skew-y-6 after:bg-black after:-z-[1] after:rounded-[20px] after:w-full after:h-[60px] before:absolute before:content-[''] before:-bottom-1 before:left-0  before:-skew-y-6 before:w-full before:h-[60px] before:bg-black  before:-z-[1] before:rounded-[20px] shadow-100;\n    }\n\n    .profile_image {\n        @apply rounded-full object-cover border-[3px] border-black;\n    }\n\n    /* idea details */\n    .divider {\n        @apply border-dotted bg-zinc-400 max-w-4xl my-10 mx-auto;\n    }\n\n    .view_skeleton {\n        @apply bg-zinc-400 h-10 w-24 rounded-lg fixed bottom-3 right-3;\n    }\n\n    /* navbar */\n    .avatar {\n        @apply p-0 focus-visible:ring-0 bg-none rounded-full drop-shadow-md !important;\n    }\n\n    .dropdown-menu {\n        @apply w-56 border-[5px] border-black bg-white p-5 rounded-2xl !important;\n    }\n\n    .login {\n        @apply border-[5px] py-4 border-black bg-white text-black relative shadow-100 font-work-sans font-medium hover:shadow-none transition-all duration-500 !important;\n    }\n\n    /* searchform */\n    .search-form {\n        @apply max-w-3xl w-full min-h-[80px] bg-white border-[5px] border-black rounded-[80px] text-[24px] mt-8 px-5 flex flex-row items-center gap-5;\n    }\n\n    .search-input {\n        @apply flex-1 font-bold placeholder:font-semibold placeholder:text-black-100 w-full h-auto outline-none;\n    }\n\n    .search-btn {\n        @apply size-[50px] rounded-full bg-black flex justify-center items-center !important;\n    }\n\n    /* startupcard */\n    .startup-card {\n        @apply bg-white border-[5px] border-black py-6 px-5 rounded-[22px] shadow-200 hover:border-primary transition-all duration-500 hover:shadow-300 hover:bg-primary-100;\n    }\n\n    .startup-card_date {\n        @apply font-medium text-[16px] bg-primary-100 px-4 py-2 rounded-full group-hover:bg-white-100;\n    }\n\n    .startup-card_desc {\n        @apply font-normal text-[16px] line-clamp-2 my-3 text-black-100 break-all;\n    }\n\n    .startup-card_img {\n        @apply w-full h-[164px] rounded-[10px] object-cover;\n    }\n\n    .startup-card_btn {\n        @apply rounded-full bg-black-200 font-medium text-[16px] text-white px-5 py-3 !important;\n    }\n\n    .startup-card_skeleton {\n        @apply w-full h-96 rounded-[22px] bg-zinc-400;\n    }\n\n    /* startupform */\n    .startup-form {\n        @apply max-w-2xl mx-auto bg-white my-10 space-y-8 px-6;\n    }\n\n    .startup-form_label {\n        @apply font-bold text-[18px] text-black uppercase;\n    }\n\n    .startup-form_input {\n        @apply border-[3px] border-black px-5 py-7 text-[18px] text-black font-semibold rounded-full mt-3 placeholder:text-black-300 !important;\n    }\n\n    .startup-form_textarea {\n        @apply border-[3px] border-black p-5 text-[18px] text-black font-semibold rounded-[20px] mt-3 placeholder:text-black-300 !important;\n    }\n\n    .startup-form_error {\n        @apply text-red-500 mt-2 ml-5;\n    }\n\n    .startup-form_editor {\n        @apply mt-3 border-[3px] border-black text-[18px] text-black font-semibold placeholder:text-black-300 !important;\n    }\n\n    .startup-form_btn {\n        @apply bg-primary border-[4px] border-black rounded-full p-5 min-h-[70px] w-full font-bold text-[18px] !important;\n    }\n\n    /* view */\n    .view-container {\n        @apply flex justify-end items-center mt-5 fixed bottom-3 right-3;\n    }\n\n    .view-text {\n        @apply font-medium text-[16px] bg-primary-100 px-4 py-2 rounded-lg capitalize;\n    }\n\n    .category-tag {\n        @apply font-medium text-[16px] bg-primary-100 px-4 py-2 rounded-full;\n    }\n\n    .pattern {\n        background-image: linear-gradient(\n                to right,\n                transparent 49.5%,\n                rgba(251, 232, 67, 0.2) 49.5%,\n                rgba(251, 232, 67, 0.6) 50.5%,\n                transparent 50.5%\n        );\n        background-size: 5% 100%;\n        background-position: center;\n        background-repeat: repeat-x;\n    }\n\n    .tag-tri {\n        @apply before:content-[''] before:absolute before:top-2 before:left-2 before:border-t-[10px] before:border-t-black before:border-r-[10px] before:border-r-transparent after:content-[''] after:absolute after:bottom-2 after:right-2 after:border-b-[10px] after:border-b-black after:border-l-[10px] after:border-l-transparent;\n    }\n}\n\n.w-md-editor-toolbar {\n    padding: 10px !important;\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003elib/utils.ts\u003c/code\u003e\u003c/summary\u003e\n\n```typescript\nimport {clsx, type ClassValue} from \"clsx\";\nimport {twMerge} from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n    return twMerge(clsx(inputs));\n}\n\nexport function parseServerActionResponse\u003cT\u003e(response: T) {\n    return JSON.parse(JSON.stringify(response));\n}\n\nexport function formatDate(date: string) {\n    return new Date(date).toLocaleDateString(\"en-US\", {\n        month: \"long\",\n        day: \"numeric\",\n        year: \"numeric\",\n    });\n}\n\nexport function formatNumber(number: number) {\n    if (number \u003e= 1000000) {\n        return (number / 1000000).toFixed(1).replace(/\\.0$/, \"\") + \"M\"; // Convert to millions\n    } else if (number \u003e= 1000) {\n        return (number / 1000).toFixed(1).replace(/\\.0$/, \"\") + \"k\"; // Convert to thousands\n    } else {\n        return number.toString(); // Return the number as is if below 1000\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003elib/validation.ts\u003c/code\u003e\u003c/summary\u003e\n\n```typescript\nimport {z} from \"zod\";\n\nexport const formSchema = z.object({\n    title: z.string().min(3, \"Title is required\").max(100, \"Title is too long\"),\n    description: z\n        .string()\n        .min(20, \"Description should be at least 20 characters\")\n        .max(500, \"Description is too long. Max 500 characters at most\"),\n    category: z\n        .string()\n        .min(3, \"Category should be at least 3 characters\")\n        .max(20, \"Category is too long. Max 20 characters at most\"),\n    link: z\n        .string()\n        .url(\"Invalid Image URL\")\n        .refine(async (url) =\u003e {\n            try {\n                const res = await fetch(url, {method: \"HEAD\"});\n                const contentType = res.headers.get(\"content-type\");\n                return contentType?.startsWith(\"image/\");\n            } catch {\n                return false;\n            }\n        }, \"URL must be a valid image\"),\n    pitch: z.string().min(10, \"Pitch should be at least 10 characters\"),\n});\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003ccode\u003ecomponents/Ping.tsx\u003c/code\u003e\u003c/summary\u003e\n\n```typescript jsx\nconst Ping = () =\u003e {\n    return (\n        \u003cdiv className=\"relative\"\u003e\n            \u003cdiv className=\"absolute -left-4 top-1\"\u003e\n                \u003cspan className=\"flex size-[11px]\"\u003e\n                    \u003cspan\n                        className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-primary opacity-75\"\u003e\u003c/span\u003e\n                    \u003cspan className=\"relative inline-flex size-[11px] rounded-full bg-primary\"\u003e\u003c/span\u003e\n                \u003c/span\u003e\n            \u003c/div\u003e\n        \u003c/div\u003e\n    );\n};\n\nexport default Ping;\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003e\u003ccode\u003ePLAYLIST_BY_SLUG_QUERY\u003c/code\u003e\u003c/summary\u003e\n\n```typescript\nexport const PLAYLIST_BY_SLUG_QUERY =\n  defineQuery(`*[_type == \"playlist\" \u0026\u0026 slug.current == $slug][0]{\n  _id,\n  title,\n  slug,\n  select[]-\u003e{\n    _id,\n    _createdAt,\n    title,\n    slug,\n    author-\u003e{\n      _id,\n      name,\n      slug,\n      image,\n      bio\n    },\n    views,\n    description,\n    category,\n    image,\n    pitch\n  }\n}`);\n```\n\n\u003c/details\u003e\n\n## \u003ca name=\"links\"\u003e🔗 Assets\u003c/a\u003e\n\n- Fonts and Assets used in the project can be found [here](https://drive.google.com/file/d/1OEFHnEq5pQFP86u8FOBLBBNxKPsbjjqU/view?usp=sharing)\n- [Learn Server Actions](https://youtu.be/FKZAXFjxlJI?feature=shared)\n- [Applicaton Workflow](https://miro.com/app/board/uXjVLT_tMdU=/?share_link_id=580854757703)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdkhoa-happy%2Fyc-directory","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdkhoa-happy%2Fyc-directory","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdkhoa-happy%2Fyc-directory/lists"}