{"ayfri":{"bio":"I am a student, 23, programming enthusiast, retro-gaming fan and gaming, I've done many projects such as Games, AIs, Discord Bots, libraries, data science etc.","created_at":"2017-12-01T10:50:48Z","followers":90,"following":77,"hireable":false,"html_url":"https://github.com/Ayfri","login":"Ayfri","name":"Ayfri","public_repos":112,"updated_at":"2026-04-28T02:02:22Z"},"repos":[{"archived":false,"commits_count":892,"contributors_count":9,"created_at":"2020-01-18T01:17:40Z","default_branch":"master","description":"This is an Advanced Command Handler that uses classes for commands.","fork":false,"forks_count":8,"full_name":"Advanced-Command-Handler/Advanced-Command-Handler","homepage":"https://ayfri.gitbook.io/advanced-command-handler/","html_url":"https://github.com/Advanced-Command-Handler/Advanced-Command-Handler","id":234664061,"is_template":false,"language":"TypeScript","name":"Advanced-Command-Handler","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/78546662?v=4","events_url":"https://api.github.com/users/Advanced-Command-Handler/events{/privacy}","followers_url":"https://api.github.com/users/Advanced-Command-Handler/followers","following_url":"https://api.github.com/users/Advanced-Command-Handler/following{/other_user}","gists_url":"https://api.github.com/users/Advanced-Command-Handler/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Advanced-Command-Handler","id":78546662,"login":"Advanced-Command-Handler","node_id":"MDEyOk9yZ2FuaXphdGlvbjc4NTQ2NjYy","organizations_url":"https://api.github.com/users/Advanced-Command-Handler/orgs","received_events_url":"https://api.github.com/users/Advanced-Command-Handler/received_events","repos_url":"https://api.github.com/users/Advanced-Command-Handler/repos","site_admin":false,"starred_url":"https://api.github.com/users/Advanced-Command-Handler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Advanced-Command-Handler/subscriptions","type":"Organization","url":"https://api.github.com/users/Advanced-Command-Handler"},"private":false,"pushed_at":"2025-03-21T13:43:29Z","readme_content":"# Advanced Command Handler\n\n[![npm](https://img.shields.io/npm/dt/advanced-command-handler?logo=npm&style=for-the-badge)](https://www.npmjs.com/package/advanced-command-handler)\n[![npm](https://img.shields.io/npm/v/advanced-command-handler?logo=npm&style=for-the-badge)](https://www.npmjs.com/package/advanced-command-handler)\n[![GitHub issues](https://img.shields.io/github/issues-raw/advanced-command-handler/advanced-command-handler?logo=github&style=for-the-badge)](https://github.com/advanced-command-handler/Advanced-Command-Handler/issues)\n![GitHub last commit (branch)](https://img.shields.io/github/last-commit/advanced-command-handler/advanced-command-handler/master?logo=github&style=for-the-badge)\n\n[![npm install](https://nodei.co/npm/advanced-command-handler.png?downloads=true&stars=true)](https://www.npmjs.com/package/advanced-command-handler)\n\nThis is an Advanced Command Handler for Discord Bots, which uses classes for commands & events. You have a plethora of utils like functions that everyone uses, functions for errors, functions for\ntedious things that everyone needs for a Discord Bot, and some classes to simplify Logging things and manipulating embeds.\n\n**Version 3.0 uses Discord.js v12, use 3.1 to use Discord.js v13.**\n\nThis library is here to simplify a lot developing Discord Bots and is far from being finished with every feature I want to add.<br>\nSo feel free to watch this repo for futures releases!\nFor now, it offers :\n\n- Command Handling\n- SubCommand Handling\n- Event Handling\n- Default message event & help command\n- A complete Logger\n- Some utilities function for errors, jsons and other\n- Typed arguments for commands\n\n**For more information on how to use it, see the Guide and the Documentation :**\n\n- [Documentation](https://advanced-command-handler.github.io/docs/) <br>\n- [Guide](https://ayfri.gitbook.io/advanced-command-handler/)\n\nYou can also see some examples that I've made [here](https://github.com/Ayfri/advanced-command-handler-examples).<br>\nFeel free to PR to these to update these and add features that this handler can offer!\n\n### That's all for now :)\n","size":1462,"stargazers_count":35,"topics":["bot","classes","command-handler","commandhandler-events","discord","discord-bot","discord-js","javascript","v12"],"updated_at":"2025-06-20T10:24:41Z","visibility":"public","watchers_count":2},{"archived":false,"commits_count":95,"contributors_count":0,"created_at":"2020-12-10T07:25:23Z","default_branch":"master","description":"A npm package that helps you create better discord.js Embeds.","fork":false,"forks_count":0,"full_name":"Advanced-Command-Handler/Discord.js-Better-Embed","homepage":"https://www.npmjs.com/package/discord.js-better-embed","html_url":"https://github.com/Advanced-Command-Handler/Discord.js-Better-Embed","id":320192785,"is_template":false,"language":"TypeScript","name":"Discord.js-Better-Embed","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/78546662?v=4","events_url":"https://api.github.com/users/Advanced-Command-Handler/events{/privacy}","followers_url":"https://api.github.com/users/Advanced-Command-Handler/followers","following_url":"https://api.github.com/users/Advanced-Command-Handler/following{/other_user}","gists_url":"https://api.github.com/users/Advanced-Command-Handler/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Advanced-Command-Handler","id":78546662,"login":"Advanced-Command-Handler","node_id":"MDEyOk9yZ2FuaXphdGlvbjc4NTQ2NjYy","organizations_url":"https://api.github.com/users/Advanced-Command-Handler/orgs","received_events_url":"https://api.github.com/users/Advanced-Command-Handler/received_events","repos_url":"https://api.github.com/users/Advanced-Command-Handler/repos","site_admin":false,"starred_url":"https://api.github.com/users/Advanced-Command-Handler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Advanced-Command-Handler/subscriptions","type":"Organization","url":"https://api.github.com/users/Advanced-Command-Handler"},"private":false,"pushed_at":"2025-05-25T00:25:03Z","readme_content":"[![npm](https://img.shields.io/npm/dt/discord.js-better-embed)](https://www.npmjs.com/package/discord.js-better-embed)\n[![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/Advanced-Command-Handler/Discord.js-Better-Embed)](https://github.com/Advanced-Command-Handler/Discord.js-Better-Embed)\n\n[![npm install](https://nodei.co/npm/discord.js-better-embed.png?downloads=true&stars=true)](https://www.npmjs.com/package/discord.js-better-embed)\n\n# Better-Embed\n\nA npm package for helping you create better Discord.js v14 Embeds.\n\n> [!NOTE]\n> Version `1.3.0` is compatible with Discord.js v13, but is deprecated.<br>\n> Version `1.2.1` is compatible with Discord.js v12, but is deprecated.\n\n## How to use + Documentation\n\nSee [here](https://github.com/Advanced-Command-Handler/Advanced-Command-Handler/wiki/BetterEmbed-and-templates).\n","size":80,"stargazers_count":2,"topics":["discord-js","discord-js-embed","discordjs","embed","templates"],"updated_at":"2025-07-31T14:27:07Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":35,"contributors_count":2,"created_at":"2020-09-20T17:13:53Z","default_branch":"master","description":"A list of examples for my Advanced Command Handler.","fork":false,"forks_count":2,"full_name":"Advanced-Command-Handler/advanced-command-handler-examples","homepage":null,"html_url":"https://github.com/Advanced-Command-Handler/advanced-command-handler-examples","id":297125321,"is_template":false,"language":"JavaScript","name":"advanced-command-handler-examples","open_issues_count":5,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/78546662?v=4","events_url":"https://api.github.com/users/Advanced-Command-Handler/events{/privacy}","followers_url":"https://api.github.com/users/Advanced-Command-Handler/followers","following_url":"https://api.github.com/users/Advanced-Command-Handler/following{/other_user}","gists_url":"https://api.github.com/users/Advanced-Command-Handler/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Advanced-Command-Handler","id":78546662,"login":"Advanced-Command-Handler","node_id":"MDEyOk9yZ2FuaXphdGlvbjc4NTQ2NjYy","organizations_url":"https://api.github.com/users/Advanced-Command-Handler/orgs","received_events_url":"https://api.github.com/users/Advanced-Command-Handler/received_events","repos_url":"https://api.github.com/users/Advanced-Command-Handler/repos","site_admin":false,"starred_url":"https://api.github.com/users/Advanced-Command-Handler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Advanced-Command-Handler/subscriptions","type":"Organization","url":"https://api.github.com/users/Advanced-Command-Handler"},"private":false,"pushed_at":"2024-06-18T06:32:08Z","readme_content":"# Advanced Command Handler Examples\r\n\r\nThis repo contains some templates for my library [advanced command handler](https://github.com/Ayfri/Advanced-Command-Handler).\r\n\r\n| Name       | Library version using | Description                                                            |\r\n| ---------- | --------------------- | ---------------------------------------------------------------------- |\r\n| TS-Bot     | 2.4.0                 | Simple TypeScript example with ready event & test command.             |\r\n| Simple-Bot | 2.4.0                 | Simple JavaScript example with ready event, help, say & test commands. |\r\n\r\nFeel free to complete the examples or add new ones.\r\n","size":67,"stargazers_count":3,"topics":["advanced-command-handler","bot","command-handler"],"updated_at":"2021-05-29T03:13:35Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":36,"contributors_count":0,"created_at":"2025-09-22T16:51:08Z","default_branch":"main","description":"A p5.js + a* path algorithm small experiment.","fork":false,"forks_count":0,"full_name":"Ayfri/A-Follow","homepage":"https://afollow.ayfri.com/","html_url":"https://github.com/Ayfri/A-Follow","id":1061990312,"is_template":false,"language":"TypeScript","name":"A-Follow","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-06T19:08:33Z","readme_content":"# AFollow\n\nAFollow is an interactive web application demonstrating the A* pathfinding algorithm using p5.js. Watch as a player navigates through a grid-based environment, finding optimal paths around obstacles in real-time.\n\n## Features\n\n- **Real-time A* Pathfinding**: Interactive visualization of the A* algorithm with live path calculation\n- **Dynamic Player Movement**: Player automatically follows the calculated path at adjustable speeds\n- **Interactive Grid Editing**: \n  - Left-click and drag to draw walls/obstacles\n  - Right-click and drag to erase walls\n  - Hold Shift while dragging for straight lines\n- **Customizable Controls**:\n  - Adjust player movement speed\n  - Change grid cell size\n  - Customize colors for all visual elements (background, walls, path, grid, player)\n- **Procedural Generation**:\n  - Generate random mazes using recursive backtracking\n  - Create random obstacle grids with adjustable density\n- **Persistent Settings**: All preferences are automatically saved to localStorage\n- **Responsive Design**: Adapts to different screen sizes\n- **Collapsible UI**: Minimize controls to focus on the visualization\n\n## Technologies\n\n- **p5.js**: Creative coding library for interactive graphics and animations\n- **A* Algorithm**: Efficient pathfinding with Manhattan distance heuristic\n- **TypeScript**: Type-safe JavaScript for better development experience\n- **Vite**: Fast build tool and development server\n- **HTML5 Canvas**: Hardware-accelerated graphics rendering\n\n## How It Works\n\nThe application uses the A* pathfinding algorithm to find the shortest path from the player's current position to the mouse cursor position. The algorithm:\n\n1. Maintains an open list of nodes to evaluate and a closed list of evaluated nodes\n2. Calculates costs: g-cost (distance from start), h-cost (estimated distance to end), f-cost (total)\n3. Explores neighboring cells in 4 directions (up, down, left, right)\n4. Reconstructs the optimal path once the target is reached\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js (version 16 or higher)\n- pnpm package manager\n\n### Installation\n\n1. Clone the repository:\n   ```bash\n   git clone https://github.com/Ayfri/A-Follow.git\n   cd A-Follow\n   ```\n\n2. Install dependencies:\n   ```bash\n   pnpm install\n   ```\n\n3. Run the development server:\n   ```bash\n   pnpm run dev\n   ```\n\n4. Open your browser to `http://localhost:5173` to see the A* pathfinding experiment.\n\n## Usage\n\n### Basic Interaction\n- **Move the mouse** to set the target position for pathfinding\n- **Left-click and drag** on the grid to create walls/obstacles\n- **Right-click and drag** to remove walls\n- **Hold Shift** while dragging to draw straight lines\n\n### UI Controls\n- **Speed Slider**: Adjust how fast the player moves along the path\n- **Grid Size Slider**: Change the size of grid cells\n- **Color Pickers**: Customize the appearance of different elements\n- **Generate Random Maze**: Create a perfect maze using recursive backtracking\n- **Generate Random Grid**: Fill the grid with random obstacles based on probability\n- **Random Grid Probability**: Adjust the density of random obstacles\n\n### Keyboard Shortcuts\n- **Shift + Drag**: Draw straight lines when creating walls\n\n## Build\n\nTo build for production:\n```bash\npnpm run build\n```\n\n## Preview\n\nTo preview the production build:\n```bash\npnpm run preview\n```\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request. Areas for improvement include:\n\n- Additional pathfinding algorithms (Dijkstra, BFS, etc.)\n- More maze generation algorithms\n- Performance optimizations\n- Mobile touch support\n- Export/import grid configurations\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n","size":83,"stargazers_count":0,"topics":["a-star-algorithm","game","p5js","typescript"],"updated_at":"2025-09-22T22:48:48Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":19,"contributors_count":0,"created_at":"2023-05-28T16:40:28Z","default_branch":"master","description":"A Geometry Dash-like game but run by an IA using Deep Reinforcement Learning.","fork":false,"forks_count":0,"full_name":"Ayfri/AI-GD","homepage":null,"html_url":"https://github.com/Ayfri/AI-GD","id":646515766,"is_template":false,"language":"GDScript","name":"AI-GD","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2025-07-07T14:45:20Z","readme_content":"# AI-GD\nA Geometry Dash-like game but run by an IA using Deep Reinforcement Learning.\n","size":91,"stargazers_count":0,"topics":[],"updated_at":"2025-07-07T14:45:23Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":49,"contributors_count":0,"created_at":"2022-12-22T01:05:25Z","default_branch":"master","description":"A first test about creating an AI using Deep Learning, will later change name when theme is found and AI is working.","fork":false,"forks_count":0,"full_name":"Ayfri/Ai-Test","homepage":null,"html_url":"https://github.com/Ayfri/Ai-Test","id":580987132,"is_template":false,"language":"Kotlin","name":"Ai-Test","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2025-09-05T20:10:50Z","readme_content":"# Ai-Test\n\nA first test about creating an AI using Deep Learning.<br>\nThe goal is to have the populations, which are dots to learn how to reach the goal with the less amount of steps possible.<br>\nThere are some obstacles, which are the walls.\n","size":167,"stargazers_count":0,"topics":[],"updated_at":"2025-09-05T20:10:53Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":75,"contributors_count":2,"created_at":"2023-05-23T08:17:14Z","default_branch":"master","description":"A game.","fork":false,"forks_count":1,"full_name":"Ayfri/Artificial-Infiltration","homepage":"","html_url":"https://github.com/Ayfri/Artificial-Infiltration","id":644294449,"is_template":false,"language":"Kotlin","name":"Artificial-Infiltration","open_issues_count":11,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2023-06-21T09:46:54Z","readme_content":"# Artificial-Infiltration\nA game.\n","size":11092,"stargazers_count":1,"topics":[],"updated_at":"2026-03-16T16:33:46Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":450,"contributors_count":2,"created_at":"2024-10-31T01:25:45Z","default_branch":"main","description":"A clicker game about atoms.","fork":false,"forks_count":2,"full_name":"Ayfri/Atom-Clicker","homepage":"https://atom-clicker.ayfri.com","html_url":"https://github.com/Ayfri/Atom-Clicker","id":881142599,"is_template":false,"language":"Svelte","name":"Atom-Clicker","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-12T20:41:59Z","readme_content":"# ⚛️ Atom Clicker\n\nWelcome to Atom Clicker, an engaging incremental game where you'll build your own atomic empire! Start small with individual atoms and work your way up to cosmic structures.\n\n[![GitHub](https://img.shields.io/github/stars/Ayfri/Atom-Clicker?style=social)](https://github.com/Ayfri/Atom-Clicker)\n[![Discord](https://img.shields.io/discord/493478524133572610?style=flat&logo=discord&logoColor=white&label=discord&color=5865F2)](https://discord.ayfri.com)\n[![Players](https://img.shields.io/badge/dynamic/json?label=Players&query=$.totalUsers&url=https://atom-clicker.ayfri.com/api/stats&color=blue)](https://atom-clicker.ayfri.com)\n\n🎮 [Play Now](https://atom-clicker.ayfri.com) | 💬 [Discord](https://discord.ayfri.com)\n\n![Atom Clicker Gameplay](static/ingame-screenshot.png)\n\n## 🎮 How to Play\n\n1. **Click the Atom:** Start by clicking the central atom to generate your first atoms.\n2. **Buy Buildings:** Use your atoms to purchase buildings that automatically generate more atoms for you.\n3. **Upgrade:** Enhance your buildings and clicking power through the upgrades menu.\n4. **Unlock Skills:** Spend your earned points in the Skill Tree to gain massive permanent boosts.\n5. **Reset for Power:** When progress slows down, perform a reset to gain powerful currencies like Protons and Electrons to further boost your empire.\n\n## ⚛️ Features\n\n### Core Mechanics\n- 🖱️ Click to generate atoms\n- 🏗️ Build and manage various structures:\n  - From tiny molecules to massive cosmic entities\n  - Each structure with unique production rates\n  - Level up your buildings to increase their efficiency\n\n### Progression Systems\n- 🌳 Extensive Skill Tree\n  - Unlock powerful multipliers\n  - Enhance your clicking power\n  - Boost your production capabilities\n  - Unlock automation features\n\n- 🎮 Multiple Reset Layers\n  - Each layer provides powerful bonuses\n  - Strategic decisions on when to reset\n  - Permanent progression rewards\n\n### Advanced Features\n- ⚡ Power-up System\n  - Random power-ups appear during gameplay\n  - Stack multiple effects\n  - Collect **Higgs Bosons** for permanent bonuses\n  - Upgrade their duration and effectiveness\n\n- 🤖 Automation\n  - Auto-buy buildings\n  - Auto-upgrade systems\n  - Optimize your production\n\n- 🟣 Photon Realm\n  - Unlock a mysterious gameplay dimension with interactive violet circles\n  - Discover rare **Excited Photons** for exotic upgrades\n\n### Social Features\n- 📊 Global Leaderboard\n- 🏆 Achievement System\n- 🔒 Secure Authentication\n\n## 🚀 Getting Started\n\n1. Install dependencies:\n```bash\npnpm install\n```\n\n2. Start the development server:\n```bash\npnpm dev\n```\n\n3. Build for production:\n```bash\npnpm build\n```\n\n## 🛠️ Built With\n\n- **Framework:** [SvelteKit](https://kit.svelte.dev/)\n- **Language:** [TypeScript](https://www.typescriptlang.org/)\n- **Styling:** [TailwindCSS](https://tailwindcss.com/)\n- **Graphics Engine:** [Pixi.js](https://pixijs.com/)\n- **Backend & Auth:** [Supabase](https://supabase.com/)\n- **Icons:** [Lucide Icons](https://lucide.dev)\n- **Flow Diagrams:** [Svelte Flow](https://svelteflow.dev)\n\n## 🌐 Deployment\n\nThis project is optimized for [Cloudflare Workers](https://workers.cloudflare.com/).\n\n```bash\n# Build for production\npnpm build\n```\n\nThe build output will be in the `.svelte-kit/cloudflare` directory, ready to be deployed.\n\n## 📝 License\nThis project is open source and available under the [GNU GPLv3 License](LICENSE).\n\n## 🤝 Contributing\nContributions, issues, and feature requests are welcome! Feel free to check the [issues page](https://github.com/Ayfri/Atom-Clicker/issues).\n","size":2327,"stargazers_count":15,"topics":["clicker","game","incremental","pixi","svelte"],"updated_at":"2026-02-26T01:08:36Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":39,"contributors_count":0,"created_at":"2022-10-10T07:00:18Z","default_branch":"master","description":"A breakout game made in Windows Forms and C#.","fork":false,"forks_count":0,"full_name":"Ayfri/AyBreak","homepage":"","html_url":"https://github.com/Ayfri/AyBreak","id":548777834,"is_template":false,"language":"C#","name":"AyBreak","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-10-29T13:09:43Z","readme_content":"<!-- TOC -->\n* [AyBreak](#aybreak)\n  * [What is it?](#what-is-it)\n    * [Theme](#theme)\n    * [Main objectives](#main-objectives)\n    * [Difficulties encountered](#difficulties-encountered)\n  * [How to play](#how-to-play)\n    * [Controls](#controls)\n  * [How to build](#how-to-build)\n    * [Debug specificities](#debug-specificities)\n<!-- TOC -->\n\n# AyBreak\n\nA breakout game made in Windows Forms and C#.\n\n## What is it?\n\nAyBreak is a simple breakout game made in Windows Forms and C#.\nIt has been made as a school project for Ynov in about 2 weeks.\nIt has been chosen between 6 different projects like platformer, pong, etc, and I chose to make a breakout game because I thought it would be the funniest to make and the most interesting to do.\n\n### Theme\n\nThere are no real theme in the game, but I tried to make it as simple as possible, with a simple background and a simple design.\nI created my own ball sprite and used powerups sprites from another game LBreakout HD, some are unused in the game.\n\n### Main objectives\n\n- [x] Make a breakout game\n- [x] Make a menu\n- [x] Make a score system\n- [x] Make a level system and selection screen\n- [x] Have a level system working with a file\n- [x] Make a pause menu\n- [x] Make a lives system\n- [x] Make a powerups system\n- [ ] Make a settings menu\n- [ ] Have perfect collisions\n- [ ] Make a level editor\n- [ ] Have different themes\n\n### Difficulties encountered\n\nThe main difficulty encountered was the collision detection.\nIt was hard to make it work with the ball and the bricks.\nIt is currently not perfect, but it works most of the time, and it's not a big problem while playing.\n\nThe second main difficulty was to polish the game while still having the problems of Windows Forms (like the flickering or the lack of transparency).\nIt was fixed by not using a lot of sprites (just colored rectangles) and by having a simple black background.\n\n## How to play\n\nUse the arrow keys to move the paddle and hit the ball. The ball will bounce off the paddle and the bricks. The game ends when the there are no more bricks.\nIf the ball hits the bottom of the screen, you lose a life. You have 5 lives.\nYou can spawn random powerups by breaking bricks.\nThe powerups are:\n- Ball no-clip\n- Ball speed up\n- Ball speed down\n- Increase paddle size\n- More ball\n- More life\n- Score add\n- Random\n\n### Controls\n\n- Left arrow key: Move paddle left\n- Right arrow key: Move paddle right\n- Mouse: Move paddle\n- Space: Launch balls\n- R: Restart balls\n- Escape: Pause game\n- B: Accelerate balls\n\n## How to build\n\n1. Clone the repository\n2. Open the solution in Visual Studio or Rider\n3. Build the solution using the build button\n4. Run the game using the run button\n\n### Debug specificities\n\nWhen the game is run in debug mode, you will start with 2 balls and a label will be shown for each brick, showing their health.\n","size":261,"stargazers_count":3,"topics":["breakout","csharp","windows-forms"],"updated_at":"2024-02-16T15:34:22Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":71,"contributors_count":2,"created_at":"2020-07-23T14:44:52Z","default_branch":"master","description":"Informations on me.","fork":false,"forks_count":2,"full_name":"Ayfri/Ayfri","homepage":"","html_url":"https://github.com/Ayfri/Ayfri","id":281978232,"is_template":false,"language":null,"name":"Ayfri","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-02-24T19:04:18Z","readme_content":"# Hi there, I'm Ayfri 👋\n### What do I do ?\nI'm a french student, coding mainly in Kotlin, PHP, TypeScript, Java, JavaScript, Python, Go and briefly other languages.<br>\nI do mainly games, discord bots, minecraft mods, useful libraries and other, I also love experimenting with new technologies and new types of projects.<br>\n<br>\nI have a lot of projects that aren't finished (like everybody).\n\n### Links\n\n- My Website : [ayfri.com](https://ayfri.com)\n- Discord : Ayfri\n- Discord Server : [CommunAyfri](https://discord.gg/BySjRNQ9Je)\n- Twitter : [Ayfri_](https://twitter.com/Ayfri_)\n- Twitch : [Ayfri_](https://www.twitch.tv/ayfri_)\n- Youtube : [Ayfri](https://www.youtube.com/c/Ayfri)\n\n#### Online Projects\n\n- Kore : [kore.ayfri.com](https://kore.ayfri.com)\n- PokeCards-Collector : [pokecards-collector.ayfri.com](https://pokecards-collector.ayfri.com)\n- Atom Clicker : [atom-clicker.ayfri.com](https://atom-clicker.ayfri.com)\n- Realtime-Todolist : [realtime-todolist.pages.dev](https://realtime-todolist.pages.dev)\n- Cursors-Draw : [cursors-draw.ayfri.com/](https://cursors-draw.ayfri.com/)\n- A*Follow : [afollow.ayfri.com/](https://afollow.ayfri.com/)\n\n#### Buy me a coffee :)\n\n[buymeacoffe.com/ayfri](https://buymeacoffee.com/ayfri) ☕\n\n### Technologies I use\n\n![Kotlin](https://img.shields.io/badge/Kotlin-black?style=flat-square&logo=kotlin&logoColor=9469c0)\n![Jetpack Compose](https://img.shields.io/badge/Jetpack%20Compose-black?style=flat-square&logo=jetpack-compose)\n![Gradle](https://img.shields.io/badge/Gradle-black?style=flat-square&logo=gradle&logoColor=1d5151)\n![Bun](https://img.shields.io/badge/Bun-black?style=flat-square&logo=bun&logoColor=fbf0df)\n![TypeScript](https://img.shields.io/badge/TypeScript-black?style=flat-square&logo=typescript&logoColor=3472a6)\n![Astro](https://img.shields.io/badge/Astro-black?style=flat-square&logo=astro)\n![Svelte](https://img.shields.io/badge/Svelte-black?style=flat-square&logo=svelte)\n![Tailwind](https://img.shields.io/badge/Tailwind-black?style=flat-square&logo=tailwindcss)\n![uv](https://img.shields.io/badge/uv-black?style=flat-square&logo=uv&logoColor=de5fe9)\n![Python](https://img.shields.io/badge/Python-black?style=flat-square&logo=python)\n![Jupyter](https://img.shields.io/badge/Jupyter-black?style=flat-square&logo=jupyter)\n![PHP](https://img.shields.io/badge/PHP-black?style=flat-square&logo=php&logoColor=787CB5)\n![Git](https://img.shields.io/badge/Git-black?style=flat-square&logo=git)\n![GitHub](https://img.shields.io/badge/GitHub-black?style=flat-square&logo=github)\n![Godot](https://img.shields.io/badge/Godot-black?style=flat-square&logo=godot-engine)\n\n### Tools I use to code\n\n![Intellij IDEA](https://img.shields.io/badge/Intellij%20Idea-black?style=flat-square&logo=intellij-idea)\n![WebStorm](https://img.shields.io/badge/WebStorm-black?style=flat-square&logo=webstorm)\n![CLion](https://img.shields.io/badge/CLion-black?style=flat-square&logo=clion)\n![PyCharm](https://img.shields.io/badge/PyCharm-black?style=flat-square&logo=pycharm)\n![Copilot](https://img.shields.io/badge/Copilot-black?style=flat-square&logo=githubcopilot)\n\n### Statistics on me\n[![profile for Ayfri at Stack Overflow, Q&A for professional and enthusiast programmers](https://stackoverflow.com/users/flair/12184583.png?theme=dark \"profile for Ayfri at Stack Overflow, Q&A for professional and enthusiast programmers\")](https://stackoverflow.com/users/12184583/ayfri)\n\n![Visitor Badge](https://visitor-badge.laobi.icu/badge?page_id=Ayfri&title=Visitors)\n![Followers Badge](https://img.shields.io/github/followers/Ayfri?label=Followers)\n![](https://hit.yhype.me/github/profile?user_id=34159136)\n\n<img src=\"https://wakatime.com/share/@Ayfri/2bf815af-309f-496b-bf38-b51abe150da5.svg\" />\n\n<a href=\"https://github.com/anuraghazra/github-readme-stats\">\n  <img align=\"left\" src=\"https://github-readme-stats.vercel.app/api/top-langs/?username=Ayfri&card_width=400&langs_count=10&hide_border=true&theme=nord\" />\n  <img align=\"left\" src=\"https://github-readme-stats.vercel.app/api?username=Ayfri&show_icons=trye&line_height=27&theme=nord&hide_border=true\" />\n  <img align=\"left\" src=\"https://github-readme-stats.vercel.app/api/wakatime?username=Ayfri&theme=nord&hide_border=true\" />\n</a>\n","size":114,"stargazers_count":2,"topics":["ayfri","discord-bots","typescript"],"updated_at":"2026-02-24T19:04:21Z","visibility":"public","watchers_count":2},{"archived":false,"commits_count":52,"contributors_count":3,"created_at":"2020-01-15T15:47:19Z","default_branch":"master","description":"This is a simple Command Handler with modules.","fork":false,"forks_count":0,"full_name":"Ayfri/Basic-CommandHandler","homepage":"","html_url":"https://github.com/Ayfri/Basic-CommandHandler","id":234114884,"is_template":true,"language":"JavaScript","name":"Basic-CommandHandler","open_issues_count":4,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-20T12:29:45Z","readme_content":"# Basic CommandHandler\n\nThis is a simple Command Handler using `module.exports` for a configuration, run function and help module for a help command auto-generated.\n\nI'd advice you to know JavaScript and Node.js before using it.<br>\nYou'll understand that this Command Handler is very basic and for a big projet you should probably use a better one.<br>\nI can recommend you the other one I've made : [Advanced Command Handler](https://github.com/Advanced-Command-Handler/Advanced-Command-Handler).\n\n## How to use it\n\nSimply clone this repo.\n```bash\ngit clone https://github.com/Ayfri/Basic-CommandHandler\n```\nSet the [configuration](#Configuration) and you're ready to go.\n\nIf you want to use Discord.js v12, use this command instead.\n```bash\ngit clone -b v12 https://github.com/Ayfri/Basic-CommandHandler\n```\nIt will clone the `v12` branch of this repo.\n\n## Configuration\n\nTo start the bot you have to start with NodeJS the `main.js` file. If you want the bot to be sharded, start with le `index.js` file. There is a configuration file, `informations/config.json`.\nIn `owners` you have to add your ID (in a String).\n\n## Templates\n\n### Command\n\n```js\nmodule.exports.run = async (client, message, args) => {\n\t// Code goes here.\n};\n\nmodule.exports.config = {\n\tcategory: '',\n\tname: __filename.slice(__dirname.length + 1, __filename.length - 3),\n\taliases: [],\n\tserverForced: false,\n};\n\nmodule.exports.help = {\n\tdescription: '',\n\tsyntax: ``,\n\texamples: ``,\n};\n```\n\nThe name of the command is the name of the file. All the props in the modules are required.\n\n### Event\n\n```js\nmodule.exports = async (client, event, args) => {\n\t// Code goes here.\n};\n```\n\n## Features\n\nThere are already managed categories :\n\n-   not-ready : Like owner category.\n-   owner : Owners only (configuration).\n-   administration : Only users that have the `ADMINISTRATOR` permission.\n-   moderation : Only users that have the `KICK_MEMBERS` permission.\n\nThe `client` object has added methods and props like :\n\n| Field name                  | Description                          |\n| --------------------------- | ------------------------------------ |\n| commands                    | Enmap Object.                        |\n| writeFile( Path, JSObject ) | Safely save your JSObject in a JSON. |\n","size":180,"stargazers_count":3,"topics":["bot","command-handler","discord-js"],"updated_at":"2025-02-06T18:30:44Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":18,"contributors_count":0,"created_at":"2021-07-27T16:54:19Z","default_branch":"master","description":"A package for using better lists.","fork":false,"forks_count":0,"full_name":"Ayfri/Better-Lists","homepage":null,"html_url":"https://github.com/Ayfri/Better-Lists","id":390060991,"is_template":false,"language":"TypeScript","name":"Better-Lists","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-08-01T18:10:01Z","readme_content":"# Better-List\n\n[![npm bundle size](https://img.shields.io/bundlephobia/min/better-list)](https://www.npmjs.com/package/better-list)<br>\n[![npm install](https://nodei.co/npm/better-list.png?downloads=true&stars=true)](https://www.npmjs.com/package/better-list)<br>\nA package for using better lists.\n\n## Installation\n\nTo install it, simply run this command :\n\n```bash\nnpm install better-list --save\n```\n\n## What it contains\n\nThis package contains all the methods that the Kotlin `MutableList`s contains with proper typings in a `List` class.\n\nIt may contains other useful classes and functions later if people ask for it.\n","size":15,"stargazers_count":0,"topics":[],"updated_at":"2021-08-01T18:10:04Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":26,"contributors_count":0,"created_at":"2021-01-19T23:51:01Z","default_branch":"master","description":"A little fun bot that I made. ","fork":false,"forks_count":1,"full_name":"Ayfri/BotCoin-Tycoon","homepage":null,"html_url":"https://github.com/Ayfri/BotCoin-Tycoon","id":331141089,"is_template":false,"language":"TypeScript","name":"BotCoin-Tycoon","open_issues_count":2,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-11-09T07:44:13Z","readme_content":"# BotCoin-Tycoon\n\nA little fun bot that I made.\n","size":30,"stargazers_count":0,"topics":[],"updated_at":"2021-02-04T11:16:33Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":9,"contributors_count":0,"created_at":"2025-07-05T18:40:24Z","default_branch":"main","description":"Cacayfri, find the url.","fork":false,"forks_count":0,"full_name":"Ayfri/Cacayfri","homepage":"","html_url":"https://github.com/Ayfri/Cacayfri","id":1014447830,"is_template":false,"language":"HTML","name":"Cacayfri","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-02-20T02:44:17Z","readme_content":null,"size":43,"stargazers_count":1,"topics":[],"updated_at":"2026-02-20T02:44:21Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":229,"contributors_count":5,"created_at":"2023-01-11T08:27:15Z","default_branch":"master","description":"A Tower Defense game in zombie apocalypse theme. You play with cats, and you have to defend your city from the zombie invasion using towers.","fork":false,"forks_count":1,"full_name":"Ayfri/Cat-aclysm-Claw-of-the-Dead","homepage":"","html_url":"https://github.com/Ayfri/Cat-aclysm-Claw-of-the-Dead","id":587640630,"is_template":false,"language":"GDScript","name":"Cat-aclysm-Claw-of-the-Dead","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2023-05-17T01:25:43Z","readme_content":"# Cat'aclysm: Claw of the Dead\n\nA Tower Defense game in zombie apocalypse theme.\nYou play with cats, and you have to defend your city from the zombie invasion using towers.\n\n## Engine\n\nThe game is made with [Godot Engine](https://godotengine.org/) 4.0.2.\n\n## GitHub\n\n#### Commit :\n\n**type(scope): subject**\n\n* **type**: type of commit\n* **scope**: the scope that is affected by this commit 1 to 2 word, can contain space\n* **subject**: a short description of the commit, around 20 words max, can contain capitalization or not\n\n#### Types :\n\n* `ci` : Change of files and scripts related to continuous integration\n* `chore` : Change of the build system or development tools\n* `feat` : New feature\n* `fix` : Bug fix\n* `perf` : Optimization of the code to improve performance\n* `refactor` : Modification of the code without changing functionality\n* `style` : Change to the code style\n* `tweak` : Small change to the code that doesn't change the functionality\n\n#### Examples :\n\n```\nfeat(zombies): Add new pigeon zombie.\n```\n\n```\nfix(tower gui): fix tower name not being displayed correctly\n```\n\n```\nrefactor(animations): use animation player instead of animation tree for zombies\n```\n\n## Project Files :\n\nWe are following the Godot conventions as presented [here](https://docs.godotengine.org/en/latest/tutorials/best_practices/index.html).\nUse the built-in editor from Godot to code or use any JetBrains IDE to edit godot scripts but do not use any other IDE.\n\n### Code Architecture :\n\n```\n/.gitignore\n/project.godot\n/assets/fonts/**.ttf : fonts\n/assets/localization/**.po : localization files\n/assets/scripts/**.gd : scripts\n/assets/musics/**.mp3 : musics\n/assets/sounds/**.ogg : sounds\n/assets/sprites/particles/**.png : particles\n/assets/sprites/towers/**.png : tower sprites\n/assets/sprites/zombies/**.png : zombie sprites\n/assets/themes/**.tres : themes\n/scenes/main.tscn : main scene\n/scenes/**.tscn : scenes\n```\n\n### Code Style :\n\n* Everything is in english\n* Use `snake_case` for files\n* Use `PascalCase` for nodes\n* Use `snake_case` for variables, constants, functions and signals\n* Use `PascalCase` for classes, enums and autoloads\n* Name every node with its function on the parent node (or the object name if root)\n* Type everything unless it's obvious (e.g. `var x: int = 1` is fine, but `var x := 1` is simpler)\n* Have all safe lines everywhere possible without creating too many variables (ex: if you need to access a node once, don't create a variable just for that)\n* Cast every node to their types, ex : `var player := $Player as Area2D;`\n* Keep lines relatively short (140 characters max)\n* Use tabs for indentation\n* Use `;` for every line\n\n## Exporting\n\nThe game is exported for the Windows platform on every release, other platforms may come later.\n\n## License\n\nThis project is licensed under the GNU General Public License v3.0 - see the [LICENSE](LICENSE) file for details.\n\n## Authors\n\n* [@Ayfri](https://github.com/Ayfri) : Lead dev & project manager\n* [@MateoPerrotNasi](https://github.com/MateoPerrotNasi) : Dev\n* [@AlexandreRocchi](https://github.com/AlexandreRocchi) : Dev\n* [@ThiboRodenburger](https://github.com/ThiboRodenburger) : Dev\n* [@xhmyjae](https://github.com/xhmyjae) : Game Artist & Tester\n* [@lunasphys](https://gihtub.com/lunasphys) : Game Artist\n","size":69789,"stargazers_count":7,"topics":["game","game-development","godot"],"updated_at":"2025-01-08T08:23:25Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":100,"contributors_count":2,"created_at":"2022-02-02T14:42:50Z","default_branch":"master","description":"A website to show streamers analysis.","fork":false,"forks_count":1,"full_name":"Ayfri/Cat-in-Space","homepage":"","html_url":"https://github.com/Ayfri/Cat-in-Space","id":454812431,"is_template":false,"language":"Go","name":"Cat-in-Space","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-03-22T08:30:46Z","readme_content":"# Cat In Space\n\nA website using Twitch API to get information about the current streamers in the Twitch community.\n\n","size":173,"stargazers_count":0,"topics":["api","go","twitch"],"updated_at":"2022-03-15T11:10:23Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":132,"contributors_count":0,"created_at":"2022-02-02T16:04:31Z","default_branch":"master","description":null,"fork":false,"forks_count":0,"full_name":"Ayfri/Challenge-Discovery","homepage":null,"html_url":"https://github.com/Ayfri/Challenge-Discovery","id":454842137,"is_template":false,"language":"JavaScript","name":"Challenge-Discovery","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-02-02T16:04:58Z","readme_content":null,"size":37,"stargazers_count":0,"topics":[],"updated_at":"2023-04-17T09:16:43Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":334,"contributors_count":0,"created_at":"2022-02-02T15:56:20Z","default_branch":"master","description":null,"fork":false,"forks_count":1,"full_name":"Ayfri/Challenge-Go","homepage":null,"html_url":"https://github.com/Ayfri/Challenge-Go","id":454839303,"is_template":false,"language":"Go","name":"Challenge-Go","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-02-02T16:01:28Z","readme_content":"# Challenge-go\n\n","size":102,"stargazers_count":0,"topics":[],"updated_at":"2022-02-02T16:01:49Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":19,"contributors_count":0,"created_at":"2021-04-19T06:43:13Z","default_branch":"main","description":"Gives some channels unique icons depending on their name.","fork":false,"forks_count":11,"full_name":"Ayfri/Channel-Icons","homepage":"","html_url":"https://github.com/Ayfri/Channel-Icons","id":359355877,"is_template":false,"language":null,"name":"Channel-Icons","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-04-19T07:00:07Z","readme_content":"![banner](./assets/banner.png)\n###### (Mod Client Compatibilty: Vizality, BetterDiscord, Powercord, GooseMod.)\n\n# Channel Icons\nGives some channels unique icons depending on their name.\n\n![screenshot](./screenshots/1.png)","size":203,"stargazers_count":0,"topics":[],"updated_at":"2022-11-02T15:43:16Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":36,"contributors_count":0,"created_at":"2021-06-01T13:34:41Z","default_branch":"master","description":"My Discord bot for my Guild CommunAyfri, made in Kotlin !","fork":false,"forks_count":0,"full_name":"Ayfri/CommunAyBot","homepage":null,"html_url":"https://github.com/Ayfri/CommunAyBot","id":372842004,"is_template":false,"language":"Kotlin","name":"CommunAyBot","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-04-17T17:20:22Z","readme_content":"# CommunAyBot\nMy Discord bot for my Guild CommunAyfri, made in Kotlin !\n","size":122,"stargazers_count":0,"topics":[],"updated_at":"2021-10-24T15:04:07Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":12,"contributors_count":0,"created_at":"2022-03-31T09:53:27Z","default_branch":"master","description":"My first exercices in C++ for my school.\"","fork":false,"forks_count":0,"full_name":"Ayfri/Cpp-TP1","homepage":null,"html_url":"https://github.com/Ayfri/Cpp-TP1","id":476245762,"is_template":false,"language":"C++","name":"Cpp-TP1","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-04-03T14:52:21Z","readme_content":"# Cpp-TP1\nMy first exercices in C++ for my school.\"\n","size":28,"stargazers_count":0,"topics":[],"updated_at":"2022-03-31T14:36:22Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":12,"contributors_count":0,"created_at":"2022-04-05T10:44:34Z","default_branch":"master","description":"My second set of exercices to do in C++.","fork":false,"forks_count":0,"full_name":"Ayfri/Cpp-TP2","homepage":null,"html_url":"https://github.com/Ayfri/Cpp-TP2","id":478083743,"is_template":false,"language":"C++","name":"Cpp-TP2","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-04-11T13:39:58Z","readme_content":"# Cpp-TP2\nMy second set of exercices to do in C++.\n","size":25,"stargazers_count":0,"topics":[],"updated_at":"2022-04-05T15:15:53Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":8,"contributors_count":0,"created_at":"2022-04-07T06:44:33Z","default_branch":"master","description":"My third set of exercices to do in C++.","fork":false,"forks_count":0,"full_name":"Ayfri/Cpp-TP3","homepage":null,"html_url":"https://github.com/Ayfri/Cpp-TP3","id":478860067,"is_template":false,"language":"C++","name":"Cpp-TP3","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-04-24T10:12:29Z","readme_content":"# Cpp-TP3\nMy third set of exercices to do in C++.\n","size":24,"stargazers_count":0,"topics":[],"updated_at":"2022-04-14T17:05:38Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":8,"contributors_count":0,"created_at":"2022-04-28T07:30:03Z","default_branch":"master","description":"My fourth set of exercices to do.","fork":false,"forks_count":0,"full_name":"Ayfri/Cpp-TP4","homepage":null,"html_url":"https://github.com/Ayfri/Cpp-TP4","id":486490871,"is_template":false,"language":"C++","name":"Cpp-TP4","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-05-08T15:54:13Z","readme_content":"# Cpp-TP4\nMy fourth set of exercices to do.\n","size":33,"stargazers_count":0,"topics":[],"updated_at":"2022-05-08T15:59:54Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":9,"contributors_count":0,"created_at":"2022-05-14T14:07:52Z","default_branch":"master","description":"My last set of exercices to do in C++.","fork":false,"forks_count":0,"full_name":"Ayfri/Cpp-TP5","homepage":null,"html_url":"https://github.com/Ayfri/Cpp-TP5","id":492233879,"is_template":false,"language":"C++","name":"Cpp-TP5","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-05-15T16:55:47Z","readme_content":"# Cpp-TP5\nMy last set of exercices to do in C++.\n","size":782,"stargazers_count":0,"topics":[],"updated_at":"2022-05-14T15:00:22Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":44,"contributors_count":0,"created_at":"2023-06-01T11:54:28Z","default_branch":"master","description":"Cyber TP 1","fork":false,"forks_count":0,"full_name":"Ayfri/Cyber-TP-1","homepage":null,"html_url":"https://github.com/Ayfri/Cyber-TP-1","id":648185922,"is_template":false,"language":"PHP","name":"Cyber-TP-1","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2023-06-08T13:25:19Z","readme_content":"# Cyber-TP-1\nCyber TP 1\n","size":787,"stargazers_count":0,"topics":[],"updated_at":"2023-06-08T05:14:35Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":11,"contributors_count":0,"created_at":"2026-04-27T13:55:05Z","default_branch":"main","description":"My exercices on Deep Learning course.","fork":false,"forks_count":0,"full_name":"Ayfri/Deep-Learning-Exercices","homepage":null,"html_url":"https://github.com/Ayfri/Deep-Learning-Exercices","id":1222576088,"is_template":false,"language":"Jupyter Notebook","name":"Deep-Learning-Exercices","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-05-01T17:00:54Z","readme_content":"","size":1139,"stargazers_count":0,"topics":[],"updated_at":"2026-05-01T17:00:58Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":44,"contributors_count":2,"created_at":"2025-02-24T16:01:04Z","default_branch":"main","description":"My own implementation of DeepResearch.","fork":false,"forks_count":1,"full_name":"Ayfri/Deep-Research","homepage":"","html_url":"https://github.com/Ayfri/Deep-Research","id":938221416,"is_template":false,"language":"Svelte","name":"Deep-Research","open_issues_count":3,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-10T19:15:26Z","readme_content":"# Perplexity Fast Chat 🚀\n\n<div align=\"center\">\n\n![Version](https://img.shields.io/badge/version-1.0.0-blue.svg?cacheSeconds=2592000)\n![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)\n![SvelteKit](https://img.shields.io/badge/SvelteKit-FF3E00?style=flat&logo=svelte&logoColor=white)\n![TailwindCSS](https://img.shields.io/badge/Tailwind_CSS-38B2AC?style=flat&logo=tailwind-css&logoColor=white)\n\n**A modern web interface to interact with Perplexity AI and OpenAI models, featuring a unique deep research mode.**\n\n[Features](#features-) • [Preview](#preview-) • [Installation](#installation-%EF%B8%8F) • [Usage](#usage-) • [Technologies](#technologies-used-) • [Project Structure](#project-structure-) • [Contribution](#contribution-)\n\n</div>\n\n## Table of Contents 📑\n\n- [Features](#features-)\n- [Preview](#preview-)\n- [Installation](#installation-%EF%B8%8F)\n- [Usage](#usage-)\n- [Technologies Used](#technologies-used-)\n- [Project Structure](#project-structure-)\n- [Deep Research Mode](#deep-research-mode-)\n- [Research Settings](#research-settings-%EF%B8%8F)\n- [Contribution](#contribution-)\n- [License](#license-)\n\n## Features ✨\n\n### Models Support\n- 🤖 **Perplexity AI Models**\n  - Sonar Reasoning Pro\n  - Sonar Reasoning\n  - Sonar Pro\n  - Sonar\n  - R1-1776\n- 🧠 **OpenAI Models for Deep Research**\n  - o3-mini (high reasoning)\n  - o1-mini\n  - o1-preview\n  - o1\n  - 4o\n\n### Core Features\n- 🔍 **Exclusive Deep Research Mode**\n  - Automatic breakdown of complex questions\n  - Multi-step in-depth research\n  - Final synthesis of results\n  - Configurable question count (auto or manual)\n  - Multiple research phases\n- 💬 **Modern Chat Interface**\n  - Conversation history\n  - Markdown support\n  - Citations and references\n  - \"Thinking\" mode with animations\n- 🎨 **Sleek Design**\n  - Responsive interface\n  - Dark mode\n  - Smooth animations\n  - Support for links and references\n  - ⚙️ **Flexible API Key Management**\n    - Configure API keys directly in the UI (stored in `localStorage`)\n    - Fallback to server-side environment variables if UI keys are not set\n\n## Preview 📸\n\n<div align=\"center\">\n\n### Deep Research Mode\n<img src=\"images/preview1.png\" alt=\"Deep Research Mode\" width=\"80%\"/>\n\n### Settings Modal\n<img src=\"images/preview3.png\" alt=\"Settings Modal\" width=\"80%\"/>\n\n### Chat Interface\n<img src=\"images/preview2.png\" alt=\"Chat Interface\" width=\"80%\"/>\n\n</div>\n\n## Installation 🛠️\n\n### Prerequisites\n- Node.js (v16+)\n- pnpm (v6+)\n- Perplexity API key (Optional, can be set in UI)\n- OpenAI API key (Optional, can be set in UI)\n\n### Setup Steps\n\n1. **Clone the repository**\n   ```bash\n   git clone https://github.com/your-username/perplexity-fast-chat.git\n   cd perplexity-fast-chat\n   ```\n\n2. **Install dependencies**\n   ```bash\n   pnpm install\n   ```\n\n3. **Configure environment variables**\n   \n   Create a `.env` file at the project root:\n   ```env\n   PERPLEXITY_API_KEY=your_perplexity_api_key\n   OPENAI_API_KEY=your_openai_api_key\n   ```\n   *Note: These server-side keys are optional if you plan to configure them via the UI.*\n\n4. **Start the development server**\n   ```bash\n   pnpm dev\n   ```\n   \n   Your app should now be running at [http://localhost:5173](http://localhost:5173)\n\n## Usage 🔮\n\n1. **Select a model** from the dropdown menu\n2. **Choose a mode**:\n   - Regular chat for quick answers\n   - Deep Research for complex questions\n3. **Type your question** or prompt\n4. For Deep Research mode, configure:\n   - OpenAI model for analysis\n   - Question count (auto or manual)\n5. **(Optional) Configure API Keys**: Click the \"API Key Settings\" button in the bottom-left navbar to enter your Perplexity and OpenAI keys. These will be saved in your browser.\n\n## Technologies Used 🧰\n\n<div align=\"center\">\n\n[![SvelteKit](https://img.shields.io/badge/SvelteKit-4A4A55?style=for-the-badge&logo=svelte&logoColor=FF3E00)](https://kit.svelte.dev/)\n[![TailwindCSS](https://img.shields.io/badge/TailwindCSS-38B2AC?style=for-the-badge&logo=tailwind-css&logoColor=white)](https://tailwindcss.com/)\n[![TypeScript](https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge&logo=typescript&logoColor=white)](https://www.typescriptlang.org/)\n\n</div>\n\n- **[SvelteKit](https://kit.svelte.dev/)** - Web framework\n- **[TailwindCSS](https://tailwindcss.com/)** - CSS framework\n- **[Perplexity AI API](https://docs.perplexity.ai/)** - Chat API\n- **[OpenAI API](https://platform.openai.com/)** - API for Deep Research mode\n- **[Marked](https://marked.js.org/)** - Markdown parsing\n- **[Lucide Icons](https://lucide.dev/)** - Icon set\n\n## Project Structure 📁\n\n```\n/\n├── src/\n│   ├── routes/             # Application routes\n│   │   ├── +page.svelte    # Main page\n│   │   └── api/            # API endpoints\n│   │       ├── chat/       # Standard chat endpoint\n│   │       ├── deep-research/ # Deep Research endpoint\n│   │       └── name/       # Name generation endpoint\n│   └── lib/                # Components and utilities\n│       ├── components/     # Svelte components\n│       │   └── common/     # Common small components\n│       ├── helpers/        # Helper functions\n│       ├── stores/         # Svelte stores\n│       └── types/          # TypeScript types\n├── images/                 # Screenshots and images\n├── .env                    # Environment variables\n└── package.json           # Dependencies and scripts\n```\n\n## Deep Research Mode 🔬\n\n<img src=\"images/preview1.png\" alt=\"Deep Research Mode\" width=\"250\" align=\"right\"/>\n\nThe Deep Research mode is a unique feature that:\n\n1. **Analyzes** your question using OpenAI models (configurable)\n2. **Breaks down** into relevant sub-questions (auto or manual count)\n3. **Researches** each aspect using Perplexity AI\n4. **Organizes** research into multiple phases when needed\n5. **Synthesizes** the results into a comprehensive answer\n6. **Provides** detailed timing and progress information\n\n<br clear=\"right\"/>\n\n## Research Settings ⚙️\n\nThe Deep Research mode includes configurable settings:\n\n| Setting | Options | Description |\n|---------|---------|-------------|\n| OpenAI Model | o3-mini, o1-mini, o1-preview, o1, 4o | Select model for question analysis |\n| Question Count | Auto / Manual (3-40) | Control how many sub-questions are generated |\n| Reasoning | High / Standard | Different reasoning approaches based on model |\n\n## Contribution 🤝\n\n### API Key Management\n\nThis application supports two ways to provide API keys:\n\n1.  **UI Configuration (Recommended for Local Use)**: Use the \"API Key Settings\" modal (accessible from the navbar) to enter your Perplexity and OpenAI keys. These are stored securely in your browser's `localStorage` and sent with each request.\n2.  **Server Environment Variables**: Set `PERPLEXITY_API_KEY` and `OPENAI_API_KEY` in a `.env` file at the project root. This is suitable for deployed environments or if you prefer not to store keys in the browser.\n\nThe application prioritizes keys set in the UI. If UI keys are not found, it falls back to using the environment variables.\n\nContributions are welcome! Please follow these steps:\n\n1. **Fork** the project\n2. **Create** a branch (`git checkout -b feature/improvement`)\n3. **Commit** your changes (`git commit -m 'Add feature'`)\n4. **Push** to the branch (`git push origin feature/improvement`)\n5. **Open** a Pull Request\n\nPlease ensure your code follows the project's coding style and include appropriate tests.\n\n## License 📄\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n---\n\n<div align=\"center\">\nMade with ❤️ for AI research enthusiasts\n</div>\n","size":1088,"stargazers_count":10,"topics":["ai-chat","deep-research","openai","perplexity"],"updated_at":"2026-03-01T15:39:08Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":19,"contributors_count":0,"created_at":"2026-01-16T11:03:26Z","default_branch":"main","description":"DeepSky-Classifier is a high-performance astronomical data pipeline and inference engine.","fork":false,"forks_count":0,"full_name":"Ayfri/DeepSky-Classifier","homepage":null,"html_url":"https://github.com/Ayfri/DeepSky-Classifier","id":1135621293,"is_template":false,"language":"Python","name":"DeepSky-Classifier","open_issues_count":3,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-16T23:37:04Z","readme_content":"# DeepSky-Classifier\n\n**DeepSky-Classifier** is an astronomical data pipeline and machine learning system that automates extraction, processing, and classification of celestial bodies (**Stars, Galaxies, Quasars**) using spectral data from multiple sky surveys.\n\nBuilt with Python 3.13, uv, Pydantic V2, and Scikit-Learn.\n\n---\n\n## Architecture\n\n```mermaid\ngraph TD\n    subgraph catalogs [Catalog Sources]\n        SDSS[SDSS DR17]\n        GAIA[Gaia DR3]\n    end\n\n    subgraph etl [ETL Layer]\n        Extract[Catalog Extractors]\n        Validate[Pydantic Validation]\n        CrossMatch[Cross-Match]\n        Persist[Parquet Persistence]\n    end\n\n    subgraph ml [ML Layer]\n        Features[Feature Selection]\n        Train[Random Forest Training]\n        Evaluate[Evaluation + Metrics]\n        Artifacts[Model Artifacts + SHA-256]\n    end\n\n    subgraph orchestration [Orchestration]\n        Prefect[Prefect Flow]\n    end\n\n    SDSS --> Extract\n    GAIA --> Extract\n    Extract --> Validate\n    Validate --> CrossMatch\n    CrossMatch --> Persist\n    Persist --> Features\n    Features --> Train\n    Train --> Evaluate\n    Evaluate --> Artifacts\n    Prefect --> Extract\n    Prefect --> Train\n```\n\n### Stack\n\n| Component | Technology | Purpose |\n| --- | --- | --- |\n| Language | Python 3.13 | Modern syntax, type hints, match/case |\n| Package Manager | uv | Rust-based, instant dependency resolution |\n| Extraction | Astroquery + PyVO | SDSS SQL queries and Gaia TAP access |\n| Validation | Pydantic V2 | Strict schema contracts at every boundary |\n| Storage | Parquet + SQLAlchemy 2 | Columnar analytics + relational metadata |\n| ML | Scikit-Learn | Random Forest ensemble classification |\n| Orchestration | Prefect 3 | Resilient flows with retries and observability |\n| Quality | Ruff + Pytest | Linting and test coverage |\n\n---\n\n## Project Structure\n\n```\nsrc/\n  core/\n    config.py          Pipeline configuration\n    database.py        SQLAlchemy engine and session management\n    integrity.py       SHA-256 file verification\n    models.py          ORM models (raw + curated tables)\n    schemas.py         Pydantic schemas (raw, curated, validation)\n  etl/\n    catalogs/\n      base.py          Abstract catalog extractor interface\n      gaia.py          Gaia DR3 TAP extractor\n      sdss.py          SDSS DR17 extractor\n    crossmatch.py      Catalog cross-matching utilities\n    federated.py       Multi-catalog federated pipeline\n    ingest.py          SDSS-only baseline pipeline\n    persist.py         Parquet/CSV persistence\n    validate.py        Row-level schema validation with quarantine\n  ml/\n    evaluate.py        Classification metrics\n    features.py        Feature selection and contract\n    train.py           Random Forest training with artifact persistence\n  utils/\n    logger.py          Colored logging\n  workflows/\n    pipeline.py        Prefect-orchestrated end-to-end flow\ntests/\n  test_features.py     Feature contract stability\n  test_query.py        SDSS query generation\n  test_schemas.py      Schema validation boundaries\n```\n\n---\n\n## Data Sources\n\n| Source | Parameters | Classification Contribution |\n| --- | --- | --- |\n| SDSS DR17 | Optical photometry (u, g, r, i, z), redshift | Baseline: temperature, distance, velocity |\n| Gaia DR3 | Parallax, proper motion (pmra, pmdec) | Galactic vs extragalactic separation |\n\n---\n\n## Installation\n\n### Prerequisites\n\n* Python 3.13+\n* [uv](https://github.com/astral-sh/uv)\n\n### Setup\n\n```bash\ngit clone https://github.com/Ayfri/deepsky-classifier.git\ncd deepsky-classifier\nuv sync\n```\n\n### Run the SDSS-only Pipeline\n\n```bash\nuv run -m src.etl.ingest\n```\n\n### Run the Federated Pipeline (SDSS + Gaia)\n\n```bash\nuv run -m src.etl.federated\n```\n\n### Train the Model\n\n```bash\nuv run -m src.ml.train data/raw/sdss/curated_features.parquet\n```\n\n### Run the Full Orchestrated Pipeline\n\n```bash\nuv run -m src.workflows.pipeline\n```\n\n### Run Tests\n\n```bash\nuv run pytest\n```\n\n### Lint\n\n```bash\nuv run ruff check .\n```\n\n---\n\n## License\n\nThis project is licensed under the **GNU GPLv3 License**. See the `LICENSE` file for details.\n","size":477,"stargazers_count":1,"topics":[],"updated_at":"2026-04-09T11:58:58Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":382,"contributors_count":4,"created_at":"2020-04-12T01:01:14Z","default_branch":"master","description":"Dictionnaire d'abréviations et acronymes.","fork":true,"forks_count":0,"full_name":"Ayfri/Dico-abreviations-et-acronymes","homepage":"","html_url":"https://github.com/Ayfri/Dico-abreviations-et-acronymes","id":254984083,"is_template":false,"language":"Python","name":"Dico-abreviations-et-acronymes","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-08-01T00:17:33Z","readme_content":"# Dico des abréviations et acronymes\r\n\r\nCeci est un repo à usage personnel, principalement. Il a pour but de recenser toutes les abréviations et acronymes que je croise pour m'en rappeler.\r\n\r\nLes contributions sont évidemment les bienvenues.\r\n\r\nL'organisation est la suivante : chaque lettre de l'alphabet a son dossier. Ils correspondent à la première lettre de l'abréviation ou acronyme. Chaque abréviation ou acronyme possède son propre fichier.\r\n\r\n# **ATTENTION, LA FONCTION \"RECHERCHE PAR DOMAINE\" DU SCRIPT PYTHON N'EST PAS TOTALEMENT FONCTIONNELLE !**","size":253,"stargazers_count":1,"topics":[],"updated_at":"2026-04-03T12:07:48Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":38,"contributors_count":3,"created_at":"2020-06-18T11:26:37Z","default_branch":"master","description":"A node module that have the discord.js v11.6.4 fields but works in discord.js v12.x","fork":false,"forks_count":1,"full_name":"Ayfri/Discord.js-v11-Like","homepage":"","html_url":"https://github.com/Ayfri/Discord.js-v11-Like","id":273219908,"is_template":false,"language":"JavaScript","name":"Discord.js-v11-Like","open_issues_count":4,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-20T12:29:56Z","readme_content":"![npm](https://img.shields.io/npm/dt/discord.js-v11-like)\n\n# Discord.js-v11-Like\n\nA package that have the discord.js v11.6.4 fields but works in discord.js v12.x.\n","size":54,"stargazers_count":1,"topics":["discord","discord-js","npm-package"],"updated_at":"2021-09-09T18:12:30Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":3,"contributors_count":0,"created_at":"2020-09-01T00:09:07Z","default_branch":"master","description":"A Discord French bot made in Java.","fork":false,"forks_count":1,"full_name":"Ayfri/Doctor-Java","homepage":null,"html_url":"https://github.com/Ayfri/Doctor-Java","id":291852321,"is_template":false,"language":"Java","name":"Doctor-Java","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2020-09-01T02:35:26Z","readme_content":"<!-- Badges-->\n\n<!-- EndBadges-->\n\n# Doctor Java\nDoctor Java is a Discord bot made in Java 14 using the JDA library.\n\n## Clone repository\n1. Make sure you have Java 14 or later version.\n2. Make sure you have gradlew installed.\n3. Clone the repository (`git clone https://github.com/Ayfri/Doctor-Java.git`).\n4. Open a terminal.\n5. Run `gradlew dependencies` to install dependencies.\n\n\n","size":75,"stargazers_count":3,"topics":[],"updated_at":"2026-04-21T21:38:58Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":89,"contributors_count":2,"created_at":"2025-10-07T08:39:07Z","default_branch":"main","description":"Implementation of a data pipeline","fork":false,"forks_count":0,"full_name":"Ayfri/ETL-1","homepage":null,"html_url":"https://github.com/Ayfri/ETL-1","id":1071358983,"is_template":false,"language":"Python","name":"ETL-1","open_issues_count":3,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-10T19:13:01Z","readme_content":"# ETL Alimentaire - OpenFoodFacts & Marmiton\n\nProjet ETL complet pour l'analyse des données alimentaires combinant les produits OpenFoodFacts et les recettes Marmiton.\n\n## 📋 Description\n\nCe projet implémente un pipeline ETL complet pour :\n1. **Extraire** les données de produits alimentaires d'OpenFoodFacts (700 000+ produits)\n2. **Extraire** les recettes et ingrédients de Marmiton\n3. **Transformer** et nettoyer les données\n4. **Charger** dans une base de données SQLite relationnelle\n5. **Explorer** les données via une interface web interactive\n\n## 🏗️ Structure du projet\n\n```\netl-1/\n├── data/\n│   ├── raw/                          # Données brutes téléchargées\n│   │   ├── openfoodfacts_sample.csv  # Échantillon OpenFoodFacts\n│   │   ├── marmiton_recipes.csv      # Recettes Marmiton\n│   │   └── ingredients_raw.csv       # Ingrédients bruts\n│   └── processed/                    # Données nettoyées\n│       ├── openfoodfacts_filtered.csv\n│       └── marmiton_recipes_filtered.csv\n├── database/\n│   ├── schema.sql                    # Schéma complet de la BDD\n│   ├── create_db.py                  # Script de création de la BDD\n│   ├── db_manager.py                 # Gestionnaire de base de données\n│   ├── openfoodfacts.db              # Base de données SQLite\n│   └── README.md                     # Documentation de la BDD\n├── scripts/\n│   ├── extract/\n│   │   ├── download_open_food_facts.py    # Téléchargement OpenFoodFacts\n│   │   └── scrape_marmiton_ingredients.py # Scraping Marmiton\n│   ├── transform/\n│   │   ├── filter_openfoodfacts.py         # Nettoyage OpenFoodFacts\n│   │   └── filter_marmiton_recipes.py      # Nettoyage Marmiton\n│   └── load/\n│       ├── load_to_sqlite.py               # Chargement des données\n│       ├── match_recipes_with_ingredients.py # Association recettes-ingrédients\n│       ├── query_examples.py               # Exemples de requêtes\n│       └── verify_data.py                  # Vérification d'intégrité\n├── notebooks/                        # Notebooks Jupyter pour l'analyse\n├── website/                          # Interface web SvelteKit\n│   ├── src/\n│   │   ├── routes/\n│   │   │   ├── ingredients/           # Exploration des ingrédients\n│   │   │   └── recipes/               # Exploration des recettes\n│   │   └── lib/\n│   │       └── components/            # Composants Svelte\n│   └── package.json\n├── pyproject.toml                    # Configuration Python (UV)\n├── uv.lock                          # Lock file des dépendances\n└── README.md\n```\n\n## 🚀 Installation\n\nCe projet utilise [uv](https://docs.astral.sh/uv/) pour la gestion des dépendances Python.\n\n### Prérequis\n\n- Python ≥ 3.13\n- uv (installé automatiquement si absent)\n\n### Installation des dépendances\n\n```bash\n# Synchroniser l'environnement (créer venv + installer dépendances)\nuv sync\n\n# Activer l'environnement virtuel (optionnel avec uv)\nsource .venv/bin/activate  # Linux/Mac\n.venv\\Scripts\\activate     # Windows\n```\n\n## 📊 Pipeline ETL\n\n### 1. Extraction (Extract)\n\n#### Données OpenFoodFacts\nTélécharger et échantillonner les données produits :\n\n```bash\nuv run python scripts/extract/download_open_food_facts.py\n```\n\n**Résultat** : `data/raw/openfoodfacts_sample.csv` (~1 million produits échantillonnés)\n\n#### Données Marmiton\nScraper les recettes et ingrédients :\n\n```bash\nuv run python scripts/extract/scrape_marmiton_ingredients.py\n```\n\n**Résultat** :\n- `data/raw/marmiton_recipes.csv` (recettes avec ingrédients)\n- `data/raw/ingredients_raw.csv` (liste des ingrédients)\n\n### 2. Transformation (Transform)\n\n#### Nettoyage OpenFoodFacts\n```bash\nuv run python scripts/transform/filter_openfoodfacts.py\n```\n\n**Critères de filtrage** :\n- Produits avec Nutri-Score valide\n- Données nutritionnelles présentes\n- Produits complets avec images\n\n**Résultat** : `data/processed/openfoodfacts_filtered.csv` (~6 200 produits)\n\n#### Nettoyage Marmiton\n```bash\nuv run python scripts/transform/filter_marmiton_recipes.py\n```\n\n**Résultat** : `data/processed/marmiton_recipes_filtered.csv`\n\n### 3. Chargement (Load)\n\n#### Création de la base de données\n```bash\n# Créer la structure complète\nuv run python database/create_db.py\n```\n\n#### Chargement des données\n```bash\n# Charger les produits OpenFoodFacts\nuv run python scripts/load/load_to_sqlite.py\n\n# Charger les recettes et ingrédients Marmiton\nuv run python scripts/load/match_recipes_with_ingredients.py\n```\n\n#### Vérification\n```bash\nuv run python scripts/load/verify_data.py\n```\n\n**Résultat** : `database/openfoodfacts.db` (base SQLite avec toutes les données)\n\n## 🗄️ Base de données\n\n### Schéma\n\nLa base de données contient quatre tables principales interconnectées :\n\n#### Table `products` (OpenFoodFacts)\n- Informations produit (nom, marque, catégorie)\n- Emballage et origine géographique\n- Ingrédients et allergènes\n- Scores de qualité (Nutri-Score, NOVA, Eco-Score)\n- Images et métadonnées\n- Valeurs nutritionnelles pour 100g\n\n#### Table `nutrition_facts`\n- Valeurs nutritionnelles détaillées\n- Macronutriments (protéines, lipides, glucides)\n- Vitamines et minéraux\n- Relation avec `products` via clé étrangère\n\n#### Table `recipes` (Marmiton)\n- Informations de recette (nom, URL, difficulté, budget)\n- Temps de préparation et cuisson\n- Ingrédients bruts et parsés (JSON)\n- Étapes de préparation\n- Images et tags\n- Auteur et description\n\n#### Table `ingredients` (Marmiton)\n- Liste des ingrédients extraits des recettes\n- Noms normalisés et images\n- Source (Marmiton)\n\n#### Table `recipe_ingredients` (relation many-to-many)\n- Association recettes-ingrédients\n- Quantités et unités extraites\n- Texte brut original\n\n### Vues et index\n\n- `products_with_nutrition` : Jointure produits + nutrition\n- `high_quality_products` : Produits ≥80% complets avec Nutri-Score\n- Index sur noms, URLs, et relations pour des requêtes optimisées\n\n### Exemples de requêtes\n\n#### Produits OpenFoodFacts\n```sql\n-- Top 10 des produits avec le meilleur Nutri-Score\nSELECT product_name, brands, nutriscore_grade, energy_kcal_100g\nFROM products_with_nutrition\nWHERE nutriscore_grade = 'a'\nORDER BY completeness DESC\nLIMIT 10;\n\n-- Moyennes nutritionnelles par groupe NOVA\nSELECT nova_group,\n       AVG(energy_kcal_100g) as avg_energy,\n       AVG(sugars_100g) as avg_sugars,\n       COUNT(*) as count\nFROM products_with_nutrition\nWHERE nova_group IS NOT NULL\nGROUP BY nova_group\nORDER BY nova_group;\n```\n\n#### Recettes Marmiton\n```sql\n-- Recettes faciles avec moins de 30 min de préparation\nSELECT name, prep_time, difficulty, rate\nFROM recipes\nWHERE difficulty = 'très facile'\n  AND prep_time LIKE '%min%'\n  AND CAST(REPLACE(REPLACE(prep_time, ' min', ''), ' h ', '60') AS INTEGER) < 30\nORDER BY rate DESC;\n\n-- Ingrédients les plus utilisés\nSELECT i.name, COUNT(ri.recipe_id) as recipe_count\nFROM ingredients i\nJOIN recipe_ingredients ri ON i.id = ri.ingredient_id\nGROUP BY i.id, i.name\nORDER BY recipe_count DESC\nLIMIT 20;\n```\n\n#### Requêtes croisées\n```sql\n-- Recettes utilisant des ingrédients sains (Nutri-Score A/B)\nSELECT DISTINCT r.name as recipe_name, r.difficulty, r.prep_time,\n                p.product_name, p.nutriscore_grade\nFROM recipes r\nJOIN recipe_ingredients ri ON r.id = ri.recipe_id\nJOIN ingredients i ON ri.ingredient_id = i.id\nJOIN products p ON LOWER(p.product_name) LIKE '%' || LOWER(i.name) || '%'\nWHERE p.nutriscore_grade IN ('a', 'b')\n  AND p.main_category_en LIKE '%vegetables%'\nLIMIT 10;\n```\n\nVoir [database/README.md](database/README.md) pour plus d'exemples.\n\n## 📈 Statistiques\n\nAprès le pipeline complet :\n\n### Produits OpenFoodFacts\n- **Produits totaux** : 6 263\n- **Avec Nutri-Score** : 100%\n- **Avec groupe NOVA** : 78%\n- **Haute qualité** (≥80% complet) : 24%\n- **Avec images** : 100%\n\n### Distribution Nutri-Score\n\n| Grade | Nombre | Pourcentage |\n|-------|--------|-------------|\n| A     | 1 208  | 19.3%       |\n| B     | 754    | 12.0%       |\n| C     | 1 295  | 20.7%       |\n| D     | 1 334  | 21.3%       |\n| E     | 1 249  | 19.9%       |\n\n### Recettes Marmiton\n- **Recettes totales** : ~10 000+ (dépend du scraping)\n- **Ingrédients extraits** : ~1 000+ ingrédients uniques\n- **Associations recette-ingrédient** : ~50 000+\n\n### Base de données complète\n- **Tables** : 5 principales + vues\n- **Relations** : Many-to-many entre recettes et ingrédients\n- **Index** : Optimisés pour les recherches fréquentes\n\n## 🛠️ Utilisation avec Python\n\n```python\nimport sqlite3\nimport pandas as pd\n\n# Connexion à la base de données\nconn = sqlite3.connect('database/openfoodfacts.db')\n\n# Requête avec pandas\ndf = pd.read_sql_query(\"\"\"\n    SELECT product_name, brands, nutriscore_grade, \n           energy_kcal_100g, proteins_100g, sugars_100g\n    FROM products_with_nutrition\n    WHERE countries LIKE '%France%'\n    LIMIT 100\n\"\"\", conn)\n\nprint(df.head())\nconn.close()\n```\n\n## 🔍 Vérification de la qualité des données\n\nLe script de vérification effectue plusieurs contrôles :\n\n- ✅ Unicité des clés primaires\n- ✅ Intégrité référentielle\n- ✅ Plages de valeurs nutritionnelles\n- ✅ Cohérence des données (ex: sucres ≤ glucides)\n- ✅ Complétude des champs essentiels\n\n```bash\nuv run python scripts/load/verify_data.py\n```\n\n## 📦 Dépendances\n\nPrincipales dépendances Python (définies dans `pyproject.toml`) :\n\n- `pandas` : Manipulation de données\n- `requests` : Téléchargement HTTP\n- `beautifulsoup4` : Parsing HTML pour le scraping\n- `aiohttp` : Requêtes HTTP asynchrones\n- `python-marmiton` : Client API Marmiton\n- `recipe-scrapers` : Extraction de recettes\n- `tqdm` : Barres de progression\n\nInstallation :\n```bash\n# Ajouter une dépendance\nuv add <package-name>\n\n# Ajouter une dépendance dev\nuv add --dev <package-name>\n\n# Synchroniser après modification\nuv sync\n```\n\n## 🌐 Interface Web\n\nUne interface web SvelteKit complète permet d'explorer interactivement les données.\n\n### Lancement du site\n\n```bash\n# Aller dans le dossier website\ncd website\n\n# Installer les dépendances\npnpm install\n\n# Lancer en mode développement\npnpm dev\n```\n\nLe site sera accessible sur `http://localhost:5173`.\n\n### Fonctionnalités\n\n#### Exploration des Produits\n- 🔍 **Recherche** par nom, marque ou catégorie\n- 📊 **Tri** par Nutri-Score, calories, NOVA group\n- 🎯 **Filtrage** par catégories multiples\n- 📄 **Pagination** fluide\n- 📷 **Images** des produits\n- 📈 **Statistiques** globales\n\n#### Exploration des Recettes\n- 👨‍🍳 **Recettes** avec ingrédients et étapes détaillées\n- 🥕 **Ingrédients** et leurs utilisations dans les recettes\n- ⏱️ **Temps** de préparation et cuisson\n- 💰 **Budget** et difficulté\n- ⭐ **Notes** et commentaires\n\n#### Navigation croisée\n- 🔗 **Lien ingrédients-recettes** : Voir toutes les recettes utilisant un ingrédient\n- 📊 **Analyse** des associations produits-recettes\n- 🎨 **Interface moderne** avec animations fluides\n\n### API REST\n\nLe site expose une API REST complète :\n\n```\nGET /api/foods?page=1&limit=100&sort=nutriscore&order=asc\nGET /api/ingredients?page=1&limit=50&query=tomate\nGET /api/recipes?page=1&limit=20&ingredient=farine\n```\n\nVoir [website/README.md](website/README.md) pour la documentation complète de l'API.\n\n## 📝 Notes techniques\n\n### Gestion des dépendances avec UV\n\nCe projet utilise `uv` comme gestionnaire de packages moderne pour Python :\n\n- **Fichier de dépendances** : `pyproject.toml` (source unique)\n- **Lock file** : `uv.lock` (versions exactes, committé)\n- **Installation** : `uv sync` (reproductible)\n- **Ajout de package** : `uv add <package>`\n- **Exécution** : `uv run python script.py`\n\nVoir [.github/copilot-instructions.md](.github/copilot-instructions.md) pour plus de détails.\n\n### Sources de données\n\n#### OpenFoodFacts\n- **Format** : CSV compressé (~2-3 GB)\n- **Échantillonnage** : 1 million de produits pour les tests\n- **Filtrage** : ~6 200 produits de haute qualité\n- **Encoding** : UTF-8\n\n#### Marmiton\n- **Scraping** : Asyncio + BeautifulSoup4\n- **Rate limiting** : 40 requêtes concurrentes max, 0.05s delay\n- **Parsing** : Expressions régulières pour ingrédients\n- **Normalisation** : Suppression des articles français\n\n### Format des données\n\n- Les codes produits sont stockés en TEXT (barcode format)\n- Les valeurs manquantes sont NULL dans la base\n- Les données nutritionnelles sont pour 100g\n- Les ingrédients des recettes sont stockés en JSON parsé\n- Encoding UTF-8 pour tous les fichiers\n\n### Limitations connues\n\n- Quelques valeurs nutritionnelles hors plages attendues (données source)\n- Certaines incohérences mineures (ex: graisses saturées > graisses totales)\n- Données Marmiton dépendent de la disponibilité du site\n- Scraping soumis aux conditions d'utilisation de Marmiton\n\n## 🤝 Contribution\n\n1. Fork le projet\n2. Créer une branche (`git checkout -b feature/amelioration`)\n3. Commit les changements (`git commit -am 'Ajout fonctionnalité'`)\n4. Push vers la branche (`git push origin feature/amelioration`)\n5. Créer une Pull Request\n\n## 📄 Licence\n\nVoir le fichier [LICENSE](LICENSE) pour plus de détails.\n\n## 🔗 Ressources\n\n- [OpenFoodFacts](https://world.openfoodfacts.org/) - Base de données produits alimentaires\n- [Marmiton](https://www.marmiton.org/) - Recettes et ingrédients culinaires\n- [Documentation UV](https://docs.astral.sh/uv/) - Gestionnaire de packages Python\n- [SQLite](https://www.sqlite.org/) - Base de données utilisée\n- [Pandas](https://pandas.pydata.org/) - Manipulation de données\n- [SvelteKit](https://kit.svelte.dev/) - Framework web\n- [BeautifulSoup4](https://www.crummy.com/software/BeautifulSoup/) - Parsing HTML\n\n## 📧 Contact\n\nPour toute question ou suggestion, ouvrez une issue sur GitHub.\n\n---\n\n**Note** : Ce projet est réalisé dans un cadre éducatif pour démontrer un pipeline ETL complet combinant scraping web, nettoyage de données et interface utilisateur moderne.\n","size":7733,"stargazers_count":0,"topics":[],"updated_at":"2025-10-30T14:05:04Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":112,"contributors_count":3,"created_at":"2025-04-24T17:01:31Z","default_branch":"main","description":"A modern application for creating images or videos with GPT Images/Sora models.","fork":false,"forks_count":0,"full_name":"Ayfri/GPT-Images","homepage":"https://gpt-images.ayfri.com/","html_url":"https://github.com/Ayfri/GPT-Images","id":972183109,"is_template":false,"language":"Svelte","name":"GPT-Images","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-05-01T20:35:28Z","readme_content":"# GPT Image Generator ✨\n\n[![SvelteKit](https://img.shields.io/badge/SvelteKit-FF3E00?style=for-the-badge&logo=svelte&logoColor=white)](https://kit.svelte.dev/)\n[![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-38B2AC?style=for-the-badge&logo=tailwind-css&logoColor=white)](https://tailwindcss.com/)\n[![OpenAI](https://img.shields.io/badge/OpenAI-412991?style=for-the-badge&logo=openai&logoColor=white)](https://openai.com/)\n[![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=for-the-badge&logo=typescript&logoColor=white)](https://www.typescriptlang.org/)\n\nA modern web application built with SvelteKit and Tailwind CSS that allows users to generate stunning images using OpenAI's image generation models.\n\n**Website**: [https://gpt-images.ayfri.com](https://gpt-images.ayfri.com)\n\n![Screenshot of the application](static/screenshot.png)\n\n## Features\n\n*   **AI Image Generation**: Leverages OpenAI's powerful models to create images from text prompts.\n*   **API Key Management**: Securely stores your OpenAI API key in the browser's IndexedDB.\n*   **Image Gallery**: Displays previously generated images.\n*   **Regenerate Option**: Easily regenerate an image with the same prompt.\n*   **Usage Statistics**: Tracks usage information (details depend on implementation).\n*   **Responsive Design**: Adapts beautifully to different screen sizes thanks to Tailwind CSS.\n*   **Modern UI**: Clean and intuitive user interface built with Svelte.\n*   **SEO Optimized**: Includes comprehensive meta tags and Open Graph properties for better search engine visibility and social sharing.\n\n## Tech Stack\n\n*   **Framework**: SvelteKit\n*   **Styling**: Tailwind CSS\n*   **Language**: TypeScript\n*   **AI**: OpenAI API\n*   **Icons**: Lucide Svelte\n*   **Client-side Storage**: IndexedDB (via `idb` library)\n*   **Package Manager**: pnpm\n*   **Build Tool**: Vite\n\n## Getting Started\n\n### Prerequisites\n\n*   Node.js (v18 or higher recommended)\n*   pnpm (Install using `npm install -g pnpm`)\n*   An OpenAI API Key (Get one from [OpenAI Platform](https://platform.openai.com/))\n\n### Installation & Setup\n\n1.  **Clone the repository:**\n    ```bash\n    git clone https://github.com/Ayfri/gpt-images.git\n    cd gpt-images\n    ```\n\n2.  **Install dependencies:**\n    ```bash\n    pnpm install\n    ```\n\n3.  **Environment Variables (Optional):**\n    If the application requires environment variables (e.g., for a backend API key if implemented differently), create a `.env` file in the root directory based on `.env.example` (if provided).\n    ```\n    # Example .env file content\n    OPENAI_API_KEY=\"your_secret_key_here\" # Usually handled client-side in this setup\n    ```\n    *Note: In the current setup, the API key seems to be managed client-side via the UI and stored in IndexedDB. Be mindful of security implications when handling API keys.*\n\n### Running the Development Server\n\n```bash\npnpm run dev\n```\n\nThis command starts a local development server. Open your browser and navigate to `http://localhost:5173` (or the port specified in the output).\n\nEnter your OpenAI API key in the application's UI to start generating images.\n\n### Building for Production\n\n```bash\npnpm run build\n```\n\nThis command creates an optimized production build of your application in the `build` directory (or as configured in `svelte.config.js`).\n\n### Previewing the Production Build\n\n```bash\npnpm run preview\n```\n\nThis command starts a local server to preview the production build.\n\n## Project Structure\n\n```\ngpt-images/\n├── .svelte-kit/      # SvelteKit build artifacts (generated)\n├── node_modules/     # Project dependencies (managed by pnpm)\n├── public/           # Static assets (favicon, images, etc.)\n├── src/\n│   ├── app.css       # Global CSS styles\n│   ├── app.html      # HTML template shell\n│   ├── assets/       # Static assets imported by modules\n│   ├── lib/          # Application library (components, utils, etc.)\n│   │   ├── components/ # Reusable Svelte components\n│   │   ├── db/         # Database interaction (IndexedDB)\n│   │   ├── services/   # API interactions (OpenAI)\n│   │   ├── stores/     # Svelte stores\n│   │   └── utils/      # Utility functions\n│   ├── routes/       # Application pages and endpoints\n│   │   ├── +layout.svelte # Root layout component\n│   │   └── +page.svelte   # Main page component\n│   └── ...           # Other SvelteKit files (hooks, service-worker)\n├── .gitignore        # Files/folders ignored by Git\n├── package.json      # Project metadata and dependencies\n├── pnpm-lock.yaml    # Exact dependency versions\n├── pnpm-workspace.yaml # pnpm workspace configuration\n├── postcss.config.js # PostCSS configuration\n├── README.md         # This file\n├── svelte.config.js  # SvelteKit configuration\n├── tailwind.config.js# Tailwind CSS configuration\n├── tsconfig.json     # TypeScript configuration\n├── tsconfig.node.json# TypeScript configuration for Node.js parts\n└── vite.config.ts    # Vite configuration\n```\n\n## Contributing\n\nContributions are welcome! Please follow standard fork-and-pull-request workflows.\n\n## License\n\nThis project is licensed under the MIT License - see the LICENSE file for details (if applicable).\n","size":725,"stargazers_count":4,"topics":["ai-images","dalle","gpt-images","openai","sora","svelte","sveltekit"],"updated_at":"2026-04-29T21:56:22Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":15,"contributors_count":2,"created_at":"2020-03-21T21:36:08Z","default_branch":"master","description":"A simple bot to create Embeds with the godembed package.","fork":false,"forks_count":1,"full_name":"Ayfri/God-Embot","homepage":null,"html_url":"https://github.com/Ayfri/God-Embot","id":249065123,"is_template":false,"language":"JavaScript","name":"God-Embot","open_issues_count":2,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-20T12:29:58Z","readme_content":"# God-Embot\nA simple bot to create Embeds with the godembed package.\n","size":13,"stargazers_count":1,"topics":[],"updated_at":"2021-04-29T21:59:21Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":21,"contributors_count":2,"created_at":"2021-01-01T05:39:03Z","default_branch":"master","description":"Create a Discord RichEmbed from a GodEmbed text to use for \"embed say\" commands of your bots or stock his text to GodEmbed files.","fork":false,"forks_count":0,"full_name":"Ayfri/GodEmbed","homepage":"https://www.npmjs.com/package/godembed","html_url":"https://github.com/Ayfri/GodEmbed","id":325923589,"is_template":false,"language":"JavaScript","name":"GodEmbed","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-01-01T05:55:29Z","readme_content":null,"size":375,"stargazers_count":1,"topics":[],"updated_at":"2023-05-14T00:12:32Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":7,"contributors_count":0,"created_at":"2021-11-14T14:07:35Z","default_branch":"master","description":"An HTML/CSS responsive menu I have to recreate from a video.","fork":false,"forks_count":0,"full_name":"Ayfri/HTML-Menu","homepage":null,"html_url":"https://github.com/Ayfri/HTML-Menu","id":427945739,"is_template":false,"language":"HTML","name":"HTML-Menu","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-11-21T22:26:36Z","readme_content":"# HTML-Menu\n\nAn HTML/CSS responsive menu I have to recreate from a video.\n","size":19,"stargazers_count":0,"topics":[],"updated_at":"2021-11-21T22:26:38Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":20,"contributors_count":2,"created_at":"2021-11-07T00:03:16Z","default_branch":"master","description":"My first exercice in HTML/CSS.","fork":false,"forks_count":0,"full_name":"Ayfri/HTML-TP1","homepage":"https://minecraft-adventure.ayfri.com/","html_url":"https://github.com/Ayfri/HTML-TP1","id":425375618,"is_template":false,"language":"HTML","name":"HTML-TP1","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2025-06-12T09:25:42Z","readme_content":"# HTML-TP1\n\nMy first exercice in HTML/CSS.\n","size":57711,"stargazers_count":0,"topics":["adventure","game","html","minecraft"],"updated_at":"2025-06-16T00:18:31Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":61,"contributors_count":3,"created_at":"2022-01-27T10:38:34Z","default_branch":"master","description":"A hangman on a website using a backend in Go for the logic.","fork":false,"forks_count":0,"full_name":"Ayfri/Hangman-Web","homepage":null,"html_url":"https://github.com/Ayfri/Hangman-Web","id":452640342,"is_template":false,"language":"CSS","name":"Hangman-Web","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-02-01T16:06:09Z","readme_content":"# Hangman-Web\nA hangman on a website using a backend in Go for the logic.\n","size":239,"stargazers_count":1,"topics":[],"updated_at":"2023-04-17T09:16:43Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":41,"contributors_count":4,"created_at":"2020-04-28T17:20:44Z","default_branch":"master","description":"A simple Processing program using PApplet to transform images to Minecraft Pixel Art","fork":false,"forks_count":0,"full_name":"Ayfri/Image2Minecraft","homepage":null,"html_url":"https://github.com/Ayfri/Image2Minecraft","id":259704229,"is_template":false,"language":"Java","name":"Image2Minecraft","open_issues_count":4,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-20T12:29:42Z","readme_content":"# Image2Minecraft\n\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/1221d5e280624cc0902f6d29bb2350ab)](https://app.codacy.com/manual/pierre.ayfri/Image2Minecraft?utm_source=github.com&utm_medium=referral&utm_content=Ayfri/Image2Minecraft&utm_campaign=Badge_Grade_Dashboard)\n\nThis is an old project I've been working on when I was doing a lot of Java and Processing. I just cleaned up for now to update what is on GitHub, I will maybe work on it\nlater. \n","size":11598,"stargazers_count":8,"topics":["java","minecraft","processing"],"updated_at":"2024-11-10T16:06:26Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":17,"contributors_count":2,"created_at":"2023-06-16T08:47:08Z","default_branch":"master","description":"The documentation of our second TP in infra.","fork":false,"forks_count":0,"full_name":"Ayfri/Infra-Doc","homepage":null,"html_url":"https://github.com/Ayfri/Infra-Doc","id":654493085,"is_template":false,"language":null,"name":"Infra-Doc","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2023-06-17T13:51:29Z","readme_content":"# Documentation d'architecture technique - Projet Infrastructure & Système d'information\n\n## Membres du projet\n\n- Olivier MISTRAL\n- Pierre ROY\n\n## Table des matières\n\n* [Présentation du projet](#présentation-du-projet)\n    * [Cadre du projet](#cadre-du-projet)\n    * [Objectifs](#objectifs)\n    * [Réalisations](#réalisations)\n* [Présentation de l'architecture réseau](#présentation-de-larchitecture-réseau)\n    * [Schéma de l'architecture](#schéma-de-larchitecture)\n    * [Tableau d'adressage](#tableau-dadressage)\n    * [Explication de l'architecture](#explication-de-larchitecture)\n* [Mise en place de la solution](#mise-en-place-de-la-solution)\n    * [PFSense](#pfsense)\n        * [Installation](#installation)\n        * [Configuration](#configuration)\n        * [Configuration du réseau](#configuration-du-réseau)\n        * [Configuration du DHCP](#configuration-du-dhcp)\n        * [Configuration des règles du pare-feu](#configuration-des-règles-du-pare-feu)\n        * [Configuration de la sauvegarde](#configuration-de-la-sauvegarde)\n    * [Active Directory](#active-directory)\n        * [Installation](#installation-1)\n        * [Configuration](#configuration-1)\n        * [Configuration des utilisateurs](#configuration-des-utilisateurs)\n        * [Configuration du DNS](#configuration-du-dns)\n    * [Serveur de messagerie](#serveur-de-messagerie)\n        * [Installation](#installation-2)\n        * [Configuration](#configuration-2)\n        * [Utilisation de la messagerie](#utilisation-de-la-messagerie)\n    * [Serveur Web](#serveur-web)\n    * [Client Windows](#client-windows)\n        * [Configuration](#configuration-3)\n* [Conclusion](#conclusion)\n\n## Présentation du projet\n\nNous sommes Olivier MISTRAL et Pierre ROY, étudiants en 2ème année Bachelor à Ynov Informatique.\n\n### Cadre du projet\n\nDans le cadre de notre unité d'enseignement “Infrastructure & Système d’information”, nous avons réalisé un projet\nvisant à évaluer les compétences acquises au cours des modules de cette unité. Cette documentation présente la mise en\nplace de l'architecture réseau que nous avons réalisé dans le cadre de ce projet. <br><br>\nCe projet consiste à mettre en place une architecture réseau pour une entreprise lambda. Cette architecture doit\npermettre de répondre aux besoins de l'entreprise, à savoir : avoir une sécurité de son réseau via un parefeu, que ses\ncollaborateurs puissent s’authentifier et ouvrir leur propre session, qu’ils puissent envoyer des mails en\ninterne dans un premier temps, et accéder à un intranet.\n\n### Objectifs\n\nLes objectifs de ce projet étaient les suivants :\n\n- Configurer et administrer un serveur\n- Gérer un environnement virtuel\n- Mettre en place une infrastructure système et réseaux\n- Appréhender la sécurité\n\n### Réalisations\n\nNotre projet a consisté à :\n\n- Configurer un pare-feu PFSense\n- Configurer un Active Directory pour gérer les utilisateurs\n- Configurer un serveur de messagerie interne\n- Configurer un serveur web pour l'intranet\n- Respecter les règles de sécurité afin de protéger le réseau (cloisonnement des réseaux, etc.)\n\n## Présentation de l'architecture réseau\n\n### Schéma de l'architecture\n\n![Schéma de l'architecture](schema.png)\n\n### Tableau d'adressage\n\n|                          | Lan 0/Admin | Lan 1/AD    | Lan 2/Web-Mail | Lan 3/Clients |\n|:-------------------------|-------------|-------------|----------------|---------------|\n| Sous réseau              | 10.0.0.0/24 | 10.0.1.0/24 | 10.0.2.0/24    | 10.0.3.0/24   |\n| Passerelle/Interface LAN | 10.0.0.1    | 10.0.1.1    | 10.0.2.1       | 10.0.3.1      |\n| Serveur                  |             | 10.0.1.x    | 10.0.2.x       |               |\n| Client                   | 10.0.0.x    |             |                | 10.0.3.x      |\n\n### Explication de l'architecture\n\nL'architecture réseau est composée de 4 LANs, un pour l'administration, un pour l'Active Directory, un pour le serveur\nweb ainsi que la messagerie (DMZ) et un pour les clients. Chaque LAN est cloisonné par un pare-feu PFSense.\n\n- `Lan 0/Admin` : Ce LAN est réservé à l'administration du réseau, il est donc accessible uniquement par les\n  administrateurs.\n- `Lan 1/AD` : Ce LAN est réservé à l'Active Directory, il est donc accessible uniquement par les administrateurs et les\n  utilisateurs du domaine.\n- `Lan 2/Web-Mail (DMZ)` : Ce LAN est réservé au serveur web et à la messagerie, il est donc accessible uniquement par\n  les administrateurs et les utilisateurs du domaine.\n- `Lan 3/Clients` : Ce LAN est réservé aux clients, il est donc accessible uniquement par les administrateurs et les\n  utilisateurs du domaine.\n\n## Mise en place de la solution\n\n### PFSense\n\n#### Installation\n\nPFSense est un outil de surveillance de la sécurité du réseau. Il permet de surveiller les connexions et les\ndéconnexions des utilisateurs.<br>\nPour l'installer, il suffit de télécharger un ISO sur le site de la communauté de PFSense, puis de l'installer sur le\nserveur.\n\n![PFSense Installation Étape 2](pfsense-install-2.png)\n\nL'installation ne requiert pas d'autres étapes, une fois lancée PFSense est prêt à être utilisé.\n\n#### Configuration\n\nUne fois PFSense installé, il faut le configurer.\n\n![Configuration pfsense 1](pfsense-config-1.png)\n\nUne fois le copyright accepté, un menu d'installation est disponible.\n\n![Configuration pfsense 2](pfsense-config-2.png)\n\nPFSense demande de choisir un clavier et un groupe de raccourcis à utiliser, nous utilisons celui de base.\n\n![Configuration pfsense 3](pfsense-config-3.png)\n\nConfiguration des partitions du disque dur.\n\n![Configuration pfsense 4](pfsense-config-4.png)\n\nValidation de la configuration à installer.\n\n![Configuration pfsense 5](pfsense-config-5.png)\n\nPFSense demande de choisir un type d'utilisation de disque dur à plusieurs partitions, nous utilisons le type de disque\ndur par défaut.\n\n![Configuration pfsense 6](pfsense-config-6.png)\n\nValidation de la configuration du disque dur.\n\n![Configuration pfsense 7](pfsense-config-7.png)\n\nLa machine demande de formater les partitions, il faut appuyer sur * pour les sélectionner toutes.\n\n![Configuration pfsense 8](pfsense-config-8.png)\n\nPFSense s'installe après le formatage des partitions.\n\n![Configuration pfsense 9](pfsense-config-9.png)\n\nUne fois l'installation terminée, PFSense nous propose d'ouvrir un terminal pour finaliser notre installation.<br>\nLe projet n'a pas besoin d'autre configuration.\n\n![Configuration pfsense 10](pfsense-config-10.png)\n\nPFSense est maintenant configuré et averti qu'il va redémarrer.\n\n#### Configuration du réseau\n\n![Configuration du réseau pfsense 1](pfsense-network-1.png)\n\nLe terminal de PFSense, nous allons définir les adresses IP des différents LANs en choisissant l'option 2.\n\n![Configuration du réseau pfsense 1.1](pfsense-network1.1.png)\n\nPour l'exemple, nous allons configurer le LAN 0/Admin. Dans notre configuration, le LAN 0/Admin est sur l'interface 4.\n<br>Il faut donc ensuite définit l'adresse IP de l'interface 4 ainsi que le masque de sous-réseau.\n\n![Configuration du réseau pfsense 1.2](pfsense-network1.2.png)\n\nChoix des options pour ne pas mettre de DHCP et de ne pas utiliser IPv6 et d'autres options.<br>\nPuis nous ferons la même chose pour les autres LANs.\n\n![Configuration du réseau pfsense 1.3](pfsense-network1.3.png)\n\nVoilà ce que donne la configuration des interfaces.\n\n![Configuration du réseau pfsense 2](pfsense-network-2.png)\n\nUne fois les interfaces configurées, PFSense créé un site local via son adresse IP pour pouvoir configurer des\nrègles.<br>\nIl faut se connecter au site pour pouvoir configurer les règles (par défaut le nom de compte est admin et le mot de\npasse est pfsense).\n\n> Note :\n> Le pare-feu va bloquer le rafraîchissement de notre page donc taper la commande `pfctl -d` dans le terminal du\n> PfSense,\n> qui va désactiver le pare-feu pour nous permettre d’affecter nos changements.<br>\n> ![Configuration du réseau pfsense 3](pfsense-network-3.png)\n\n#### Configuration du DHCP\n\nNotre serveur DHCP est le serveur PFSense, il faut donc le configurer pour qu'il puisse attribuer des adresses IP aux\nclients. <br>\n\nPour cela, il faut aller dans l'onglet `Services` puis `DHCP Server`. Ensuite, on choisit sur quel LAN on veut\nconfigurer le serveur DHCP. <br>\n\n![Configuration du réseau pfsense 4](pfsense-dhcp-1.png)\n\nAprès avoir choisi le LAN, il faut activer le serveur DHCP en cochant la\ncase `Enable DHCP server on LAN interface`. <br>\n\n![Configuration du réseau pfsense 4](pfsense-dhcp-2.png)\n\nEnsuite, il faut configurer le serveur DHCP en choisissant une plage d'adresses IP à attribuer aux clients. <br>\n\n![Configuration du réseau pfsense 4](pfsense-dhcp-3.png)\n\nOn choisit ensuite le serveur DNS à utiliser, dans notre cas, nous utilisons le serveur DNS de notre Active Directory.\n\n![Configuration du réseau pfsense 4](pfsense-dhcp-4.png)\n\nEnfin, on configure la passerelle par défaut, dans notre cas, nous utilisons l'adresse IP de notre serveur PFSense\n\n#### Configuration des règles du pare-feu\n\nConcernant les règles de pare-feu, nous allons paramétrer les règles de base pour chaque LAN. <br>\nPour cela, il faut aller dans l'onglet `Firewall` puis `Rules`. Ensuite, on choisit sur quel LAN on veut configurer les\nrègles.\n\n![Configuration du réseau pfsense 4](pfsense-network-4.png)\n\nUne fois la LAN choisie, on clique sur `Add` pour ajouter une règle.\n\nDans notre cas la règle la plus importante est celle qui permet de bloquer les connexions venant du WAN vers le LAN du\nserveur web et mail. En effet, comme il s'agit d'un intranet, nous ne voulons pas que des personnes extérieures puissent\naccéder à ces services.\n\nConcernant les autres règles, cela dépend les besoins de chaque entreprise. Par exemple, une entreprise manipulant des\ndonnées sensibles peut vouloir bloquer l'accès à certains sites internet voir bloquer l'accès à internet tout court.\nMais si l'entreprise souhaite que ses employés puissent accéder à internet, elle peut vouloir bloquer l'accès à certains\nsites internet comme les réseaux sociaux ou les sites de streaming. <br>\n\n#### Configuration de la sauvegarde\n\nNous allons maintenant configurer la sauvegarde automatique de la configuration de PFSense.\n\n![Configuration de la sauvegarde 1](pfsense-backup-1.png)\n\nPour cela, il faut aller dans l'onglet `Services` puis `Auto Config Backup`.\n\n![Configuration de la sauvegarde 2](pfsense-backup-2.png)\n\nIl faut ensuite activer la sauvegarde automatique en cliquant sur `Enable` puis en choisissant la fréquence de\nsauvegarde. <br>\nDans notre cas, nous allons activer la sauvegarde automatique lors de chaque modification de la configuration.\n\n![Configuration de la sauvegarde 3](pfsense-backup-3.png)\n\nAinsi lors de chaque modification de la configuration, PFSense va sauvegarder la configuration dans un fichier XML. La\nliste des sauvegardes est disponible dans l'onglet `Restore`. <br>\nSi nous voulons restaurer une sauvegarde, il suffit de cliquer sur l'image de restauration de la sauvegarde voulue.\n\n![Configuration de la sauvegarde 4](pfsense-backup-4.png)\n\nPFSense nous demande ensuite si nous voulons restaurer la sauvegarde, il faut cliquer sur `OK`.\n\nLa restauration de la sauvegarde de la configuration est maintenant terminée.\n\n### Active Directory\n\n#### Installation\n\nPlusieurs bonnes pratiques sont à respecter lors de l'installation d'un serveur Windows Server 2019 :\n\n![Configuration du Windows Server 1](windows-server-config-1.png)\n\nD'abord, nous changeons le nom de la machine pour qu'il soit plus facile à identifier.\n\n![Configuration du Windows Server 2](windows-server-config-2.png)\n\nNous changeons l'adresse IP de la machine pour qu'elle soit dans le même réseau que le serveur PFSense.<br>\nPuis, nous installons aussi les mises à jour de Windows Server 2019.\n\n#### Configuration\n\n![Configuration du Windows Server 3](windows-server-config-3.png)\n\nMaintenant que le serveur est prêt, nous pouvons installer le rôle Active Directory.\n\n![Configuration du Windows Server 4](windows-server-config-4.png)\n\nNous choisissons d'installer de nouveaux rôles sur le serveur.\n\n![Configuration du Windows Server 5](windows-server-config-5.png)\n\nNous choisissons le rôle Active Directory et nous choisissons le serveur sur lequel l'installer.\n\n![Configuration du Windows Server 6](windows-server-config-6.png)\n\nNous choisissons les options par défaut et vérifions que tout est correct.<br>\nL'installation du rôle Active Directory est maintenant terminée.\n\n![Configuration du Windows Server 7](windows-server-config-7.png)\n\nNous pouvons maintenant déployer le serveur en tant que contrôleur de domaine.\n\n![Configuration du Windows Server 8](windows-server-config-8.png)\n\nNous choisissons de créer un nouveau domaine dans une nouvelle forêt.<br>\nLe nom de domaine sera `infra.com` pour le projet.\n\n![Configuration du Windows Server 9](windows-server-config-9.png)\n\nNous choisissons le niveau fonctionnel de la forêt et du domaine et nous choisissons le mot de passe du mode de restauration des services d'annuaire.\n\n![Configuration du Windows Server 10](windows-server-config-10.png)\n\nNous choisissons les options par défaut jusqu'à la fin de l'installation et nous vérifions que tout est correct.\n\n#### Configuration des utilisateurs\n\n![Configuration du Windows Server 11](windows-server-config-11.png)\n\nNous pouvons maintenant créer des utilisateurs pour le domaine en allant dans l'onglet `Utilisateurs et ordinateurs Active Directory`.\n\n![Configuration du Windows Server 12](windows-server-config-12.png)\n\nNous créons les Unités d'Organisation Admin et Client pour les utilisateurs et les groupes.\n\n![Configuration du Windows Server 13](windows-server-config-13.png)\n![Configuration du Windows Server 14](windows-server-config-14.png)\n\nExemple de création d'un utilisateur dans l'Unité d'Organisation Admin.\n\n![Configuration du Windows Server 15](windows-server-config-15.png)\n\nPuis, nous ajoutons l'utilisateur dans le groupe Administrateurs.\n\n#### Configuration du DNS\n\nNous allons maintenant configurer le DNS sur le serveur Windows Server 2019.<br>\nLe serveur DNS va permettre de faire la résolution de nom de domaine.<br>\nUne zone de recherche directe est déjà créée par défaut pour le domaine `infra.com`.\n\n![Configuration du DNS 1](windows-server-dns-1.png)\n\nNous allons ajouter une zone de recherche inversée pour le domaine `infra.com`.\n\n[//]: # (![Configuration du DNS 2]&#40;windows-server-dns-2.png&#41;)\n\n[//]: # (![Configuration du DNS 3]&#40;windows-server-dns-3.png&#41;)\n\n[//]: # (![Configuration du DNS 4]&#40;windows-server-dns-4.png&#41;)\n\n[//]: # (![Configuration du DNS 5]&#40;windows-server-dns-5.png&#41;)\n![Configuration du DNS 6](windows-server-dns-6.png)\n\n[//]: # (![Configuration du DNS 7]&#40;windows-server-dns-7.png&#41;)\n\nConcernant les options à choisir, on laisse les options par défaut sauf dans le nom de la zone de recherche inversée où on indique le début de l'adresse IP du serveur Windows\nServer 2019.\nAinsi, la zone de recherche inversée sera `10.0`.<br>\nOn fait ceci pour que le serveur DNS puisse faire la résolution de nom de domaine et de toutes les adresses IP du réseau.\n\n[//]: # (![Configuration du DNS 8]&#40;windows-server-dns-8.png&#41;)\n\n[//]: # ()\n\n[//]: # (Nous créons un nouveau pointeur pour la zone de recherche inversée.)\n\n![Configuration du DNS 9](windows-server-dns-9.png)\n\nOn utilise la commande `nslookup` pour vérifier que la résolution de nom de domaine fonctionne bien. On vérifie aussi que la résolution de nom de domaine inverse fonctionne bien.\n\nNotre serveur DNS est maintenant configuré.\n\n### Serveur de messagerie\n\nPour le service de messagerie, nous allons utiliser le service de messagerie de Windows Exchange Server 2019.<br>\nNous allons installer le service de messagerie un nouveau serveur Windows Server 2019. <br>\nNous passerons donc les détails de l'installation du windows serveur ainsi que des bonnes pratiques à respecter lors de l'installation, car nous l'avons déjà fait précédemment.\n\n#### Installation\n\nPour commencer, il faudra télécharger l'image ISO de Windows Exchange Server 2019 sur le site de Microsoft.<br>\nUne fois l'image ISO téléchargée, nous pouvons lancer l'installation de Windows Exchange Server 2019.\n\n![Configuration du Windows Exchange Server 1](exchange-1.png)\n\nOn laisse les options par défaut pour la plupart des options, dans la partie \"Sélection du rôle serveur\" on choisit\n`Rôle de boîte aux lettres`.\n\n![Configuration du Windows Exchange Server 2](exchange-2.png)\n\nOn continue alors jusqu'à demander le nom de l'organisation. On choisit `infra.com` pour le nom de l'organisation dans\nnotre cas. <br>\nAprès cela, on continue jusqu'à la fin des configurations. <br>\nSe lancera ensuite l'installation de Windows Exchange Server 2019 qui peut être excessivement longue. Une fois\nl'installation terminée, on redémarre le serveur.\n\n#### Configuration\n\nAvant de configurer le serveur de messagerie, on va retourner dans l'Active Directory pour créer un nouvel utilisateur qui sera le compte administrateur du serveur de messagerie.\n\n![Configuration du Windows Exchange Server 3](exchange-3.png)\n\nPar ailleurs, on se rend compte en retournant dans l'AD qu'une nouvelle Unité d'Organisation a été créée pour le serveur de messagerie.\n\n![Configuration du Windows Exchange Server 4](exchange-4.png)\n![Configuration du Windows Exchange Server 5](exchange-5.png)\n\nAfin de clarifier les choses, nous allons créer une Unité d'Organisation `Exchange` dans laquelle nous allons mettre le ou les comptes administrateurs du serveur de messagerie.\nIl ne faut donc pas oublier de lui associer les droits d'administrateur du serveur de messagerie.\n\n![Configuration du Windows Exchange Server 6](exchange-6.png)\n\nMaintenant que le compte administrateur est créé, nous pouvons nous connecter au serveur de messagerie avec ce compte. <br>\nPour cela, nous allons entrer l'URL `https://localhost/ecp` dans un navigateur web. <br>\nCela nous permettra de nous connecter à l'interface d'administration du serveur de messagerie.\n\nNous allons nous connecter avec le compte administrateur que nous venons de créer.\n\n![Configuration du Windows Exchange Server 7](exchange-7.png)\n\nNous arrivons alors sur l'interface d'administration du serveur de messagerie. <br>\nDe là, nous allons pouvoir configurer le serveur de messagerie.\n\n![Configuration du Windows Exchange Server 8](exchange-8.png)\n\nDans notre cas nous allons ajouter une nouvelle boîte aux lettres pour l'utilisateur `Pace Fabio`.\n\n![Configuration du Windows Exchange Server 9](exchange-9.png)\n\nOn remplit alors l'alias de la boîte aux lettres, c'est-à-dire le suffixe de l'adresse mail. <br>\nEt on n'oublie pas non plus de choisir l'utilisateur auquel on veut associer la boîte aux lettres.\n\nUne fois cela fait, notre boîte aux lettres est créée et est prête à être utilisée.\n\n#### Utilisation de la messagerie\n\nPour utiliser la messagerie, nous allons utiliser nous connecter sur une machine Client Windows. <br>\nOn inscrit alors dans l'URL du navigateur web l'adresse IP du serveur de messagerie, ce qui nous permettra de nous\nconnecter à l'interface de connexion de la messagerie. <br>\nOn se connecte alors avec l'adresse mail et le mot de passe de l'utilisateur auquel on a associé la boîte aux lettres.\n\n![Configuration du Windows Exchange Server 10](exchange-10.png)\n\nNous voilà connecté à la messagerie sur le compte de l'utilisateur `Pace Fabio`.\n\n![Configuration du Windows Exchange Server 11](exchange-11.png)\n\nOn peut alors envoyer un mail à un autre utilisateur de la messagerie.\n\n![Configuration du Windows Exchange Server 12](exchange-12.png)\n\nEn se connectant sur la messagerie de l'utilisateur auquel on a envoyé le mail, on peut voir que le mail a bien été reçu.\n\nAinsi, nous avons configuré un serveur de messagerie avec Windows Exchange Server 2019 et nous avons pu envoyer et recevoir des mails sur notre domaine `infra.com`.\n\n## Serveur Web\n\nPour le serveur web, nous allons utiliser le service Nginx. <br>\nNous allons installer le service Nginx sur une nouvelle machine Ubuntu.\n\nConcernant les configurations de la machine Ubuntu, nous allons passer les détails de l'installation du système, car il n'y a rien de particulier à faire.\n\nOn commence par mettre à jour les paquets de la machine Ubuntu.\n\n```bash\nsudo apt update\n```\n\nOn installe ensuite le service Nginx.\n\n```bash\nsudo apt install nginx\n```\n\nUne fois l'installation terminée, on peut vérifier que le service Nginx est bien installé et qu'il fonctionne.\n\n```bash\nsudo systemctl status nginx\n```\n\nUne fois le service Nginx installé, on peut se connecter à l'adresse IP de la machine Ubuntu avec un navigateur web. <br>\nAinsi, on peut voir que le service Nginx est bien installé et qu'il fonctionne.\n\nIl reste maintenant à personnaliser la page d'accueil du serveur web afin qu'elle corresponde à notre domaine `infra.com`. <br>\nÉtant donné que dans notre cas, il s'agit d'un projet de test, nous laisserons la page d'accueil par défaut de Nginx.\n\nAinsi, nous avons configuré un serveur web avec Nginx sur une machine Ubuntu. <br>\nCe dernier est accessible depuis les autres machines du réseau local via l'adresse IP de la machine Ubuntu.\n\n### Client Windows\n\nNous allons maintenant configurer le client Windows pour qu'il puisse rejoindre le domaine `infra.com`.\n\n> Important ! <br>\n> La version de windows utilisée ne doit pas être une version familiale, car ces dernières ne permettent pas de\n> rejoindre\n> un domaine.\n\n#### Configuration\n\nPour commencer, nous allons configurer le client Windows pour qu'il puisse rejoindre le domaine `infra.com`.\n\n![Configuration du DNS 10](windows-client-config-200.png)\n![Configuration du DNS 11](windows-client-config-201.png)\n\nPour cela, on se rend dans les paramètres de la machine Windows, puis dans les paramètres avancés pour pouvoir changer le nom de la machine. <br>\nOn a alors sur le bas de la fenêtre la possibilité de rejoindre un domaine. <br>\nDans notre cas, nous allons renseigner le nom de domaine `infra.com` et nous allons cliquer sur le bouton `OK`.\n\n![Configuration du DNS 12](windows-client-config-202.png)\n\nOn nous demande alors de nous connecter avec un compte administrateur du domaine. <br>\nOn se connecte alors avec le compte administrateur du domaine `infra.com`.\n\n![Configuration du DNS 13](windows-client-config-203.png)\n\nUn message nous indique alors que la machine a bien été ajoutée au domaine `infra.com`.\n\n![Configuration du DNS 14](windows-client-config-204.png)\n![Configuration du DNS 15](windows-client-config-205.png)\n\nAu redémarrage de la machine, on peut voir que l'on peut se connecter avec un compte du domaine `infra.com`.\n\nVoilà, notre machine Windows est maintenant bien connectée au domaine `infra.com`.\n\nElle est donc maintenant prête à être utilisée et à utiliser les différents services du domaine `infra.com` comme le serveur de messagerie ou l'intranet.\n\n## Conclusion\n\nPour conclure ce projet, nous avons pu mettre en place un domaine `infra.com` avec un serveur DNS, un serveur DHCP, un serveur de messagerie et un intranet. <br>\n\nCe projet nous a permis de mettre en place une infrastructure réseau complète pour une petite entreprise. Nous avons appris et mis en pratique les concepts et les composants\nsuivants :\n\n- Pare-feu : avec PFSense, nous avons cloisonné les réseaux, contrôlé le trafic et assuré la sécurité des communications.\n- Active Directory : nous avons configuré un domaine pour gérer de manière centralisée les utilisateurs, leurs droits d'accès et leurs sessions.\n- Serveur de messagerie : le serveur Exchange que nous avons installé permet maintenant aux utilisateurs du domaine d'échanger des emails en interne.\n- Serveur web : l'intranet que nous avons créé permettra aux employés d'accéder à des ressources partagées sur le réseau.\n- Client Windows : la configuration des postes clients a permis aux employés de s'authentifier sur le réseau d'entreprise et d'utiliser les ressources mises en place.\n\nCe projet a été l'occasion de mettre en pratique et de consolider nos connaissances dans les domaines des réseaux, de la sécurité et de l'administration système.\nNous avons pu constater l'importance de la documentation et du respect des bonnes pratiques pour assurer le fonctionnement et la maintenance à long terme d'une infrastructure\ncomplexe.\n","size":4949,"stargazers_count":0,"topics":[],"updated_at":"2023-06-16T08:51:59Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":12,"contributors_count":0,"created_at":"2022-04-20T12:48:49Z","default_branch":"master","description":"The website for the infra project.","fork":false,"forks_count":0,"full_name":"Ayfri/Infra-Website","homepage":null,"html_url":"https://github.com/Ayfri/Infra-Website","id":483652235,"is_template":false,"language":"HTML","name":"Infra-Website","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-05-05T12:42:52Z","readme_content":"# Infra-Website\nThe website for the infra project.\n","size":14719,"stargazers_count":0,"topics":[],"updated_at":"2022-05-01T12:14:47Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":17,"contributors_count":0,"created_at":"2022-09-16T16:14:41Z","default_branch":"master","description":"My first set of exercices in Java for my school.","fork":false,"forks_count":0,"full_name":"Ayfri/Java-TP1","homepage":null,"html_url":"https://github.com/Ayfri/Java-TP1","id":537531390,"is_template":false,"language":"Java","name":"Java-TP1","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-09-25T17:18:11Z","readme_content":"# Java-TP1\n\nMy first set of exercices in Java for my school.\n\n## Comment lancer\n\nPour lancer le programme, il faut se placer dans le dossier du projet et lancer `./gradlew run`.\nJava 18 est requis.","size":99,"stargazers_count":1,"topics":[],"updated_at":"2023-03-06T09:13:49Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":32,"contributors_count":0,"created_at":"2022-10-02T20:37:36Z","default_branch":"master","description":"My second set of exercices to do in Java for my school.","fork":false,"forks_count":0,"full_name":"Ayfri/Java-TP2","homepage":null,"html_url":"https://github.com/Ayfri/Java-TP2","id":544580589,"is_template":false,"language":"Java","name":"Java-TP2","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-10-11T10:09:32Z","readme_content":"# Java-TP2\n\nMy first set of exercices in Java for my school.\n\n## Comment lancer\n\nPour lancer le programme, il faut se placer dans le dossier du projet et lancer `./gradlew run`.\nJava 18 est requis.\nJavaFX et toutes les dépendances seront automatiquement téléchargées et installées.\n\nNote : L'application console ne marche pas à cause de JavaFX.","size":125,"stargazers_count":2,"topics":[],"updated_at":"2022-11-03T16:10:17Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":38,"contributors_count":0,"created_at":"2022-11-05T06:37:11Z","default_branch":"master","description":"My third set of exercices to do for school.","fork":false,"forks_count":0,"full_name":"Ayfri/Java-TP3","homepage":null,"html_url":"https://github.com/Ayfri/Java-TP3","id":562052716,"is_template":false,"language":"Java","name":"Java-TP3","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2023-01-24T22:01:46Z","readme_content":"# Java-TP3\n\nMy third set of exercices to do for school.\n\n## Comment lancer\n\nPour lancer le programme principal, il faut se placer dans le dossier du projet et lancer `./gradlew run`.\nJava 19 est requis.\nToutes les dépendances seront automatiquement téléchargées et installées.\n\n**Attention :**<br>\nLa commande `./gradlew yugiohapi:run` est à lancer en premier lieu pour télécharger un JSON contenant quelques centaines de cartes YuGiOh\npour l'exercice 3.\nCela permet d'éviter de le re-télécharger à chaque lancement du programme.\n\n**Note :**<br>\nLes images des cartes seront téléchargées dans le dossier `/src/main/resources/cards` pour éviter de les re-télécharger à chaque lancement\ndu programme.\nAprès plusieurs dizaines de cartes affichées, le dossier peut prendre plusieurs MB de stockage.\n\nInternet est donc requis pour lancer l'exercice YuGiOh.\n\n## Diagramme\n\nLe diagramme des classes est disponible dans le fichier `YuGiOh Diagramme.png`.\n\n![Diagramme des classes YuGiOh](YuGiOh%20Diagrame.png)\n","size":15730,"stargazers_count":0,"topics":[],"updated_at":"2022-11-05T08:02:20Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":1,"contributors_count":0,"created_at":"2021-09-06T13:47:39Z","default_branch":"master","description":"A code editor made in Kotlin using Compose.","fork":false,"forks_count":0,"full_name":"Ayfri/Kode","homepage":null,"html_url":"https://github.com/Ayfri/Kode","id":403639147,"is_template":false,"language":null,"name":"Kode","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-09-06T13:47:40Z","readme_content":"# Kode\nA code editor made in Kotlin using Compose.\n","size":14,"stargazers_count":0,"topics":[],"updated_at":"2021-09-06T13:47:43Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":61,"contributors_count":0,"created_at":"2022-05-15T21:28:40Z","default_branch":"master","description":"An intellij plugin to help you develop wih KordEx.","fork":false,"forks_count":0,"full_name":"Ayfri/KordEx-Intellij-Plugin","homepage":"https://plugins.jetbrains.com/plugin/19163-kordex-utils","html_url":"https://github.com/Ayfri/KordEx-Intellij-Plugin","id":492608265,"is_template":false,"language":"Kotlin","name":"KordEx-Intellij-Plugin","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-12-16T04:34:03Z","readme_content":"# KordEx-Intellij-Plugin\n\n![Downloads](https://img.shields.io/jetbrains/plugin/d/io.ayfri.kordex-plugin)\n![Version](https://img.shields.io/jetbrains/plugin/v/io.ayfri.kordex-plugin)\n\nAn intellij plugin to help you develop with the Discord Library [KordEx](https://github.com/Kord-Extensions/kord-extensions).\n\n![Preview](resources/preview.png)\n\nIt currently has the following features:\n\n- Adds gutter icons to Commands and Events, blue is for public, gold is for ephemeral, each type has its proper icon.\n- Moves you to `action` DSL when you click on it.\n","size":225,"stargazers_count":1,"topics":["intellij-plugin","kordex","kotlin"],"updated_at":"2023-08-15T13:57:59Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":1712,"contributors_count":6,"created_at":"2022-11-13T14:36:08Z","default_branch":"master","description":"A Kotlin library to generate Datapacks for Minecraft Java.","fork":false,"forks_count":7,"full_name":"Ayfri/Kore","homepage":"https://kore.ayfri.com","html_url":"https://github.com/Ayfri/Kore","id":565476655,"is_template":false,"language":"Kotlin","name":"Kore","open_issues_count":10,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-27T22:45:24Z","readme_content":"<h1 align=\"center\"> Kore </h1>\n<p align=\"center\">A Kotlin library to write Datapacks for Minecraft.</p>\n<p align=\"center\">\n\t<a href=\"https://github.com/Ayfri/Kore\">\n\t\t<img src=\"https://img.shields.io/github/stars/Ayfri/Kore?color=darkcyan&logo=github&style=flat-square\" title=\"Stars\" alt=\"Stars\"/>\n\t\t<img alt=\"GitHub\" src=\"https://img.shields.io/github/license/Ayfri/Kore?style=flat-square\">\n\t\t<img alt=\"GitHub issues\" src=\"https://img.shields.io/github/issues-raw/Ayfri/Kore?color=dark_green&logo=github&style=flat-square\">\n\t\t<img alt=\"GitHub closed issues\" src=\"https://img.shields.io/github/issues-closed-raw/Ayfri/Kore?color=blue&logo=github&style=flat-square\">\n\t\t<img alt=\"Maven Central\" src=\"https://img.shields.io/maven-central/v/io.github.ayfri.kore/kore?style=flat-square&logo=gradle&label=latest%20version\">\n\t</a>\n\t<a href=\"https://kotlinlang.slack.com/archives/C066G9BF66A\">\n\t\t<img src=\"https://img.shields.io/badge/%23kore-4A154B?logo=slack&logoColor=white&style=flat-square\" alt=\"Kotlin Slack\">\n\t</a>\n\t<a href=\"https://discord.gg/BySjRNQ9Je\">\n\t\t<img src=\"https://img.shields.io/badge/Discord-5865F2?logo=discord&logoColor=white&style=flat-square\" alt=\"Discord\">\n\t</a>\n</p>\n<hr>\n\n<p align=\"center\">\n\t<img src=\"kore typography 1200x600.png\" title=\"kore typography\" alt=\"kore typography\"/>\n</p>\n\n**Check the [website](https://kore.ayfri.com) for the latest documentation.**\n\n**LLM-friendly documentation**: [llms.txt](https://kore.ayfri.com/llms.txt) | [llms-full.txt](https://kore.ayfri.com/llms-full.txt)\n**AI Agents skills**: [Kore-Skill](https://github.com/Kore-Minecraft/Kore-Skill) (optional skills pack for AI-assisted\nKore work)\n\nThis library is compatible and made for Minecraft Java 1.20 and later versions, I don't think I will support older versions nor Bedrock Edition.<br>\nYou can still create your own fork and make it compatible with older versions.<br>\nI will accept pull requests for older versions on a separate branch.\n\n## Getting Started\n\nNew on Kore ? Read the [Getting Started](https://kore.ayfri.com/docs/getting-started) guide to learn how to create your first datapack.\n\nYou can use the [Kore Template](https://github.com/Kore-Minecraft/Kore-Template) to start a new project with Kore.\n\nOr install one or more Kore modules by hand with Gradle. If you're starting a new datapack project, begin with the core\n`kore` module.\n\nWith Kotlin DSL:\n\n```kotlin\nimplementation(\"io.github.ayfri.kore:kore:VERSION\")\n```\n\nWith Groovy DSL:\n\n```groovy\nimplementation 'io.github.ayfri.kore:kore:VERSION'\n```\n\nFor builds published automatically from every commit on `master`, add the Sonatype snapshots repository and use the same\nversion with the `-SNAPSHOT` suffix:\n\n```kotlin\nrepositories {\n  mavenCentral()\n  maven(\"https://central.sonatype.com/repository/maven-snapshots/\")\n}\n\ndependencies {\n  implementation(\"io.github.ayfri.kore:kore:VERSION-SNAPSHOT\")\n}\n```\n\nThen activate the `-Xcontext-parameters` compiler option:\n\n```kotlin\nkotlin {\n\tcompilerOptions {\n\t\tfreeCompilerArgs.add(\"-Xcontext-parameters\")\n\t}\n}\n```\n\nYou should also use Java 21 or higher:\n\n```kotlin\nkotlin {\n\tjvmToolchain(21)\n}\n```\n\nThen create a `Main.kt` file and start writing your datapacks. See the [documentation](https://kore.ayfri.com/docs/home) for more information, including the [Commands guide](https://kore.ayfri.com/docs/commands/commands) for all available commands.\n\n## Installable Modules\n\nKore is split into installable modules. Start with `kore`, then add the others only when you need their extra\nabstractions or tooling.\n\n### Core DSL - `kore`\n\n- Docs: [Getting Started](https://kore.ayfri.com/docs/getting-started)\n- Use it to create Minecraft datapacks with the main Kore DSL.\n- Coordinates: `io.github.ayfri.kore:kore:VERSION`\n\n### Gameplay abstractions - `oop`\n\n- Docs: [OOP Utilities](https://kore.ayfri.com/docs/oop/oop-utilities)\n- Adds object-oriented wrappers for entities, teams, scoreboards, timers, boss bars, spawners, and related gameplay\n  systems.\n- Especially useful when several gameplay features need to exchange state, for example wiring teams into boss bars,\n  scoreboards, timers, or entity handles.\n- Coordinates: `io.github.ayfri.kore:oop:VERSION`\n\n### Helper utilities - `helpers`\n\n- Docs: [Helpers Utilities](https://kore.ayfri.com/docs/helpers/utilities)\n- Adds utility-focused features such as renderers, raycasts, scheduler utilities, scoreboard math, state delegates, and\n  VFX helpers.\n- Great for filling gaps around the core DSL, like rich text rendering, reusable state access, particle shapes, or\n  math-heavy scoreboard workflows.\n- Coordinates: `io.github.ayfri.kore:helpers:VERSION`\n\n### Datapack importer - `bindings` (experimental)\n\n- Docs: [Bindings](https://kore.ayfri.com/docs/advanced/bindings)\n- Imports existing datapacks and generates type-safe Kotlin bindings for their resources.\n- Coordinates: `io.github.ayfri.kore:bindings:VERSION`\n\n## Example\n\n```kotlin\nfun main() {\n\tval datapack = dataPack(\"test\") {\n\t\tfunction(\"display_text\") {\n\t\t\ttellraw(allPlayers(), textComponent(\"Hello World!\"))\n\t\t}\n\n\t\trecipes {\n\t\t\tcraftingShaped(\"enchanted_golden_apple\") {\n\t\t\t\tpattern(\n\t\t\t\t\t\"GGG\",\n\t\t\t\t\t\"GAG\",\n\t\t\t\t\t\"GGG\"\n\t\t\t\t)\n\n\t\t\t\tkey(\"G\", Items.GOLD_BLOCK)\n\t\t\t\tkey(\"A\", Items.APPLE)\n\n\t\t\t\tresult(Items.ENCHANTED_GOLDEN_APPLE)\n\t\t\t}\n\t\t}\n\n\t\tfunction(\"tp_random_entity_to_entity\") {\n\t\t\tval entityName = \"test\"\n\t\t\tval entity = allEntities(limitToOne = true) {\n\t\t\t\tname = entityName\n\t\t\t}\n\n\t\t\tsummon(Entities.CREEPER, vec3(), nbt {\n\t\t\t\tthis[\"CustomName\"] = textComponent(\"Hello World!\")\n\t\t\t})\n\n\t\t\texecute {\n\t\t\t\tasTarget(allEntities {\n\t\t\t\t\tlimit = 3\n\t\t\t\t\tsort = Sort.RANDOM\n\t\t\t\t})\n\n\t\t\t\tifCondition {\n\t\t\t\t\tscore(self(), \"test\") lessThan 10\n\t\t\t\t}\n\n\t\t\t\trun {\n\t\t\t\t\tteleport(entity)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpack {\n\t\t\tdescription = textComponent(\"Datapack test for \", Color.GOLD) + text(\"Kore\", Color.AQUA) { bold = true }\n\t\t}\n\t}\n\n\tdatapack.generateZip()\n}\n```\n\n## Community Creations\n\n-   [SimplEnergyKore](https://github.com/e-psi-lon/SimplEnergyKore)\n-   [Kore-Bindings](https://github.com/e-psi-lon/Kore-Bindings)\n-   [OreCrops](https://github.com/e-psi-lon/OreCrops)\n-   [realms-map](https://github.com/Aeltumn/realms-maps)\n\n_How to add your project to the list ?_\n\n-   Create an issue or contact me on [Discord](https://discord.gg/BySjRNQ9Je).\n\n## Features\n\n-   Datapack generation as files or zips or jar files for mod-loaders.\n-   Function generation.\n-   All commands with all subcommands and multiple syntaxes.\n-   Generation of all data-driven features of Minecraft (Advancements, Loot Tables, Recipes, ...).\n-   Selectors.\n-   NBT tags.\n-   Chat components.\n-   World generation.\n-   Lists for all registries (Blocks, Items, Entities, Advancements, ...).\n-   Colors/Vector/Rotation/... classes with common maths/conversion operations.\n-   Macros support.\n-   Inventory/Scheduler managers.\n- Helper modules for raycasts, text renderers, scoreboard math, delegates, and VFX pipelines.\n- OOP gameplay helpers for boss bars, cooldowns, entities, scoreboards, spawners, teams, and timers.\n-   Scoreboard display manager (like on servers).\n-   Merging datapacks, even with existing zips.\n-   Generation of datapacks as mods usable with mod-loaders (Fabric, NeoForge, ...).\n-   Debugging system inside commands or functions.\n-   Common NBT tags generation (blocks, items, entities, ...).\n-   OOP module (experimental).\n\n> Note: All APIs for commands, selectors, NBT tags, ... are public, so you can use them to create your own features.\n\n## Website\n\n### How the website works\n\n- **Location**: The website is a Kotlin Multiplatform subproject under `website/`.\n- **Frameworks & tools**: It uses [**Kobweb**](https://kobweb.varabyte.com/) (Kotlin/Compose for Web) with a Kotlin/JS target, Markdown processing, and small JS/npm deps exposed via the Gradle plugin. Generated Kotlin files are written to `build/generated/kore/src/jsMain/kotlin` during the build.\n- **Runtime**: [`AppEntry.kt`](./website/src/jsMain/kotlin/io/github/ayfri/kore/website/AppEntry.kt) initializes the Kobweb app, configures a custom Markdown renderer, and sets the site-wide error page via `InitKobweb`.\n- **Build output**: The static site export is produced by the `kobwebExport` Gradle task and placed under `website/.kobweb/site/` for deployment.\n\n### How to run the website\n\n- **Prerequisites**:\n  - Java 21 (JDK 21) installed and `JAVA_HOME` set.\n  - The project uses the Gradle wrapper (`gradlew`). Ensure it is executable on your platform.\n  - Node tooling for the Kotlin/JS parts (npm/yarn).\n\n - **Kobweb CLI (recommended for local dev)**:\n  - The Kobweb CLI provides a convenient development workflow for Kotlin/Kobweb projects. It runs a dev server with live reload and can export a static build.\n\n  - **Install the Kobweb CLI**: See the official instructions on the Kobweb website: [Kobweb CLI - Installation](https://kobweb.varabyte.com/docs/getting-started/getting-kobweb).\n\n  - **Run the dev server (live reload)**:\n\n    ```bash\n    kobweb run\n    ```\n\n    - By default the dev server runs on `http://localhost:8080` and watches Kotlin sources, Markdown content under `website/src/jsMain/resources/markdown/`, and static resources. Changes trigger rebuilds and browser reloads.\n    - Configure server settings (port, logging, etc.) in `website/.kobweb/conf.yaml`.\n\n  - **Export a static site**:\n\n    ```bash\n    kobweb export\n    ```\n\n    - The static output is written to `website/.kobweb/site/` and is suitable for deployment to static hosts.\n\n  - **Gradle tasks (alternative)**:\n    - If you prefer not to install the CLI, the Gradle tasks are still available:\n\n      ```bash\n      ./gradlew :website:kobwebStart -t # Run with live reload\n      ./gradlew :website:kobwebStop # Stop the server\n      ./gradlew :website:kobwebExport -PkobwebExportLayout=STATIC -PkobwebBuildTarget=RELEASE -PkobwebReuseServer=false\n      ```\n\n - **Troubleshooting**:\n  - If the dev server doesn't pick up generated Kotlin or Gradle config changes, restart the server.\n  - To change the dev server port, edit `website/.kobweb/conf.yaml` or use the CLI configuration options.\n  - If you see stale files, run `./gradlew :website:clean :website:build` before restarting the dev server.\n\n### Notes for contributors\n\n- Generated Kotlin for docs and GitHub releases is written to `build/generated/kore/src/jsMain/kotlin` and is created by Gradle tasks during the build; you generally do not need to commit those generated files.\n- If you modify Markdown front-matter or layout logic, re-run the build/export tasks to regenerate the site artifacts.\n\n## Known issues\n\nCheck out the [Known Issues](https://kore.ayfri.com/docs/advanced/known-issues) page for a list of known issues and workarounds.\n\n## Star History\n\n<a href=\"https://www.star-history.com/#Ayfri/Kore&Date\">\n <picture>\n   <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=Ayfri/Kore&type=Date&theme=dark\" />\n   <source media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=Ayfri/Kore&type=Date\" />\n   <img alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=Ayfri/Kore&type=Date\" />\n </picture>\n</a>\n\n## Contributing\n\nWant to contribute to Kore? Start with the [Contributing to Kore](https://kore.ayfri.com/docs/contributing/contributing)\nguide and the repository-level [Contribution guidelines](CONTRIBUTING.md).\n\nIf you use Cursor or similar tools, you can install the\noptional [Kore-Skill](https://github.com/Kore-Minecraft/Kore-Skill) skills pack for contributor- and user-focused\nguidance.\n\n## Support\n\nIf you want to support the project, please consider donating !\n\n<a href=\"https://www.buymeacoffee.com/ayfri\" target=\"_blank\"><img src=\"https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png\" alt=\"Buy Me A Coffee\" style=\"height: 41px !important;width: 174px !important;box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;-webkit-box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;\" ></a>\n\n## License\n\nThis project is licensed under the GNU 3.0 License – see the [LICENSE](LICENSE) file for details.\n\n","size":13541,"stargazers_count":133,"topics":["datapack","functions","kore","kotlin-dsl","kotlinserverside","minecraft","minecraft-datapack","minecraft-kotlin","modding","modding-tools"],"updated_at":"2026-04-27T22:45:28Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":21,"contributors_count":0,"created_at":"2025-01-31T13:30:30Z","default_branch":"main","description":"A minecraft username sniper tool.","fork":false,"forks_count":0,"full_name":"Ayfri/MCUS","homepage":null,"html_url":"https://github.com/Ayfri/MCUS","id":925226870,"is_template":false,"language":"Python","name":"MCUS","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-03-27T13:59:08Z","readme_content":"# 🎮 Minecraft Username Checker\n\nA command-line tool to check if a Minecraft username is available, with automatic refresh at customizable intervals.\n\n## 📋 Requirements\n\n1. Make sure you have Python installed on your system\n2. Install `uv` if you want the fastest setup and launch path\n\nEverything is now defined in `pyproject.toml`. There is no `requirements.txt` anymore.\n\n## 🚀 Usage\n\n### 💻 Using execute.bat (Recommended)\n\nYou can run the script in two ways:\n\n1. With a username:\n\n```bash\nexecute.bat desired_username\n# Example: execute.bat Notch\n```\n\n2. Without arguments (uses last saved username):\n\n```bash\nexecute.bat\n```\n\nThe script will:\n\n1. Use `uv` automatically when it is installed\n2. Fall back to a local Python virtual environment if `uv` is not available\n3. Install the project from `pyproject.toml`\n4. Save the username for next use (if provided)\n5. Start monitoring the username\n\n### ⌨️ Manual Usage\n\nRun the script with the following arguments:\n\n```bash\nuv sync\nuv run mcus --username \"desired_username\" --interval 10\n```\n\nArguments:\n\n- `--username`: The Minecraft username to check (required)\n- `--interval`: Check interval in seconds (optional, default: 10)\n\nIf you do not have `uv`, you can still run the module directly with Python:\n\n```bash\npython check_minecraft_username.py --username \"desired_username\" --interval 10\n```\n\n## ✨ Features\n\n- 🔄 Real-time username availability monitoring\n- 🔔 Windows notifications via `winotify` when username becomes available\n- 📝 Automatic notepad file creation with:\n  - 👤 Available username\n  - 🔗 Link to change Minecraft username\n  - 🕒 Timestamp\n- 🤖 Discord webhook integration (optional)\n- ⚠️ Error handling with explicit messages\n- 📊 Clean console output with timestamps\n- 💾 Username persistence in execute.bat\n- 🎨 ASCII art banner\n\n## 🚨 Notifications System\n\nWhen a username becomes available, the tool will trigger multiple notifications:\n\n### 1. Windows Notification 🔔\n\n- Instant toast notification in Windows via `winotify`\n- Shows the available username\n- Stays visible for 10 seconds\n\n### 2. Notepad File 📝\n\n- Automatically creates a text file on your Desktop\n- Filename: `minecraft_username_[USERNAME].txt`\n- Contains:\n  - The available username\n  - Direct link to Minecraft's profile page for changing username\n  - Exact date and time when it became available\n- Opens automatically in Notepad\n\n### 3. Discord Webhook (Optional) 🤖\n\n- Sends a rich embed message to your Discord channel\n- Includes:\n  - Username that became available\n  - Timestamp of availability\n  - Green color coding for visibility\n- To enable, see Discord Integration section below\n\n## 🔌 Discord Integration\n\nTo enable Discord notifications:\n\n1. Create a `.env` file in the same directory\n2. Add your Discord webhook URL:\n\n```\nDISCORD_WEBHOOK_URL=your_webhook_url_here\n```\n","size":41,"stargazers_count":5,"topics":[],"updated_at":"2026-04-12T01:17:34Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":24,"contributors_count":0,"created_at":"2021-11-30T04:10:12Z","default_branch":"master","description":"A tool to generate JSONs used for Minecraft like recipes or blockstates.","fork":false,"forks_count":0,"full_name":"Ayfri/Minecraft-Jsons","homepage":null,"html_url":"https://github.com/Ayfri/Minecraft-Jsons","id":433288693,"is_template":false,"language":"Kotlin","name":"Minecraft-Jsons","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-04-19T04:24:14Z","readme_content":"# Minecraft-Jsons\nA tool to generate JSONs used for Minecraft like recipes or blockstates.\n","size":57,"stargazers_count":1,"topics":[],"updated_at":"2022-01-10T00:33:09Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":54,"contributors_count":0,"created_at":"2022-02-27T14:31:21Z","default_branch":"master","description":"A 2D game in Kotlin/JS using PIXI-Kotlin.","fork":false,"forks_count":1,"full_name":"Ayfri/Minekraft-2D","homepage":null,"html_url":"https://github.com/Ayfri/Minekraft-2D","id":464160436,"is_template":false,"language":"Kotlin","name":"Minekraft-2D","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-10-31T18:40:21Z","readme_content":"# Minekraft-2D\nA 2D game in Kotlin/JS using PIXI-Kotlin.\n","size":2487,"stargazers_count":0,"topics":[],"updated_at":"2022-03-04T14:30:49Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":9,"contributors_count":0,"created_at":"2024-04-14T21:48:42Z","default_branch":"main","description":"A TP I have to do, must use MongoDB ReplicaSet on docker, can use any language to add CRUD operations.","fork":false,"forks_count":0,"full_name":"Ayfri/MongoDB-ReplicaSet","homepage":null,"html_url":"https://github.com/Ayfri/MongoDB-ReplicaSet","id":786577574,"is_template":false,"language":"Kotlin","name":"MongoDB-ReplicaSet","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2024-04-15T18:34:22Z","readme_content":"# MongoDB-ReplicaSet\n\nA TP I had to do, it must use MongoDB ReplicaSet on Docker, can use any language to add CRUD operations.\n\n## How to install\n\n1. Clone the repository\n2. Run `docker-compose up`\n3. Install Java 17 or higher\n\n## Scripts\n\n- Run `gradle :run --args=create` for creating the `users` collection and adding fake data\n- Run `gradle :run --args=delete` for deleting the first user with more than 70 years old\n- Run `gradle :run --args=search` for searching all users with more than 30 years old\n- Run `gradle :run --args=update` for adding all users 5 years to their age\n\n## Crud operations with Mongosh\n\n### Connecting to the database\n\nFirst, here's how to connect to the database :\n\n```bash\ndocker exec -it mongo1 bash\n```\n\nReplace `mongo1` with `mongo2` or `mongo3` if you want to connect to the other nodes.\n\nThen, you can connect to the database with the following command :\n\n```bash\nmongosh --host localhost --port 27017\n```\n\nThen, here's how to do CRUD operations :\n\n### Creating\n\n```javascript\ndb.users.insertOne({name: \"John\", age: 25})\n```\n\n### Reading\n\n```javascript\ndb.users.find({age: {$gt: 30}})\n```\n\n### Updating\n\n```javascript\ndb.users.updateOne({name: \"John\"}, {$set: {age: 30}})\n```\n\nDeleting :\n\n```javascript\ndb.users.deleteOne({name: \"John\"})\n```\n\n## Differences between script and CLI CRUD operations\n\nThe main difference between the script and the CLI CRUD operations is that the script is more automated and can be run in one command, while\nthe CLI operations require you to type each command manually.\nYou can also define dynamic parameters in the script, while you can't do that in the CLI.\nThe code also let us see the performance of the operations, while the CLI doesn't.\n\n## Difficulties encountered\n\nThe main difficulty I encountered was to set up the Replica Set with Docker Compose. I had to search for examples in GitHub, the main issue\nwas to initialize the replica set with the right configuration.\nUsing environment variables as my first approach was not working, I ended up removing them and use a bash script to initialize the\nReplica Set in an aside container.\n\nAnother issue I encountered was to connect to the database with code. I first created the entire code in JavaScript, but never succeeded to\nconnect to the database. I had to rewrite everything from scratch in another language, I chose Kotlin.\n","size":64,"stargazers_count":0,"topics":[],"updated_at":"2024-04-15T18:28:53Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":15,"contributors_count":0,"created_at":"2020-11-14T18:46:55Z","default_branch":"main","description":"This is a multiplayer Monopoly game made in TypeScript.","fork":false,"forks_count":0,"full_name":"Ayfri/Monopoly","homepage":null,"html_url":"https://github.com/Ayfri/Monopoly","id":312880393,"is_template":false,"language":"HTML","name":"Monopoly","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2020-11-18T18:40:14Z","readme_content":"# Monopoly\nThis is a multiplayer Monopoly game made in TypeScript.\n","size":22,"stargazers_count":0,"topics":[],"updated_at":"2020-11-18T18:40:17Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":38,"contributors_count":0,"created_at":"2025-06-17T13:44:22Z","default_branch":"main","description":"NLP with discord messages.","fork":false,"forks_count":0,"full_name":"Ayfri/NLP-1","homepage":null,"html_url":"https://github.com/Ayfri/NLP-1","id":1003669366,"is_template":false,"language":"Python","name":"NLP-1","open_issues_count":2,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-18T02:13:26Z","readme_content":"# NLP Pipeline for Discord Messages\n\nA complete NLP pipeline for analyzing Discord conversations, designed for educational purposes and NLP coursework.\n\n## Features\n\n- **Text processing**: Cleaning, tokenization, lemmatization with spaCy\n- **Sentiment analysis**: Positive/negative/neutral classification using VADER\n- **Conversation analysis**: Automatic detection and metrics per conversation\n- **FastText embeddings**: Optimized vector representations with L2 normalization\n- **PyTorch DataLoaders**: Efficient batch processing for large datasets\n- **Multilingual support**: French and English\n\n## Installation\n\n```bash\npip install -r requirements.txt\npython -m spacy download fr_core_news_sm\n```\n\n## Usage\n\n```bash\n# Basic processing (uses PyTorch DataLoaders by default)\npython main.py\n\n# With options\npython main.py --verbose\n\n# Skip embeddings\npython main.py --no-embeddings --no-conversations\n\n# Compare embeddings (optional)\npython test_embeddings.py\n```\n\n### Available options\n\n- `--no-embeddings`: Skip FastText generation\n- `--no-conversations`: Skip conversation analysis\n- `--verbose, -v`: Verbose mode\n- `--gap-minutes`: Conversation detection threshold in minutes (default: 10)\n\n## Output files\n\n- `processed_messages.csv`: Processed messages with NLP results\n- `conversations_analysis.csv`: Detailed conversation analysis\n- `conversation_summary.csv`: Global summary\n- `lemma_frequency.csv`: Lemma frequency analysis (top 100)\n- `fasttext_model.bin`: Trained FastText model\n- `embeddings.pkl`: Document vectors\n- `text_clusters.csv`: Message clustering\n\n## Performance\n\nThe pipeline uses PyTorch DataLoaders for efficient batch processing:\n- Automatic GPU detection and usage when available\n- Memory-efficient processing for large datasets\n- Optimized batch sizes for improved performance\n\n## Notes\n\n- Export Discord data using [DiscordChatExporter](https://github.com/Tyrrrz/DiscordChatExporter) in CSV format\n- Place CSV files in `data/` directory\n- FastText is used by default for embeddings (recommended from [`EMBEDDINGS_RAPPORT.md`](./EMBEDDINGS_RAPPORT.md))\n- Detailed configuration available in `src/config.py`\n","size":128,"stargazers_count":0,"topics":[],"updated_at":"2025-06-30T14:38:03Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":64,"contributors_count":2,"created_at":"2024-06-30T22:39:10Z","default_branch":"main","description":"A platformer game where AI agents learn to play through reinforcement learning.","fork":false,"forks_count":0,"full_name":"Ayfri/Neural-Jump","homepage":null,"html_url":"https://github.com/Ayfri/Neural-Jump","id":822317743,"is_template":false,"language":"Python","name":"Neural-Jump","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2025-11-03T01:26:43Z","readme_content":"# Neural-Jump\n\nA platformer game where AI agents learn to play through neuroevolution and genetic algorithms.\n\n## Table of Contents\n\n- [Introduction](#introduction)\n- [Features](#features)\n- [Requirements](#requirements)\n- [Installation](#installation)\n- [Usage](#usage)\n- [Project Structure](#project-structure)\n- [Configuration](#configuration)\n- [License](#license)\n\n## Introduction\n\nNeural-Jump is an interactive platformer game featuring AI agents that learn to navigate levels through evolutionary algorithms. Agents control a player character that must jump over obstacles and reach the end of each level while maximizing their score. The AI uses deep neural networks trained via neuroevolution—a genetic algorithm that evolves the best-performing agents across generations.\n\n## Features\n\n- **Platformer Gameplay**: Classic side-scrolling platformer mechanics with jumping, movement, and collision detection\n- **Neuroevolution**: AI agents improve through genetic algorithms across generations\n- **Deep Neural Networks**: Custom neural network architecture for agent decision-making\n- **Reward Shaping**: Sophisticated reward system that encourages forward progress, penalizes backward movement, and rewards level completion\n- **CUDA Support**: Automatic GPU acceleration when available\n- **Persistent Training**: Save and load agent weights across generations\n- **Manual Play**: Optional manual player mode to understand level design\n- **Customizable Parameters**: Adjustable population size, mutation rates, and game settings\n- **Level Design**: Text-based level files for easy customization\n\n## Requirements\n\n- Python >= 3.13\n- PyTorch with CUDA 12.8 support (for GPU acceleration)\n- Pygame for rendering\n- NumPy, Pandas, Scikit-learn, Matplotlib, Seaborn\n\n## Installation\n\n### 1. Clone the repository\n\n```bash\ngit clone https://github.com/Ayfri/Neural-Jump.git\ncd Neural-Jump\n```\n\n### 2. Install dependencies using uv\n\n[uv](https://github.com/astral-sh/uv) is a fast Python package installer. Install the project dependencies:\n\n```bash\nuv sync\n```\n\n> **Note**: The first time you run this, uv will install PyTorch with CUDA 12.8 support (on Windows and Linux). This may take a few minutes.\n\n### 3. (Optional) Activate the virtual environment\n\nTo manually activate the virtual environment created by uv:\n\n```bash\n# On Windows\n.venv\\Scripts\\Activate.ps1\n\n# On macOS/Linux\nsource .venv/bin/activate\n```\n\n## Usage\n\n### Train AI Agents\n\nRun the AI training script to watch agents learn to play the game:\n\n```bash\nuv run run-ai.py\n```\n\n**Command-line options:**\n\n- `--population-size N`: Number of agents per generation (default: 60)\n- `--mutation-rate R`: Probability of mutation (default: 0.3, range: 0.0-1.0)\n- `--mutation-strength S`: Scale of mutations (default: 0.02)\n- `--load-latest-generation-weights`: Load weights from the latest saved generation\n- `--show-window`: Display the game window during training\n- `--checkpoints`: Use checkpoint platforms as spawn points\n\n**Example:**\n\n```bash\nuv run run-ai.py --population-size 80 --mutation-rate 0.25 --show-window\n```\n\n### Play Manually\n\nTo play the game yourself:\n\n```bash\nuv run run-game.py\n```\n\n## Project Structure\n\n```\nNeural-Jump/\n├── ai/                    # AI agent and neural network code\n│   ├── agent.py          # Agent class with decision-making logic\n│   ├── generation.py     # Population management and evolution\n│   ├── neural_network.py # Neural network architecture\n│   └── __init__.py\n├── game/                  # Game engine and mechanics\n│   ├── game.py           # Main game loop\n│   ├── player.py         # Player character logic\n│   ├── level.py          # Level management\n│   ├── tiles.py          # Tile and collision system\n│   ├── platform.py       # Platform objects\n│   ├── constants.py      # Game constants\n│   ├── settings.py       # Game configuration\n│   ├── main.py           # Game entry point\n│   └── __init__.py\n├── maps/                  # Level definitions\n│   └── level_1.txt       # First level layout\n├── weights/              # Saved neural network weights\n│   └── generation_*.pth  # Weights for each generation\n├── pyproject.toml        # Project configuration and dependencies\n├── run-ai.py             # AI training script\n├── run-game.py           # Manual gameplay script\n├── LICENSE               # GNU General Public License v3.0\n└── README.md             # This file\n```\n\n## Configuration\n\n### Neural Network Architecture\n\nThe agent's neural network processes a 7×7 grid view with 2 channels (obstacles and rewards):\n\n- **Input**: 98 features (7×7×2)\n- **Hidden Layer 1**: 256 neurons (ReLU activation)\n- **Hidden Layer 2**: 128 neurons (ReLU activation)\n- **Hidden Layer 3**: 64 neurons (ReLU activation)\n- **Output**: 3 actions (jump, move left, move right)\n\n### Reward System\n\nAgents receive rewards/penalties based on:\n\n- **Forward Movement**: +0.02 per step forward\n- **Max Position Bonus**: +0.1 when reaching new distance records\n- **Backward Movement**: -0.1 penalty\n- **Stationary Penalty**: -0.05 after 5 ticks without movement\n- **Falling Penalty**: -0.02 when falling more than 5 pixels\n- **Death Penalty**: -20.0 when dying\n- **Win Bonus**: Up to +10.0 based on completion time\n\n### Game Settings\n\nEdit `game/settings.py` to customize:\n\n- Gravity and physics parameters\n- Player acceleration and max velocity\n- Camera settings\n- Tile sizes and collision detection\n\n## License\n\nThis project is licensed under the GNU General Public License v3.0. See the [LICENSE](LICENSE) file for more details.","size":174,"stargazers_count":2,"topics":[],"updated_at":"2026-01-13T07:52:24Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":15,"contributors_count":2,"created_at":"2025-05-21T13:47:58Z","default_branch":"main","description":"Cron.","fork":false,"forks_count":0,"full_name":"Ayfri/PCC-Worker","homepage":null,"html_url":"https://github.com/Ayfri/PCC-Worker","id":987724823,"is_template":false,"language":"TypeScript","name":"PCC-Worker","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-01-22T10:53:39Z","readme_content":"# PCC-Worker: Cloudflare Cron Trigger Worker\n\nThis project is a Cloudflare Worker designed to act as a cron trigger. Its primary purpose is to periodically invoke a Cloudflare Pages Function, specifically one that handles the regeneration of assets for another project.\n\n## Features\n\n-   Scheduled execution via Cloudflare Cron Triggers.\n-   Invokes a specified Cloudflare Pages Function URL.\n-   Configurable via `wrangler.toml` and environment variables.\n-   Includes an optional mechanism for securing the trigger endpoint using a shared secret.\n\n## Project Structure\n\n```\nPCC-Worker/\n├── src/\n│   └── index.ts        # Main worker script\n├── .gitignore          # Specifies intentionally untracked files\n├── LICENSE             # Project license (GPL-3.0)\n├── package.json        # Project dependencies and scripts\n├── pnpm-lock.yaml      # PNPM lockfile\n├── pnpm-workspace.yaml # PNPM workspace configuration (if part of a monorepo)\n├── README.md           # This file\n├── tsconfig.json       # TypeScript configuration\n└── wrangler.toml       # Wrangler configuration for Cloudflare Worker\n```\n\n## Prerequisites\n\n-   Node.js (preferably a recent LTS version)\n-   PNPM package manager (https://pnpm.io/)\n-   A Cloudflare account.\n-   `wrangler` CLI installed and configured (usually handled as a dev dependency via PNPM).\n\n## Setup and Configuration\n\n1.  **Clone the repository (if you haven't already):**\n    ```bash\n    # If applicable, otherwise you already have the project\n    # git clone <repository-url>\n    # cd PCC-Worker\n    ```\n\n2.  **Install Dependencies:**\n    ```bash\n    pnpm install\n    ```\n\n3.  **Configure `wrangler.toml`:**\n    Open the `wrangler.toml` file and customize the following:\n    -   `name`: You can change the worker name if desired (e.g., `\"my-cron-worker\"`).\n    -   `compatibility_date`: Update to a recent date if necessary.\n    -   **`[vars]` section:**\n        -   `PAGES_FUNCTION_URL`: **Crucial.** Set this to the full URL of your Cloudflare Pages Function that needs to be triggered.\n            Example: `PAGES_FUNCTION_URL = \"https://your-pages-project.pages.dev/regenerate-assets\"`\n        -   `CRON_SECRET` (Optional, but Recommended for Security):\n            -   If you want to secure the endpoint, uncomment this line and set a strong, unique secret string.\n                Example: `CRON_SECRET = \"your-very-strong-and-secret-key\"`\n            -   You will also need to configure your target Pages Function to expect and verify this secret (e.g., via an `X-Custom-Cron-Secret` header).\n\n    -   **`[triggers]` section:**\n        -   `crons`: Define the cron schedule for when the worker should run. The default is `[\"0 3 * * *\"]` (every day at 3 AM UTC).\n            Refer to the [Cloudflare Cron Triggers documentation](https://developers.cloudflare.com/workers/wrangler/configuration/#triggers) for syntax.\n\n4.  **(Recommended) Secure your Pages Function:**\n    If you've set `CRON_SECRET` in `wrangler.toml`:\n    *   **In this worker (`src/index.ts`):**\n        Uncomment the `headers` section in the `fetch` call to send the secret:\n        ```typescript\n        // headers: { // Uncomment if you use a secret\n        //   'X-Custom-Cron-Secret': env.CRON_SECRET,\n        // },\n        ```\n        Change to:\n        ```typescript\n        headers: {\n          'X-Custom-Cron-Secret': env.CRON_SECRET,\n        },\n        ```\n    *   **In your Cloudflare Pages project (the one hosting the target function):**\n        -   Add an environment variable (e.g., `CRON_SHARED_SECRET`) with the *same value* as the `CRON_SECRET` in this worker.\n        -   Modify your Pages Function (e.g., `/functions/regenerate-assets.ts`) to check for the `X-Custom-Cron-Secret` header and validate its value against `context.env.CRON_SHARED_SECRET`. If it doesn't match or is missing, return an unauthorized response.\n\n## Usage\n\n1.  **Type Checking (Optional but Recommended):**\n    ```bash\n    pnpm typecheck\n    ```\n\n2.  **Local Development (Simulating Cron):**\n    While `wrangler dev` can run the worker, cron triggers are not directly simulated locally in the same way they run on Cloudflare. You can test the worker's `fetch` logic by manually triggering it or adapting the script for local testing if needed.\n    ```bash\n    # Starts a local server for the worker, but cron won't run automatically\n    pnpm dev\n    ```\n\n3.  **Deployment:**\n    Deploy the worker to your Cloudflare account:\n    ```bash\n    pnpm deploy\n    ```\n    Wrangler will use the settings in `wrangler.toml` to deploy and configure the worker, including setting up the cron trigger.\n\n## Monitoring\n\nOnce deployed, you can monitor the worker's execution and logs through the Cloudflare dashboard:\n1.  Log in to your Cloudflare account.\n2.  Navigate to **Workers & Pages**.\n3.  Select your worker (e.g., `pcc-worker-cron-trigger`).\n4.  Go to the **Logs** tab to see invocation logs, `console.log` outputs, and any errors.\n5.  You can also view trigger history and metrics.\n\n## Contributing\n\nIf you wish to contribute, please follow standard Git practices (fork, branch, commit with conventional messages, pull request).\n\n## License\n\nThis project is licensed under the [GNU General Public License v3.0](./LICENSE).\n","size":45,"stargazers_count":0,"topics":[],"updated_at":"2026-01-22T10:53:40Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":196,"contributors_count":0,"created_at":"2021-04-09T13:37:10Z","default_branch":"master","description":"A framework to help you develop with PIXI 2d games.","fork":false,"forks_count":0,"full_name":"Ayfri/PIXI-Extended","homepage":"https://ayfri.github.io/PIXI-Extended/modules.html","html_url":"https://github.com/Ayfri/PIXI-Extended","id":356283363,"is_template":false,"language":"TypeScript","name":"PIXI-Extended","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-07-09T14:07:33Z","readme_content":"[![npm](https://img.shields.io/npm/dt/pixi-extended?style=flat-square)](https://www.npmjs.com/package/pixi-extended)\n![npm bundle size](https://img.shields.io/bundlephobia/min/pixi-extended?style=flat-square)\n\n# PIXI-Extended\n\nA framework as a npm library to help you develop with PIXI 2d games.<br>\n\n> **Note:<br>This package is bundled with PIXI `v6.0.4`, you don't have to install it.**\n\n## Installation\n\n[`npm i -s pixi-extended`](https://www.npmjs.com/package/pixi-extended) <br>\nYou can use this package with TypeScript.\n\n## Features\n\n-   Enhanced classes that extends default PIXI ones to better use them.\n-   Enhanced event handling strictly typed.\n-   Fully typed in TypeScript, with strict events using custom EventEmitter class.\n-   Some utility collisions/maths classes and functions.\n-   Mouse/Keyboard support with a class & functions.\n-   Other utility classes/objects for PIXI.\n\n## Examples\n\n```javascript\nimport {Color, FPSCounter, loadTexture, PIXI, Sprite} from 'pixi-extended';\n\nconst app = new PIXI.Application({\n\tbackgroundColor: Color.BLACK.toHex(),\n});\n\ndocument.body.appendChild(app.view);\n\nasync function start() {\n\tawait loadTexture('myTexture', 'textures/myTexture.png');\n\n\tconst red = Color.RED;\n\tconst sprite = new Sprite('myTexture');\n\tsprite.color = red;\n\n\tconst fpsCounter = new FPSCounter();\n\tfpsCounter.addToApplication(app);\n\n\tsprite.addToApplication(app);\n}\n\nstart();\n```\n\n## Documentation\n\nThe documentation is automatically generated and updated from the code using GitHub workflows.<br>\n[You can find it here.](https://ayfri.github.io/PIXI-Extended/index.html) <br>\nThe code is on the [`docs` branch](https://github.com/Ayfri/PIXI-Extended/tree/docs).\n","size":3985,"stargazers_count":1,"topics":["game-development","pixi","pixi-extended","pixi-game","pixi-utils","pixijs"],"updated_at":"2021-07-09T14:07:36Z","visibility":"public","watchers_count":2},{"archived":false,"commits_count":229,"contributors_count":3,"created_at":"2021-05-09T15:49:32Z","default_branch":"master","description":"Kotlin/JS bindings for PIXI.js library.","fork":false,"forks_count":2,"full_name":"Ayfri/PIXI-Kotlin","homepage":"","html_url":"https://github.com/Ayfri/PIXI-Kotlin","id":365790027,"is_template":false,"language":"Kotlin","name":"PIXI-Kotlin","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-10-30T15:06:09Z","readme_content":"![GitHub Workflow Status](https://img.shields.io/github/workflow/status/Ayfri/PIXI-Kotlin/Kotlin%20CI?style=flat-square)\n![Sonatype Nexus (Releases)](https://img.shields.io/nexus/r/io.github.ayfri/PIXI-Kotlin?server=https%3A%2F%2Fs01.oss.sonatype.org&style=flat-square&label=Latest%20Version)\n![PIXI.js Version](https://img.shields.io/badge/pixi.js-6.5.2-blue?style=flat-square&logo=npm)\n\n# PIXI-Kotlin\n\nThis is a simple example of what a [PIXI.js](https://github.com/pixijs/pixijs) transcription in Kotlin could look like.\n\nFor now, there are all the classes, interfaces, enums, functions, type aliases, and objects. The private members are not present.\n\nThe types are from [`PIXI 6.5.2`](https://github.com/pixijs/pixijs/releases/tag/v6.5.2).\n\n## Usage\n\nTo use it in a project, just add this to your dependencies:\n\n```kotlin\nrepositories {\n\t...\n\tmavenLocal()\n}\n\ndependencies {\n\timplementation(\"io.github.ayfri:PIXI-Kotlin:VERSION\")\n}\n```\n\nIf you want to add optional PIXI modules, you have to implement them in your project.\n\n```kotlin\nconst val PIXI_KOTLIN_VERSION = \"VERSION\"\n\ndependencies {\n\timplementation(\"io.github.ayfri:PIXI-Kotlin:PIXI_KOTLIN_VERSION\")\n\timplementation(\"io.github.ayfri:PIXI-Kotlin-unsafe-eval:PIXI_KOTLIN_VERSION\")\n}\n```\n\n## Example\n\nSimple application with a sprite, size change when clicking.\n\n```kotlin\nfun main() {\n\tval app = application {\n\t\tbackgroundColor = Color(120, 200, 230)\n\t\tresizeTo = window\n\t}\n\tapp.addToBody()\n\t\n\tval bunny = sprite(\"bunny.png\") {\n\t\tsetPositionFromWindow(0.5, 0.5)\n\t\tanchor.set(0.5)\n\t\tinteractive = true\n\t\taddToApplication(app)\n\t}\n\t\n\tbunny.on(DisplayObjectEvents.mousedown) {\n\t\tbunny.scale.set(1.1)\n\t}\n\t\n\tbunny.on(DisplayObjectEvents.mouseup) {\n\t\tbunny.scale.set(1.0)\n\t}\n}\n```\n\nApplication with keymap and test if sprite sticks out of area.\n\n```kotlin\nfun main() {\n\tval app = application {\n\t\tresizeTo = window\n\t}\n\tapp.addToBody()\n\t\n\tval speed = 10.0\n\tval sprite = sprite(generateBlankTexture(app) {\n\t\twidth = 300.0\n\t\theight = 300.0\n\t\tcolor = Color(255, 0, 0)\n\t}) {\n\t\taddToApplication(app)\n\t\tanchor.set(0.5)\n\t\tsetPositionFromApplication(app, 0.5, 0.5)\n\t\twindow[\"sprite\"] = this\n\t}\n\t\n\tval area = Rectangle(0.0, 0.0, app.screen.width, app.screen.height)\n\t\n\tapp.renderer.on(AbstractRendererEvents.resize) {\n\t\tarea.setSize(app.screen.width, app.screen.height)\n\t}\n\t\n\t\n\tval english = \"en\" in window.navigator.languages.elementAtOrElse(0) { window.navigator.language }\n\tKeyMap(\n\t\tmapOf(\n\t\t\t\"forward\" to setOf(if (english) \"W\" else \"Z\", \"ArrowUp\"),\n\t\t\t\"backward\" to setOf(\"S\", \"ArrowDown\"),\n\t\t\t\"left\" to setOf(if (english) \"A\" else \"Q\", \"ArrowLeft\"),\n\t\t\t\"right\" to setOf(\"D\", \"ArrowRight\"),\n\t\t\t\"power\" to setOf(\" \")\n\t\t),\n\t\tignoreCase = true\n\t).apply {\n\t\tonKeep(\"forward\") {\n\t\t\tif ((sprite.hitBox.top + speed * 2) > area.top) sprite.y -= speed\n\t\t}\n\t\tonKeep(\"backward\") {\n\t\t\tif ((sprite.hitBox.bottom - speed * 2) < area.bottom) sprite.y += speed\n\t\t}\n\t\tonKeep(\"left\") {\n\t\t\tif ((sprite.hitBox.left + speed * 2) > area.left) sprite.x -= speed\n\t\t}\n\t\tonKeep(\"right\") {\n\t\t\tif ((sprite.hitBox.right - speed * 2) < area.right) sprite.x += speed\n\t\t}\n\t\t\n\t\tonPress(\"power\") {\n\t\t\tsprite.alpha = if (sprite.alpha == 0.1) 1.0 else 0.1\n\t\t}\n\t}\n}\n```\n","size":532,"stargazers_count":15,"topics":["kotlin","kotlinjs","pixijs"],"updated_at":"2024-09-16T04:43:45Z","visibility":"public","watchers_count":2},{"archived":false,"commits_count":891,"contributors_count":5,"created_at":"2023-10-02T10:00:36Z","default_branch":"main","description":"PokeCards-Collector is a website that allows you to check Pokemon browse and manage your Pokémon Trading Card Game (TCG) collection.","fork":false,"forks_count":1,"full_name":"Ayfri/PokeCards-Collector","homepage":"https://pokecards-collector.pages.dev","html_url":"https://github.com/Ayfri/PokeCards-Collector","id":699275841,"is_template":false,"language":"Svelte","name":"PokeCards-Collector","open_issues_count":2,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-23T05:06:45Z","readme_content":"<div align=\"center\">\n  <img src=\"./src/assets/pokecards-collector.png\" alt=\"PokéCards-Collector Logo\" width=\"150\"/>\n\n  # PokéCards-Collector\n\n  [![License: GPL-3.0](https://img.shields.io/badge/License-GPL%203.0-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)\n  [![SvelteKit](https://img.shields.io/badge/SvelteKit-FF3E00?style=flat&logo=svelte&logoColor=white)](https://kit.svelte.dev/)\n  [![Supabase](https://img.shields.io/badge/Supabase-3ECF8E?style=flat&logo=supabase&logoColor=white)](https://supabase.io/)\n  [![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=flat&logo=typescript&logoColor=white)](https://www.typescriptlang.org/)\n  [![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-06B6D4?style=flat&logo=tailwind-css&logoColor=white)](https://tailwindcss.com/)\n  [![Cloudflare Pages](https://img.shields.io/badge/Cloudflare_Pages-F38020?style=flat&logo=cloudflare&logoColor=white)](https://pages.cloudflare.com/)\n  [![PNPM](https://img.shields.io/badge/PNPM-F69220?style=flat&logo=pnpm&logoColor=white)](https://pnpm.io/)\n\n  <p>A modern web application for managing your Pokémon Trading Card Game collection</p>\n</div>\n\n## 📋 Overview\n\nPokéCards-Collector is a comprehensive web application built with SvelteKit and Supabase that allows you to browse and manage your Pokémon Trading Card Game (TCG) collection with ease.\n\n### 📸 Website\n\nCheck out the live website [here](https://pokecards-collector.pages.dev).\n\n![Demo Screenshot](./pokecards-collector.png)\n\n## ✨ Features\n\n<table>\n  <tr>\n    <td>🔐</td>\n    <td><b>User Authentication</b></td>\n    <td>Sign up and log in to manage your personal collection.</td>\n  </tr>\n  <tr>\n    <td>🔍</td>\n    <td><b>Card Browser</b></td>\n    <td>Search and view Pokémon TCG cards with advanced filtering options.</td>\n  </tr>\n  <tr>\n    <td>📚</td>\n    <td><b>Collection Management</b></td>\n    <td>Keep track of the cards you own with quantity and condition tracking.</td>\n  </tr>\n  <tr>\n    <td>⭐</td>\n    <td><b>Wishlist</b></td>\n    <td>Maintain a list of cards you want to acquire.</td>\n  </tr>\n  <tr>\n    <td>👤</td>\n    <td><b>Profile & Settings</b></td>\n    <td>Manage your user profile and application settings.</td>\n  </tr>\n  <tr>\n    <td>🤖</td>\n    <td><b>Data Scraping</b></td>\n    <td>Built-in CLI tool to fetch the latest Pokémon TCG data.</td>\n  </tr>\n</table>\n\n## 🛠️ Tech Stack\n\n<table>\n  <tr>\n    <th>Category</th>\n    <th>Technologies</th>\n  </tr>\n  <tr>\n    <td>Frontend</td>\n    <td>\n      <a href=\"https://kit.svelte.dev/\"><img src=\"https://img.shields.io/badge/SvelteKit-FF3E00?style=flat&logo=svelte&logoColor=white\" alt=\"SvelteKit\"/></a>\n      <a href=\"https://www.typescriptlang.org/\"><img src=\"https://img.shields.io/badge/TypeScript-3178C6?style=flat&logo=typescript&logoColor=white\" alt=\"TypeScript\"/></a>\n      <a href=\"https://tailwindcss.com/\"><img src=\"https://img.shields.io/badge/Tailwind_CSS-06B6D4?style=flat&logo=tailwind-css&logoColor=white\" alt=\"Tailwind CSS\"/></a>\n      <a href=\"https://lucide.dev/\"><img src=\"https://img.shields.io/badge/Lucide_Icons-5468FF?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3ggMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPg0KICA8cmVjdCB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9IndoaXRlIi8+DQogIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTIgMTkuNUg4QzcuMTcxNTcgMTkuNSA2LjUgMTguODI4NCA2LjUgMThWMTNDNi41IDEyLjE3MTYgNy4xNzE1NyAxMS41IDggMTEuNUgxMkMxMi44Mjg0IDExLjUgMTMuNSAxMi4xNzE2IDEzLjUgMTNWMThDMTMuNSAxOC44Mjg0IDEyLjgyODQgMTkuNSAxMiAxOS41WiIgZmlsbD0iIzU0NjhGRiIvPg0KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTQgNy41VjE2QzIuMzQzMTUgMTYgMSAxNC42NTY5IDEgMTNWMTAuNUMxIDguODQzMTUgMi4zNDMxNSA3LjUgNCA3LjVaIiBmaWxsPSIjNTQ2OEZGIi8+DQogIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjAgNy41VjE2QzIxLjY1NjkgMTYgMjMgMTQuNjU2OSAyMyAxM1YxMC41QzIzIDguODQzMTUgMjEuNjU2OSA3LjUgMjAgNy41WiIgZmlsbD0iIzU0NjhGRiIvPg0KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTExLjUgNkMxMS41IDYuODI4NDMgMTIuMTcxNiA3LjUgMTMgNy41SDE3QzE3LjgyODQgNy41IDE4LjUgNi44Mjg0MyAxOC41IDZDMTGUNTE1LjE3MTYgMTcuNSAxNC41IDE3IDE0LjVDMTcgMTQuNSAxNi41IDEzLjgyODQgMTYuNSAxM0MxNi41IDEyLjE3MTYgMTYuMTU2OSAxMS41IDE1LjUgMTEuNUMxNC44NDMxIDExLjUgMTQuNSAxMi4xNzE2IDE0LjUgMTNDMTQuNSAxMy44Mjg0IDEzLjgyODQgMTQuNSAxMyAxNC41QzEyLjE3MTYgMTQuNSAxMS41IDEzLjgyODQgMTEuNSAxM0MxMS41IDEyLjE3MTYgMTEuMTU2OSAxMS41IDEwLjUgMTEuNUM5Ljg0MzE1IDExLjUgOS41IDEyLjE3MTYgOS41IDEzQzkuNSAxMy44Mjg0IDguODI4NDMgMTQuNSA4IDE0LjVDNy4xNzE1NyAxNC41IDYuNSAxMy44Mjg0IDYuNSAxM0M2LjUgMTIuMTcxNiA1Ljg0MzE1IDExLjUgNSAxMS41QzQuMTU2ODUgMTEuNSAzLjUgMTIuMTcxNiAzLjUgMTNDMy41IDEzLjgyODQgNC4xNzE1NyAxNC41IDUgMTQuNUM0IDE0LjUgMy41IDE1LjE3MTYgMy41IDE2QzMuNSAxNi44Mjg0IDQuMTcxNTcgMTcuNSA1IDE3LjVDNS44Mjg0MyAxNy41IDYuNSAxNi44Mjg0IDYuNSAxNkM2LjUgMTUuMTcxNiA3LjE3MTU3IDE0LjUgOCAxNC41QzguODI4NDMgMTQuNSA5LjUgMTUuMTcxNiA5LjUgMTZDOS41IDE2LjgyODQgMTAuMTcxNiAxNy41IDExIDE3LjVIMTJDMTEgMTcuNSAxMC41IDE2LjgyODQgMTAuNSAxNkMxMC41IDE1LjE3MTYgOS44Mjg0MyAxNC41IDkgMTQuNUM4LjE3MTU3IDE0LjUgNy41IDE1LjE3MTYgNy41IDE2QzcuNSAxNi44Mjg0IDYuODI4NDMgMTcuNSA2IDE3LjVDNS4xNzE1NyAxNy41IDQuNSAxNi44Mjg0IDQuNSAxNkM0LjUgMTUuMTcxNiA0LjE1Njg1IDE0LjUgMy41IDE0LjVDMi44NDMxNSAxNC41IDIuNSAxNS4xNzE2IDIuNSAxNkMyLjUgMTYuODI4NCAzLjE3MTU3IDE3LjUgNCAxNy41QzMgMTcuNSAyLjUgMTguMTcxNiAyLjUgMTlDMi41IDE5LjgyODQgMy4xNzE1NyAyMC41IDQgMjAuNUM0LjgyODQzIDIwLjUgNS41IDE5LjgyODQgNS41IDE5QzUuNSAxOC4xNzE2IDYuMTcxNTcgMTcuNSA3IDE3LjVDNy44Mjg0MyAxNy41IDguNSAxOC4xNzE2IDguNSAxOUM4LjUgMTkuODI4NCA5LjE3MTU3IDIwLjUgMTAgMjAuNUgxNEMxNC44Mjg0IDIwLjUgMTUuNSAxOS44Mjg0IDE1LjUgMTlDMTUuNSAxOC4xNzE2IDE2LjE3MTYgMTcuNSAxNyAxNy41QzE3LjgyODQgMTcuNSAxOC41IDE4LjE3MTYgMTguNSAxOUMxOC41IDE5LjgyODQgMTkuMTcxNiAyMC41IDIwIDIwLjVDMjAuODI4NCAyMC41IDIxLjUgMTkuODI4NCAyMS41IDE5QzIxLjUgMTguMTcxNiAyMC44Mjg0IDE3LjUgMjAgMTcuNUMyMSAxNy41IDIxLjUgMTYuODI4NCAyMS41IDE2QzIxLjUgMTUuMTcxNiAyMC44Mjg0IDE0LjUgMjAgMTQuNUMxOS4xNzE2IDE0LjUgMTguNSAxNS4xNzE2IDE4LjUgMTZDMTguNSAxNi44Mjg0IDE3LjgyODQgMTcuNSAxNyAxNy41QzE2LjE3MTYgMTcuNSAxNS41IDE2LjgyODQgMTUuNSAxNkMxNS41IDE1LjE3MTYgMTQuODI4NCAxNC41IDE0IDE0LjVDMTMuMTcxNiAxNC41IDEyLjUgMTUuMTcxNiAxMi41IDE2QzEyLjUgMTYuODI4NCAxMy4xNzE2IDE3LjUgMTQgMTcuNUgxM0MxNCAxNy41IDE0LjUgMTYuODI4NCAxNC41IDE2QzE0LjUgMTUuMTcxNiAxNS4xNzE2IDE0LjUgMTYgMTQuNUMxNi44Mjg0IDE0LjUgMTcuNSAxNS4xNzE2IDE3LjUgMTZDMTcuNSAxNi44Mjg0IDE4LjE3MTYgMTcuNSAxOSAxNy41QzE5LjgyODQgMTcuNSAyMC41IDE2LjgyODQgMjAuNSAxNkMyMC41IDE1LjE3MTYgMjEuMTcxNiAxNC41IDIyIDE0LjVDMjIuODI4NCAxNC41IDIzLjUgMTMuODI4NCAyMy41IDEzQzIzLjUgMTIuMTcxNiAyMi44Mjg0IDExLjUgMjIgMTEuNUMyMS4xNzE2IDExLjUgMjAuNSAxMi4xNzE2IDIwLjUgMTNDMjAuNSAxMy44Mjg0IDE5LjgyODQgMTQuNSAxOSAxNC41QzE4LjE3MTYgMTQuNSAxNy41IDEzLjgyODQgMTcuNSAxM0MxNy41IDEyLjE3MTYgMTYuODI4NCAxMS41IDE2IDExLjVDMTUuMTcxNiAxMS41IDE0LjUgMTAuODI4NCAxNC41IDEwQzE0LjUgOS4xNzE1NyAxMy44Mjg0IDguNSAxMyA4LjVDMTIuMTcxNiA4LjUgMTEuNSA3LjgyODQzIDExLjUgN1Y2WiIgZmlsbD0iIzU0NjhGRiIvPg0KPC9zdmc+\" alt=\"Lucide Icons\"/></a>\n    </td>\n  </tr>\n  <tr>\n    <td>Backend</td>\n    <td>\n      <a href=\"https://supabase.io/\"><img src=\"https://img.shields.io/badge/Supabase-3ECF8E?style=flat&logo=supabase&logoColor=white\" alt=\"Supabase\"/></a>\n      <a href=\"https://pokemontcg.io/\"><img src=\"https://img.shields.io/badge/Pokémon_TCG_API-FFCB05?style=flat&logo=pokemon&logoColor=black\" alt=\"Pokémon TCG API\"/></a>\n    </td>\n  </tr>\n  <tr>\n    <td>Deployment</td>\n    <td>\n      <a href=\"https://pages.cloudflare.com/\"><img src=\"https://img.shields.io/badge/Cloudflare_Pages-F38020?style=flat&logo=cloudflare&logoColor=white\" alt=\"Cloudflare Pages\"/></a>\n    </td>\n  </tr>\n  <tr>\n    <td>Tools</td>\n    <td>\n      <a href=\"https://pnpm.io/\"><img src=\"https://img.shields.io/badge/PNPM-F69220?style=flat&logo=pnpm&logoColor=white\" alt=\"PNPM\"/></a>\n      <a href=\"https://github.com/esbuild-kit/tsx\"><img src=\"https://img.shields.io/badge/TSX-3178C6?style=flat&logo=typescript&logoColor=white\" alt=\"TSX\"/></a>\n      <a href=\"https://github.com/SBoudrias/Inquirer.js/tree/master/packages/prompts\"><img src=\"https://img.shields.io/badge/Inquirer-FFCF00?style=flat&logo=javascript&logoColor=black\" alt=\"Inquirer\"/></a>\n    </td>\n  </tr>\n</table>\n\n## 🚀 Getting Started\n\n<details>\n<summary><b>Prerequisites</b></summary>\n\n- [Node.js](https://nodejs.org/) (v18 or higher)\n- [PNPM](https://pnpm.io/installation) package manager\n- A [Supabase](https://supabase.io/) account\n- A [Pokémon TCG API](https://pokemontcg.io/) key\n</details>\n\n<details open>\n<summary><b>Installation</b></summary>\n\n1.  **Clone the repository:**\n    ```bash\n    git clone https://github.com/Ayfri/PokeCards-Collector.git\n    cd PokeCards-Collector\n    ```\n\n2.  **Install dependencies:**\n    ```bash\n    pnpm install\n    ```\n\n3.  **Set up Supabase:**\n    - Create a new project on [Supabase](https://supabase.io/)\n    - In your Supabase project dashboard, go to the SQL Editor\n    - Copy the contents of `supabase-schema.sql` from this repository and run it to create the initial database tables\n    - (Optional) If needed, run the contents of `supabase-schema-update.sql` for subsequent updates\n    - Navigate to Project Settings > API\n    - Find your Project URL and `anon` public key\n\n4.  **Set up Pokémon TCG API Key:**\n    - Get an API key from the [Pokemon TCG API](https://pokemontcg.io/)\n\n5.  **Configure Environment Variables:**\n    - Create a `.env` file in the root of the project by copying `.env.example`\n    - Fill in the required variables:\n      ```dotenv\n      # Supabase Configuration\n      VITE_SUPABASE_URL=YOUR_SUPABASE_PROJECT_URL\n      VITE_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_PUBLIC_KEY\n\n      # Pokemon TCG API Key\n      POKEMON_TCG_API_KEY=YOUR_POKEMON_TCG_API_KEY\n\n      # CDN URL for card images (optional) without trailing slash\n      # If not provided, original API URLs will be used\n      # Format: https://your-cdn.com/path\n      PUBLIC_CARD_CDN_URL=\n      ```\n\n6.  **Run the development server:**\n    ```bash\n    pnpm dev\n    ```\n    The application should now be running on `http://localhost:5173` (or the next available port).\n</details>\n\n## 📊 Data Scraping\n\nThe project includes an interactive CLI tool to fetch and update various Pokémon TCG data required for the application.\n\n<details>\n<summary><b>Running the Scraper CLI</b></summary>\n\n```bash\npnpm scrapers\n```\n\nThis command will present a menu allowing you to choose which scraper to run. Available options include:\n\n<table>\n  <tr>\n    <th>Option</th>\n    <th>Description</th>\n    <th>Dependencies</th>\n  </tr>\n  <tr>\n    <td><code>all</code></td>\n    <td>Run all data scrapers sequentially (pokemons, sets, cards, holo, foil, types). Does <i>not</i> download images.</td>\n    <td>None</td>\n  </tr>\n  <tr>\n    <td><code>cards</code></td>\n    <td>Fetch all Pokémon cards from the TCG API.</td>\n    <td>None</td>\n  </tr>\n  <tr>\n    <td><code>download-images</code></td>\n    <td>Download card images based on the fetched card data.</td>\n    <td>Requires <code>cards</code> to be run first</td>\n  </tr>\n  <tr>\n    <td><code>foil</code></td>\n    <td>Generate foil mask URLs for holographic cards.</td>\n    <td>Requires <code>holo</code> data</td>\n  </tr>\n  <tr>\n    <td><code>holo</code></td>\n    <td>Extract holographic cards from the main card dataset.</td>\n    <td>Requires <code>cards</code> data</td>\n  </tr>\n  <tr>\n    <td><code>pokemons</code></td>\n    <td>Fetch base Pokémon data from PokéAPI.</td>\n    <td>None</td>\n  </tr>\n  <tr>\n    <td><code>sets</code></td>\n    <td>Fetch all card set information from the TCG API.</td>\n    <td>None</td>\n  </tr>\n  <tr>\n    <td><code>types</code></td>\n    <td>Extract unique Pokémon types from the card dataset.</td>\n    <td>Requires <code>cards</code> data</td>\n  </tr>\n</table>\n\n**Recommended Scraper Order:**\n\nFor initial setup or a full data refresh, it's recommended to run the scrapers in this order:\n\n1. `pokemons`\n2. `types`\n3. `sets`\n4. `cards`\n5. `holo`\n6. `foil`\n7. `download-images` (Optional, run if you need local images)\n\nYou can run `all` to execute steps 1-6 automatically.\n</details>\n\n<details>\n<summary><b>Using a Custom CDN for Images</b></summary>\n\nAfter running the `download-images` scraper, you will have local copies of the card images. If you host these images on your own CDN or file server:\n\n1. Upload the contents of the `images` directory to your CDN\n2. Set the `PUBLIC_CARD_CDN_URL` environment variable in your `.env` file to the base URL of your hosted images\n   Example: `PUBLIC_CARD_CDN_URL=https://cdn.example.com/pokemon-cards`\n3. The application will automatically construct image URLs like `https://cdn.example.com/pokemon-cards/{setCode}/{cardId}.png`\n</details>\n\n## 📜 Available Scripts\n\n<table>\n  <tr>\n    <th>Command</th>\n    <th>Description</th>\n  </tr>\n  <tr>\n    <td><code>pnpm dev</code></td>\n    <td>Starts the development server</td>\n  </tr>\n  <tr>\n    <td><code>pnpm build</code></td>\n    <td>Builds the application for production (outputs to <code>.svelte-kit/cloudflare</code>)</td>\n  </tr>\n  <tr>\n    <td><code>pnpm preview</code></td>\n    <td>Runs a local preview of the production build</td>\n  </tr>\n  <tr>\n    <td><code>pnpm scrapers</code></td>\n    <td>Runs the interactive data scraping CLI</td>\n  </tr>\n</table>\n\n## 📁 Project Structure\n\n<details>\n<summary><b>View Project Structure</b></summary>\n\n```\n.\n├── .svelte-kit/        # Build output and internal SvelteKit files\n├── node_modules/       # Project dependencies\n├── src/\n│   ├── assets/         # Static assets (e.g., scraped JSON data)\n│   ├── lib/            # Svelte components, utilities, Supabase client, etc.\n│   │   ├── components/ # Reusable Svelte components\n│   │   ├── helpers/    # Utility functions\n│   │   ├── services/   # Data fetching or business logic services\n│   │   ├── stores/     # Svelte stores\n│   │   └── supabase.ts # Supabase client initialization\n│   ├── routes/         # Application pages and API endpoints\n│   ├── scrapers/      # Data scraping scripts\n│   ├── styles/         # Global styles\n│   ├── app.css         # Main CSS file (often imports Tailwind)\n│   ├── app.d.ts        # Ambient TypeScript declarations for SvelteKit\n│   ├── app.html        # Main HTML template\n│   └── constants.ts    # Application constants\n├── static/             # Static files (favicon, etc.)\n├── .env                # Local environment variables (ignored by Git)\n├── .env.example        # Example environment variables\n├── .gitignore          # Git ignore rules\n├── package.json        # Project metadata and dependencies\n├── pnpm-lock.yaml      # PNPM lock file\n├── svelte.config.js    # SvelteKit configuration\n├── supabase-schema.sql # Initial Supabase database schema\n├── supabase-schema-update.sql # Database schema updates (if any)\n├── tailwind.config.mjs # Tailwind CSS configuration\n├── tsconfig.json       # TypeScript configuration\n├── scraper-cli.ts     # Entry point for the data scraper CLI\n└── vite.config.ts      # Vite configuration\n```\n</details>\n\n## 👥 Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n<details>\n<summary><b>How to Contribute</b></summary>\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n</details>\n\n## 📄 License\n\nThis project is licensed under the GNU GPLv3 License - see the [LICENSE](LICENSE) file for details.\n\n<div align=\"center\">\n  <br>\n  <p>\n    <a href=\"https://github.com/Ayfri/pokecards-collector/issues\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/Ayfri/pokecards-collector/issues\">Request Feature</a>\n  </p>\n  <p>\n    Made with ❤️ by <a href=\"https://github.com/Ayfri\">Ayfri</a>,\n    <a href=\"https://github.com/antaww\">Anta</a>,\n    <a href=\"https://github.com/Bahsiik\">Bahsiik</a>\n  </p>\n</div>\n","size":27658,"stargazers_count":2,"topics":["pokemon","pokemon-cards","supabase","svelte","sveltekit","tcg","website"],"updated_at":"2026-01-16T07:54:02Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":356,"contributors_count":2,"created_at":"2022-06-23T22:24:00Z","default_branch":"master","description":"My online portfolio.","fork":false,"forks_count":0,"full_name":"Ayfri/Portfolio","homepage":"https://ayfri.com","html_url":"https://github.com/Ayfri/Portfolio","id":506808059,"is_template":false,"language":"Kotlin","name":"Portfolio","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-05-01T23:30:34Z","readme_content":"# Portfolio\n\nWelcome to the source code of my personal portfolio website, [ayfri.com](https://ayfri.com).\n\n## 🚀 Overview\n\nThis is a modern, fully-featured portfolio website showcasing my skills, projects, experiences, and blog articles. Built with **Kotlin** and **Compose for Web**, it combines the power of a modern web framework with type-safe, functional programming.\n\nThe website is built using [Kobweb](https://kobweb.varabyte.com/), a cutting-edge Kotlin web framework that provides:\n- Type-safe DSLs for HTML and CSS\n- Compose for Web components (functional UI)\n- Static site generation capabilities\n- Built-in routing and navigation\n- Live reload development server\n\n## 📋 Features\n\n- **Responsive Design**: Fully responsive pages that work on all devices\n- **Blog System**: Markdown-based articles with front matter metadata\n- **Project Showcase**: Display of GitHub projects with integration via GitHub API\n- **Skills Section**: Categorized technical skills and expertise\n- **Experience Timeline**: Professional experience and internships\n- **About & Contact**: Personal information and contact details\n- **Static Export**: Generate optimized HTML files for deployment\n- **SEO Optimized**: Structured metadata and schema markup for search engines\n- **Syntax Highlighting**: Code blocks with language-specific highlighting (Prism.js)\n- **Custom Theme**: Dark-themed design with smooth animations\n\n## 🏗️ Project Structure\n\n```\nsrc/jsMain/\n├── kotlin/io/github/ayfri/\n│   ├── Main.kt                    # App entry point and initialization\n│   ├── Style.kt                   # Global styles and themes\n│   ├── animations.kt              # Animation utilities\n│   ├── CodeTheme.kt               # Code syntax highlighting theme\n│   ├── components/                # Reusable UI components\n│   │   ├── Header.kt              # Navigation header\n│   │   ├── Head.kt                # HTML head metadata\n│   │   └── Tabs.kt                # Tab component\n│   ├── pages/                     # Website pages\n│   │   ├── Index.kt               # Home page\n│   │   ├── AboutMe.kt             # About page\n│   │   ├── Skills.kt              # Skills showcase\n│   │   ├── Experiences.kt         # Experience timeline\n│   │   ├── Portfolio.kt           # Portfolio grid\n│   │   └── projects/              # Project pages\n│   ├── layouts/                   # Layout components (ArticleLayout, etc.)\n│   ├── jsonld/                    # JSON-LD schema markup\n│   └── utils/                     # Utility functions and helpers\n│\n└── resources/\n    ├── markdown/articles/         # Blog articles in Markdown\n    │   ├── DatapackGenerators.md\n    │   ├── KoreHelloWorld.md\n    │   ├── KoreIntroduction.md\n    │   └── ... (more articles)\n    └── public/                    # Static files\n        ├── cv.pdf                 # Resume/CV\n        ├── logo.png               # Site logo\n        ├── prism.min.js           # Code highlighting\n        └── images/                # Static images\n```\n\n## 🔧 Prerequisites\n\n- **JDK 21+** (Java Development Kit)\n- **Gradle** (included via Gradle Wrapper)\n- A terminal/shell with access to `./gradlew` commands\n\n## 🎯 Getting Started\n\n### Development Server\n\nTo run the development server with live reload:\n\n```powershell\n./gradlew kobwebStart -t\n```\n\nThe website will be available at `http://localhost:8080` and will automatically reload on file changes.\n\n### Additional Build Options\n\n- **Production Mode**: Add `-PkobwebEnv=PROD` for optimized production build\n- **Static Mode**: Add `-PkobwebRunLayout=STATIC` for HTML generation (useful for static exports)\n- **Live Reload**: `-t` flag enables automatic page reload on code changes\n\nExample with options:\n```powershell\n./gradlew kobwebStart -t -PkobwebEnv=PROD\n```\n\n### Exporting the Website\n\nTo generate optimized static HTML files:\n\n```powershell\n./gradlew kobwebExport\n```\n\nExport options:\n- **Production Mode**: `-PkobwebEnv=PROD` for optimized production build\n- **Static Mode**: `-PkobwebRunLayout=STATIC` for full HTML generation\n\nThe exported website will be available in the `.kobweb/client` directory.\n\n## 📝 Blog Articles\n\nArticles are stored in `src/jsMain/resources/markdown/articles/` as Markdown files with YAML front matter.\n\n### Creating New Articles\n\n1. Create a new `.md` file in `src/jsMain/resources/markdown/articles/`\n2. Add front matter at the top of the file\n3. Write your article content in Markdown below the front matter\n\n### Front Matter Format\n\n```yaml\n---\nnav-title: Article URL Slug\ntitle: Display Title of the Article\ndescription: Short description for SEO and previews (50-160 characters recommended)\nkeywords: comma,separated,keywords,for,seo\ndate-created: YYYY-MM-DD\ndate-modified: YYYY-MM-DD\nroot: .layouts.ArticleLayout\nrouteOverride: /articles/article-url-slug/index\n---\n\n# Article content starts here\n```\n\n### Front Matter Fields\n\n| Field           | Purpose                                                |\n|-----------------|--------------------------------------------------------|\n| `nav-title`     | URL slug for the article (e.g., `kore-hello-world`)    |\n| `title`         | Display title shown in article lists and headers       |\n| `description`   | SEO description and preview text                       |\n| `keywords`      | Comma-separated keywords for search engines            |\n| `date-created`  | Article creation date in YYYY-MM-DD format             |\n| `date-modified` | Last modification date in YYYY-MM-DD format            |\n| `root`          | Layout component (usually `.layouts.ArticleLayout`)    |\n| `routeOverride` | Full URL path for the article (`/articles/slug/index`) |\n\n### Article Features\n\n- **Markdown Formatting**: Full Markdown support (headings, lists, tables, emphasis, etc.)\n- **Code Blocks**: Syntax highlighting via Prism.js\n- **Images**: Support for local and external images\n- **Links**: Internal and external links with proper routing\n- **SEO**: Automatic meta tags and JSON-LD schema\n\n## 🔗 Data Integration\n\nThe website integrates with an external GitHub API for dynamic project data:\n\n- GitHub projects are fetched from a hosted JSON API\n- Project data includes stars, forks, and descriptions\n- The data is embedded during the build process in `build/generated/ayfri/src/jsMain/kotlin/io/github/ayfri/data/Data.kt`\n- API endpoint: `https://raw.githubusercontent.com/Ayfri/Portfolio/api/result.json`\n\nData download happens automatically during the build via the `downloadData` Gradle task.\n\n## 🏗️ Technologies Used\n\n- **Kotlin 2.2.21**: Type-safe language for web development\n- **Compose for Web 1.9.1**: Functional UI framework\n- **Kobweb 0.23.3**: Full-stack Kotlin web framework\n- **Markdown Processing**: KobwebX Markdown plugin for article conversion\n- **HTML/CSS**: Compose HTML and CSS DSLs for styling\n\n## 📦 Build System\n\nThe project uses **Gradle** with several custom tasks:\n\n- `kobwebStart`: Start development server with live reload\n- `kobwebExport`: Export static HTML files\n- `downloadData`: Download and process GitHub project data\n\n## 🎨 Customization\n\n### Styling\n\nGlobal styles are defined in `Style.kt`. The site uses:\n- CSS-in-Code via Compose DSL\n- Dark theme with accent colors\n- Custom scrollbar styling\n- Responsive media queries\n\n### Components\n\nReusable components are in `components/`:\n- `Header.kt`: Navigation and branding\n- `Head.kt`: Metadata and SEO tags\n- Custom components for portfolio sections\n\n### Layouts\n\nPage layouts are in `layouts/`:\n- `ArticleLayout`: Template for blog articles\n- `PageLayout`: General page wrapper with header/footer\n\n## 🚀 Deployment\n\nThe website can be deployed anywhere that serves static files:\n\n1. Run `./gradlew kobwebExport -PkobwebEnv=PROD`\n2. Upload contents of `.kobweb/client` to your hosting\n3. Ensure your server is configured for SPA routing (redirect 404s to index.html)\n\n## 📄 License\n\nThis project is licensed under the GNU General Public License v3.0 - see the [LICENSE](LICENSE) file for details.\n","size":11147,"stargazers_count":14,"topics":["kobweb","kotlin-website","portfolio","portfolio-website"],"updated_at":"2026-05-01T23:30:38Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":3,"contributors_count":0,"created_at":"2020-04-24T17:19:00Z","default_branch":"master","description":"A minecraft-like game made in Processing in Java.","fork":false,"forks_count":0,"full_name":"Ayfri/ProceCraft","homepage":null,"html_url":"https://github.com/Ayfri/ProceCraft","id":258576531,"is_template":false,"language":"Java","name":"ProceCraft","open_issues_count":2,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2020-04-24T18:25:48Z","readme_content":null,"size":50,"stargazers_count":0,"topics":[],"updated_at":"2020-04-24T18:25:50Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":58,"contributors_count":0,"created_at":"2021-09-22T13:22:23Z","default_branch":"master","description":"A project in Golang with Ynov.","fork":false,"forks_count":0,"full_name":"Ayfri/Project-Red","homepage":null,"html_url":"https://github.com/Ayfri/Project-Red","id":409213577,"is_template":false,"language":"Go","name":"Project-Red","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-10-15T15:32:31Z","readme_content":null,"size":96,"stargazers_count":0,"topics":[],"updated_at":"2021-10-15T15:32:34Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":8,"contributors_count":0,"created_at":"2022-01-21T13:33:51Z","default_branch":"master","description":"My first exercice in Python for my school.","fork":false,"forks_count":0,"full_name":"Ayfri/Python-TP1","homepage":null,"html_url":"https://github.com/Ayfri/Python-TP1","id":450503970,"is_template":false,"language":"Python","name":"Python-TP1","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-01-21T16:33:04Z","readme_content":"# Python-TP1\n\nMy first exercice in Python for my school.\n","size":29,"stargazers_count":0,"topics":[],"updated_at":"2022-01-21T13:36:20Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":19,"contributors_count":0,"created_at":"2022-01-21T18:31:57Z","default_branch":"master","description":"My second exercice in Python for my school.","fork":false,"forks_count":0,"full_name":"Ayfri/Python-TP2","homepage":null,"html_url":"https://github.com/Ayfri/Python-TP2","id":450600353,"is_template":false,"language":"Python","name":"Python-TP2","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-02-04T21:23:17Z","readme_content":"# Python-TP2\nMy second exercice in Python for my school.\n","size":34,"stargazers_count":0,"topics":[],"updated_at":"2022-01-21T18:33:02Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":6,"contributors_count":0,"created_at":"2022-02-03T16:18:10Z","default_branch":"master","description":"The third exercice I have to do for my school.","fork":false,"forks_count":0,"full_name":"Ayfri/Python-TP3","homepage":null,"html_url":"https://github.com/Ayfri/Python-TP3","id":455237427,"is_template":false,"language":"Python","name":"Python-TP3","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-02-25T15:04:38Z","readme_content":"# Python-TP3\nThe third exercice I have to do for my school.\n","size":27,"stargazers_count":0,"topics":[],"updated_at":"2022-02-24T17:34:55Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":168,"contributors_count":0,"created_at":"2025-07-22T21:26:51Z","default_branch":"main","description":"My own RAG implementation.","fork":false,"forks_count":0,"full_name":"Ayfri/RAG","homepage":null,"html_url":"https://github.com/Ayfri/RAG","id":1024536955,"is_template":false,"language":"Svelte","name":"RAG","open_issues_count":2,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-22T18:50:00Z","readme_content":"# RAG Application\n\nA modern **Retrieval-Augmented Generation (RAG)** application with a **FastAPI** backend and **SvelteKit** frontend. Upload documents, create vector indices, and query your knowledge base with an elegant web interface.\n\n**Created by [Ayfri](https://github.com/Ayfri)** - French student and developer passionate about experimenting with new technologies. Check out my other projects at [ayfri.com](https://ayfri.com).\n\n## 🏗️ Architecture\n\n- **Frontend**: SvelteKit + TypeScript + TailwindCSS\n- **Backend**: FastAPI + LlamaIndex + OpenAI\n- **Database**: File-based vector storage\n- **Configuration**: Per-RAG JSON configuration files\n\n## 📁 Project Structure\n\n```\nRAG/\n├── api/                    # FastAPI backend\n│   ├── data/              # Runtime data (not in Git)\n│   │   ├── configs/<rag-name>.json # Per-RAG configurations\n│   │   ├── files/<rag-name>/  # Source documents\n│   │   ├── indices/<rag-name>/ # Vector indices\n│   │   └── resumes/<rag-name>.md # Auto-generated project summaries\n│   ├── main.py            # API entry point\n│   ├── services/\n│   │   └── rag_router.py  # RAG API routes\n│   ├── src/\n│   │   ├── agent.py       # Agent and tools implementation\n│   │   ├── config.py      # Configuration management\n│   │   ├── openai_models.py # OpenAI models management\n│   │   ├── rag.py         # RAGService implementation\n│   │   ├── rag_config.py  # RAG configuration classes\n│   │   └── types.py       # Shared TypedDict definitions\n│   └── requirements.txt   # Python dependencies\n├── package.json           # Frontend dependencies\n├── README.md              # This file\n└── src/                   # SvelteKit frontend\n    ├── lib/\n    │   ├── components/    # Reusable Svelte components\n    │   ├── helpers/       # Utility functions\n    │   └── stores/        # State management\n    └── routes/\n        ├── api/           # API proxy routes\n        ├── +layout.svelte # App layout\n        └── +page.svelte   # Main page\n```\n\n## 🚀 Quick Start\n\n### Prerequisites\n\n- **Node.js 22+** with **pnpm** (for local development)\n- **Python 3.13+** (for local development)\n- **Docker & Docker Compose** (for containerized deployment)\n- **OpenAI API Key**\n\n### 1. Environment Setup\n\nCreate a `.env` file at the project root:\n\n```env\nAPI_DEBUG=False\nAPI_HOST=0.0.0.0\nAPI_PORT=8000\nOPENAI_API_KEY=sk-...\nPORT=5173\nPUBLIC_API_URL=http://localhost:8000\n```\n\n### 2. Backend Setup\n\n```powershell\n# Create Python virtual environment\npython -m venv .venv\n.\\.venv\\Scripts\\Activate.ps1\n\n# Install dependencies\npip install -r api/requirements.txt\n\n# Start the FastAPI server\nuvicorn api.main:app --reload\n```\n\nThe API will be available at `http://localhost:8000` with documentation at `http://localhost:8000/docs`.\n\n### 3. Frontend Setup\n\n```powershell\n# Install frontend dependencies\npnpm install\n\n# Start the development server\npnpm dev\n```\n\nThe web app will be available at `http://localhost:5173`.\n\n### 4. Docker Setup (Alternative)\n\nFor containerized deployment, use Docker Compose:\n\n```powershell\n# Option 1: Create .env file with your OpenAI API key\necho \"OPENAI_API_KEY=sk-your-api-key-here\" > .env\n\n# Option 2: Set environment variable directly\n$env:OPENAI_API_KEY=\"sk-your-api-key-here\"\n\n# Build and start all services\ndocker-compose up -d\n\n# View logs\ndocker-compose logs -f\n\n# Stop services\ndocker-compose down\n```\n\n**Optimized Builds**: The Docker setup includes intelligent caching:\n- **Dependencies**: Cached separately from source code\n- **Source code**: Rebuilds only when files change\n- **Configuration**: Includes all necessary config files (`svelte.config.js`, `vite.config.ts`, `tsconfig.json`, `.npmrc`)\n- **Production mode**: Frontend runs in production mode with `node build/index.js`\n\nThe application will be available at:\n- **Frontend**: `http://localhost:5173`\n- **Backend API**: `http://localhost:8000`\n- **API Documentation**: `http://localhost:8000/docs`\n\n**Data Persistence**: All RAG data is stored in a Docker volume (`rag_data`) and persists between container restarts.\n\n## 🎯 Features\n\n### 🤖 Agentic AI Workflow\n- **Real-time tool usage**: Watch the AI agent use multiple tools as it works\n- **Web search integration**: AI can search the internet for current information using OpenAI's web search\n- **Document retrieval**: Smart search through your uploaded documents\n- **File operations**: AI can read and explore files in your RAG directories\n- **Progressive streaming**: See responses build up token-by-token with live tool indicators\n- **Tool activity visualization**: Real-time display of web searches, document retrieval, and file operations\n\n### 📊 RAG Management\n- Create new RAG indices from uploaded documents\n- List all available RAGs\n- Delete RAGs and their associated data\n- **Configure individual RAG settings** (OpenAI models, system prompts)\n\n### ⚙️ RAG Configuration\n- **Per-RAG model selection**: Choose different OpenAI chat models (o4-mini, GPT-4.1-mini, etc.)\n- **Custom embedding models**: Select from various OpenAI embedding models\n- **System prompt customization**: Define how the AI should respond for each RAG\n- **AI-powered prompt generation**: Generate system prompts from descriptions using AI\n- **Persistent settings**: Configuration stored in JSON files per RAG\n\n### 📄 Document Management\n- Upload files via drag-and-drop or file picker\n- **Folder upload support**: Upload entire directories at once\n- **Symbolic link support**: Link to external files and directories\n- **URL management**: Add and remove website URLs as documents\n- **Advanced file filtering**: Configure include/exclude patterns for specific folders and symlinks\n- Support for PDF, TXT, DOCX, and Markdown files\n- View and delete documents in each RAG\n- **Manual reindexing**: Rebuild indices on demand\n- Smart file listing with type indicators and symlink targets\n- **Project summaries**: Auto-generated summaries for better context understanding\n\n### 🔍 Intelligent Querying\n- Ask questions about your documents\n- **Real-time agentic streaming**: Watch the AI use tools in real-time\n- **Tool activity visualization**: See web searches and document retrieval as they happen\n- **Progressive response building**: Responses appear token-by-token with inline tool usage\n- Clean, readable response formatting with tool activity indicators\n- **Context-aware responses** based on per-RAG system prompts\n- **File reading and exploration**: AI can read and list files in your document directories\n\n### 💬 Chat Session Management\n- **Persistent chat history**: Sessions saved locally via IndexedDB\n- **Unlimited storage**: No server-side storage limitations\n- **Session organization**: Create, rename, and delete chat sessions\n- **RAG-specific sessions**: Separate chat history for each RAG\n- **Automatic session creation**: New sessions created when starting conversations\n- **Session browser**: View all past conversations with preview and timestamps\n- **Message editing**: Edit and update chat messages\n- **Session clearing**: Clear message history while keeping sessions\n\n### 🎨 Modern UI\n- Responsive design with TailwindCSS\n- Dark/light theme support\n- Intuitive file management\n- Real-time loading states and error handling\n- **Configuration modal** for easy RAG customization\n- **System prompt generator** with AI assistance\n- **File filter configuration** for advanced document management\n- **Syntax highlighting** for code and markdown content\n- **Notification system** for user feedback\n\n## 🛠️ Technology Stack\n\n### Backend\n- **FastAPI 0.116+** - Modern Python web framework\n- **LlamaIndex 0.12+** - RAG framework\n- **OpenAI API** - Language model and embeddings\n- **Uvicorn** - ASGI server\n- **BeautifulSoup** - HTML parsing\n- **html2text** - HTML to markdown conversion\n\n### Frontend\n- **SvelteKit 2.25+** - Full-stack framework\n- **Svelte 5.36+** - Component framework with modern runes\n- **TypeScript 5.8+** - Type-safe JavaScript\n- **TailwindCSS 4.1+** - Utility-first CSS framework\n- **Vite 7.0+** - Fast build tool\n- **Lucide Svelte** - Beautiful icons\n- **Shiki** - Syntax highlighting\n- **Marked** - Markdown rendering\n- **DOMPurify** - XSS protection\n\n## 📖 Usage\n\n### Creating a RAG\n\n1. Click **\"New RAG\"** in the top-right corner\n2. Enter a unique name for your RAG\n3. Upload one or more documents (PDF, TXT, DOCX, MD)\n4. Wait for the vector index to be created\n\n### Configuring a RAG\n\n1. Click the **settings icon** (⚙️) next to any RAG in the sidebar\n2. Choose your preferred **OpenAI chat model** (GPT-4o, GPT-4o-mini, etc.)\n3. Select an **embedding model** for document processing\n4. Customize the **system prompt** to define the AI's behavior\n5. Use the **AI prompt generator** to create system prompts from descriptions\n6. Save your configuration\n\n**Available Models:**\n- **Chat**: gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, gpt-4o, o3, o3-mini, o4-mini\n- **Embeddings**: text-embedding-3-large, text-embedding-3-small, text-embedding-ada-002\n\n### Querying Documents\n\n1. Select a RAG from the sidebar\n2. Type your question in the query box (a new session will be created automatically if none exists)\n3. The AI will stream its response in real-time, showing:\n   - **Tool usage**: See when the AI searches the web or your documents\n   - **Progressive responses**: Text appears as it's generated\n   - **Live tool activity**: Inline indicators show search results and document retrieval\n   - **File operations**: Watch the AI read and explore files\n4. View the complete AI-generated answer with all sources and documents used\n\n### Managing Chat Sessions\n\n- **View sessions**: Click the \"Sessions\" button to see all your chat history\n- **Create sessions**: New sessions are created automatically when you start chatting\n- **Switch sessions**: Click on any session to resume that conversation\n- **Rename sessions**: Click the edit icon to give sessions meaningful names\n- **Delete sessions**: Remove sessions you no longer need\n- **Edit messages**: Modify existing chat messages\n- **Clear sessions**: Remove message history while keeping the session\n- **Persistent storage**: All conversations are saved locally in your browser\n\n### Managing Files\n\n- **Add files**: Use the \"Add File\" button in the Documents section\n- **Add folders**: Use the \"Add Folder\" button to upload entire directories\n- **Create symlinks**: Use the \"Link\" button to reference external files/folders\n- **Add URLs**: Use the \"Add URL\" button to include website content\n- **Configure filters**: Set include/exclude patterns for specific folders and symlinks\n- **Delete files**: Click the trash icon next to any file\n- **Delete URLs**: Click the trash icon next to any URL\n- **Manual reindex**: Use the \"Reindex\" button to rebuild the vector index\n- **File types**: Files, directories, symbolic links, and URLs are clearly distinguished\n\n## 🔧 Development\n\n### Code Style\n- **Indentation**: Tabs\n- **Quotes**: Single quotes when possible\n- **Semicolons**: Always use\n- **Sorting**: Alphabetical order for imports, properties, functions\n\n### Frontend Commands\n\n```powershell\npnpm dev          # Start development server\npnpm build        # Build for production\npnpm preview      # Preview production build\npnpm check        # Type checking\npnpm check:watch  # Type checking in watch mode\n```\n\n### Backend Commands\n\n```powershell\nuvicorn api.main:app --reload  # Development server with auto-reload\n```\n\n## 🌐 API Endpoints\n\n### RAG Management\n| Method   | Endpoint                | Description                                 |\n|----------|-------------------------|---------------------------------------------|\n| `GET`    | `/rag`                  | List all RAGs                               |\n| `POST`   | `/rag/{name}`           | Create or rebuild a RAG                     |\n| `DELETE` | `/rag/{name}`           | Delete a RAG                                |\n\n### RAG Configuration\n| Method   | Endpoint                        | Description                                 |\n|----------|---------------------------------|---------------------------------------------|\n| `GET`    | `/rag/{name}/config`            | Get RAG configuration                       |\n| `PUT`    | `/rag/{name}/config`            | Update RAG configuration                    |\n| `GET`    | `/rag/models`                   | Get available OpenAI models                 |\n| `POST`   | `/rag/{name}/generate-prompt`   | Generate system prompt from description     |\n\n### File & Folder Management\n| Method   | Endpoint                              | Description                                 |\n|----------|---------------------------------------|---------------------------------------------|\n| `GET`    | `/rag/{name}/files`                   | List RAG files and directories              |\n| `POST`   | `/rag/{name}/files`                   | Upload file or create folder                |\n| `DELETE` | `/rag/{name}/files/{filename}`        | Delete file                                 |\n| `POST`   | `/rag/{name}/symlink`                 | Create symbolic link                        |\n| `POST`   | `/rag/{name}/reindex`                 | Manually reindex RAG                        |\n\n### URL Management\n| Method   | Endpoint                        | Description                                 |\n|----------|---------------------------------|---------------------------------------------|\n| `GET`    | `/rag/{name}/urls`              | List URLs                                   |\n| `POST`   | `/rag/{name}/urls`              | Add URL                                     |\n| `DELETE` | `/rag/{name}/urls`              | Remove URL                                  |\n\n### Query\n| Method   | Endpoint                        | Description                                 |\n|----------|---------------------------------|---------------------------------------------|\n| `POST`   | `/rag/{name}/stream`            | Stream agentic query response with real-time tool usage |\n\n## 🔒 Security Notes\n\n- API keys are loaded from environment variables\n- File uploads are validated by type\n- CORS is configured for local development\n- Production deployments should use HTTPS\n- XSS protection via DOMPurify\n\n## 📦 Deployment\n\n### Docker Compose (Recommended)\n\nThe easiest way to deploy the entire application:\n\n```powershell\n# Clone the repository\ngit clone <repository-url>\ncd RAG\n\n# Create environment file\necho \"OPENAI_API_KEY=sk-your-api-key-here\" > .env\n\n# Start all services\ndocker-compose up -d\n\n# Check status\ndocker-compose ps\n\n# View logs\ndocker-compose logs -f\n```\n\n### Individual Services\n\n#### Frontend (Cloudflare Pages)\n```powershell\npnpm build\n# Deploy ./build directory to Cloudflare Pages\n```\n\n#### Backend (Docker)\n```dockerfile\nFROM python:3.12-slim\nWORKDIR /app\nCOPY api/ ./\nRUN pip install -r requirements.txt\nCMD [\"uvicorn\", \"main:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8000\"]\n```\n\n## 🤝 Contributing\n\n1. Follow the established code style\n2. Keep files under 200 lines when possible\n3. Use descriptive commit messages\n4. Test both frontend and backend changes\n\n## 📄 License\n\nSee [LICENSE](./LICENSE) file for details.\n","size":385,"stargazers_count":1,"topics":[],"updated_at":"2025-08-18T13:29:38Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":5,"contributors_count":0,"created_at":"2024-05-11T21:34:24Z","default_branch":"master","description":"A TP I have to do, must use a Redis Cluster, can use any language to add CRUD operations.","fork":false,"forks_count":0,"full_name":"Ayfri/Redis-Cluster","homepage":null,"html_url":"https://github.com/Ayfri/Redis-Cluster","id":799348806,"is_template":false,"language":"Python","name":"Redis-Cluster","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2024-05-11T21:38:01Z","readme_content":"# Redis Cluster\n\n## How to install\n\n1. Clone the repository\n2. Run `docker compose up -d`\n3. Run `docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node-1` to get the IP address of the first node\n4. Repeat the previous step for the other nodes\n5.\n\nRun `docker exec -it redis-node-1 redis-cli --cluster create <ip1>:6379 <ip2>:6379 <ip3>:6379 <ip4>:6379 <ip5>:6379 <ip6>:6379 --cluster-replicas 1`\n\n## Testing the cluster\n\n1. Run `docker exec -it redis-node-1 redis-cli -c` to connect to the first node\n2. Run `cluster info` to get information about the cluster\n3. Run `cluster nodes` to get information about the nodes\n\n### Trying redis\n\n1. Run `set key value` to set a key\n2. Run `get key` to get the value of the key\n3. Run `keys *` to get all the keys\n4. Run `del key` to delete a key\n5. Run `flushall` to delete all keys\n6. Run `exit` to exit the redis-cli\n\nCreate a key in one node and try to get it from another node. You will see that the key is available in all nodes.\n\n### Hashes\n\n- Run `hset user:1 name \"John Doe\"` to set a hash\n- Run `hget user:1 name` to get the value of the hash\n- Run `hgetall user:1` to get all the values of the hash\n- Run `hmset user:1 name \"John Doe\" age 30` to set multiple values in a hash\n- Run `hmget user:1 name age` to get multiple values of the hash\n- Run `hdel user:1 age` to delete a value of the hash\n\n### Lists\n\n- Run `lpush list 1 2 3 4 5` to create a list\n- Run `lrange list 0 -1` to get all the values of the list\n- Run `lpop list` to remove the first element of the list\n- Run `rpop list` to remove the last element of the list\n- Run `ltrim list 0 2` to remove all elements of the list except the first three\n\n### Sets\n\n- Run `sadd set 1 2 3 4 5` to create a set\n- Run `smembers set` to get all the values of the set\n- Run `srem set 1` to remove a value of the set\n\n### Sorted Sets\n\n- Run `zadd sorted-set 1 one 2 two 3 three 4 four 5 five` to create a sorted set\n- Run `zrange sorted-set 0 -1` to get all the values of the sorted set\n- Run `zrange sorted-set 0 -1 withscores` to get all the values of the sorted set with the scores\n- Run `zrem sorted-set one` to remove a value of the sorted set\n\n### Expiring keys\n\n- Run `set key value` to set a key\n- Run `expire key 10` to set the key to expire in 10 seconds\n- Run `ttl key` to get the time to live of the key\n  Wait 10 seconds and run `get key` to see that the key is no longer available\n- Run `setex key 10 value` to set a key with an expiration time\n\n## Using Redis in a project\n\nIn this repository, you have a `index.py` file that shows how to connect to the Redis cluster using the `redis` library.\nRun `docker compose --profile testing up -d` to start the testing environment, it will add a new container that will run the `index.py`\nfile.\nSee the logs of the container to see the output of the script using `docker logs -f python-project`.\n\n### An existing project\n\nI have this project `https://github.com/Ayfri/UF_Project_B3` which is my end of year project for my third year at Ynov.\nWe have to make BigQuery requests to get data of `GDELT` project and then use this data to make predictions.\nBut each request takes a lot of time, around 30 seconds, so I thought about using Redis to cache the results of the requests.\n\nSo in this commit : [3c8aa9](`https://github.com/Ayfri/UF_Project_B3/commit/3c8aa93d802ee9d17b844b0b6748f0f67fb5a3b5`) I added a Redis\ninstance in a Docker container and I used it to cache the results of the requests.\n\nI used the `redis` library to connect to the Redis instance and I used the `set` and `get` methods to cache the results, also using JSON\nserialization to store complex data.\n\n## Redis integration introspection\n\nRedis is great for caching and simple key-value storage thanks to its speed, scalability, and ease of use.\n\n#### Pros\n\n- Blazingly fast thanks to in-memory data storage and efficient data structures.\n- Highly scalable with sharding and replication strategies.\n- Simple data model and minimalistic commands make it easy to learn and integrate.\n- Excellent for caching to improve application performance.\n- Rich set of data structures like strings, hashes, lists, sets, etc.\n\n#### Cons\n\n- Data persistence requires configuration and can be challenging for high-write scenarios.\n- Limited query capabilities compared to traditional databases or data warehouses.\n- Memory usage can grow quickly with large datasets or memory-intensive data structures.\n- Not well-suited for complex relational data or join operations.\n- Limited transaction support may not meet strong consistency requirements.\n\nI actually use [Redis Stack Server](https://redis.io/insight/) in a private project for storing a large amount of complex data, and it works\nperfectly.\nIt also gives us `RedisSearch` and `RedisTimeSeries` modules that we use for more advanced data management and querying.\nBefore that, we were using local files, and that was a mess to manage and query. Redis was much faster.\n\nOne good tool present in the Redis environment is [Redis Insight](https://redis.io/insight/), a graphical user interface that gives Redis\nusers a powerful way to visualize and interact with their data. Redis Insight allows viewing databases, querying keys and values, and\nexecuting common Redis commands through an intuitive interface. It also integrates tightly with Redis, enabling real-time monitoring and\ncommand inspection capabilities.\n\nWhile Redis has limitations, it shines for use cases like caching, session management, real-time messaging, and scenarios needing\nhigh-performance data access with simple data structures. For more complex requirements, it's often combined with other solutions or Redis\nStack Server for enhanced data management and querying capabilities.\n","size":16,"stargazers_count":0,"topics":[],"updated_at":"2024-05-11T21:38:04Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":2,"contributors_count":0,"created_at":"2022-08-23T22:52:25Z","default_branch":"master","description":"An arcade shoot them up spaced-theme game.","fork":false,"forks_count":0,"full_name":"Ayfri/Shooter","homepage":null,"html_url":"https://github.com/Ayfri/Shooter","id":528188201,"is_template":false,"language":"Kotlin","name":"Shooter","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-08-23T23:03:36Z","readme_content":"# Shooter\n\nA [libGDX](https://libgdx.com/) project generated with [gdx-liftoff](https://github.com/tommyettinger/gdx-liftoff).\n\nThis project was generated with a Kotlin project template that includes Kotlin application launchers and [KTX](https://libktx.github.io/) utilities.\n\n## Gradle\n\nThis project uses [Gradle](http://gradle.org/) to manage dependencies.\nThe Gradle wrapper was included, so you can run Gradle tasks using `gradlew.bat` or `./gradlew` commands.\nUseful Gradle tasks and flags:\n\n- `--continue`: when using this flag, errors will not stop the tasks from running.\n- `--daemon`: thanks to this flag, Gradle daemon will be used to run chosen tasks.\n- `--offline`: when using this flag, cached dependency archives will be used.\n- `--refresh-dependencies`: this flag forces validation of all dependencies. Useful for snapshot versions.\n- `build`: builds sources and archives of every project.\n- `cleanEclipse`: removes Eclipse project data.\n- `cleanIdea`: removes IntelliJ project data.\n- `clean`: removes `build` folders, which store compiled classes and built archives.\n- `eclipse`: generates Eclipse project data.\n- `idea`: generates IntelliJ project data.\n- `lwjgl3:jar`: builds application's runnable jar, which can be found at `lwjgl3/build/libs`.\n- `lwjgl3:run`: starts the application.\n- `test`: runs unit tests (if any).\n\nNote that most tasks that are not specific to a single project can be run with `name:` prefix, where the `name` should be replaced with the ID of a specific project.\nFor example, `core:clean` removes `build` folder only from the `core` project.","size":349,"stargazers_count":0,"topics":[],"updated_at":"2022-08-23T23:03:39Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":9,"contributors_count":0,"created_at":"2022-06-08T09:10:35Z","default_branch":"master","description":"My last set of exercices in JS of my first year at Ynov.","fork":false,"forks_count":0,"full_name":"Ayfri/TP-JS","homepage":null,"html_url":"https://github.com/Ayfri/TP-JS","id":501177452,"is_template":false,"language":"JavaScript","name":"TP-JS","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-06-08T11:02:54Z","readme_content":"# TP-JS\nMy last set of exercices in JS of my first year at Ynov.\n","size":42251,"stargazers_count":0,"topics":[],"updated_at":"2022-06-08T09:15:25Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":6,"contributors_count":0,"created_at":"2021-10-28T13:10:48Z","default_branch":"master","description":"A game of tetris made in C++ using SDL.","fork":false,"forks_count":0,"full_name":"Ayfri/Tetris-Cpp","homepage":null,"html_url":"https://github.com/Ayfri/Tetris-Cpp","id":422209248,"is_template":false,"language":"C","name":"Tetris-Cpp","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-10-28T13:16:39Z","readme_content":"# Tetris-Cpp\nA game of tetris made in C++ using SDL.\n","size":42,"stargazers_count":0,"topics":[],"updated_at":"2021-10-28T13:16:41Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":4,"contributors_count":0,"created_at":"2020-12-06T18:36:51Z","default_branch":"master","description":"Textual display of millisecond durations and in several languages.","fork":true,"forks_count":0,"full_name":"Ayfri/Tims","homepage":"https://deno.land/x/tims","html_url":"https://github.com/Ayfri/Tims","id":319104203,"is_template":false,"language":null,"name":"Tims","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2020-12-28T17:53:32Z","readme_content":"# Tims 🕚\r\n\r\n- no dependency\r\n- optimized and light code\r\n- typescript typings included\r\n- deno version of the [npm package `tims`](https://github.com/CamilleAbella/Tims).\r\n\r\n## Usage\r\n\r\n```ts\r\nimport tims from 'https://deno.land/x/tims/mod.ts';\r\nconst yesterday = new Date();\r\nyesterday.setDate(yesterday.getDate() - 1);\r\nconsole.log(tims.since(yesterday));\r\n// \"1 day\"\r\n```\r\n\r\n## Methods\r\n\r\n| Method                             | Description                                       | Return Type |\r\n| ---------------------------------- | ------------------------------------------------- | ----------- |\r\n| `between(moment, moment, options)` | Get the sentence of time past since given moment. | string      |\r\n| `duration(duration, options)`      | Get the sentence of time between given moments.   | string      |\r\n| `since(moment, options)`           | Get the sentence of given duration.               | string      |\r\n\r\n## Options\r\n\r\n```ts\r\ninterface Options {\r\n  format?: \"day\" | \"year\" | \"month\" | \"hour\" | \"minute\" | \"second\" | \"ms\"\r\n  locale?: \"fr\" | \"es\" | \"en\"\r\n  full?: boolean\r\n}\r\n```\r\n\r\n# Enjoy 🕛\r\n","size":4,"stargazers_count":0,"topics":["deno","time","typescript"],"updated_at":"2020-12-28T17:52:45Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":68,"contributors_count":3,"created_at":"2024-03-05T09:54:27Z","default_branch":"main","description":null,"fork":false,"forks_count":0,"full_name":"Ayfri/UF_Project_B3","homepage":null,"html_url":"https://github.com/Ayfri/UF_Project_B3","id":767442470,"is_template":false,"language":"Jupyter Notebook","name":"UF_Project_B3","open_issues_count":2,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-21T18:47:14Z","readme_content":"# UF_Project_B3","size":55875,"stargazers_count":0,"topics":[],"updated_at":"2024-10-30T22:08:15Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":68,"contributors_count":2,"created_at":"2021-11-24T08:35:18Z","default_branch":"master","description":"VersionCraft is a website listing all versions of minecraft.","fork":false,"forks_count":0,"full_name":"Ayfri/VersionCraft","homepage":"","html_url":"https://github.com/Ayfri/VersionCraft","id":431405629,"is_template":false,"language":"JavaScript","name":"VersionCraft","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-06-23T22:38:21Z","readme_content":"![GitHub Workflow Status](https://img.shields.io/github/workflow/status/Ayfri/minecraft-wiki-scrapper/Update%20versions)\n\n# VersionCraft\n\nTLDR : **VersionCraft is a website listing all versions of minecraft.**\n\nThis repo is the source of the WebSite VersionCraft, not hosted for now. It is an exhaustive list of all versions of\nminecraft, starting from pre-classic to the latest snapshots. Updated automatically every week, it is always up-to-date.\n\nIf a version is missing or some wrong information are present, please make an issue.\n\nThis project was made for a school project but will be maintained by me and maybe later published.\n\n## How information is gathered\n\nThe information is gathered from the official website of minecraft using\na [separate repo](https://github.com/Ayfri/minecraft-wiki-scrapper) that scrapes the fandom wiki. Then the information\nis parsed and cleaned, and finally the information is stored in a JSON file on GitHub. The script is re-run every week\nto update the JSON file.\n\nWhen you load the website, some JavaScript scripts will fetch the JSON file and display the information.\n\n## How to use the website\n\nGo to the website on your browser, via localhost or internet (if published, not available for now). Then select the\nversion you want to see via the dropdown list.\n\nThere you can select the snapshot or pre-release or other version of minecraft you want to see. You can download the\nversion also, a tutorial is available on the main page.\n\n## Compatibility\n\nThe website has been tested on Chrome, Firefox, Brave and Opera. For mobile, it has been tested on Android Brave.<br>\nWe do not have exact version numbers but the browsers versions where from Q3 2021. The responsive design is imperfect,\nbut it is a good compromise, font may be a bit tiny.\n\n## Contributors\n\n-   [Ayfri](https://github.com/Ayfri)\n-   [Samydj0](https://github.com/Samydj0)\n","size":10161,"stargazers_count":0,"topics":["minecraft","snapshots","versions"],"updated_at":"2022-02-07T21:10:10Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":7,"contributors_count":2,"created_at":"2021-12-05T14:07:42Z","default_branch":"master","description":"The advent of code 2021 made in Kotlin.","fork":false,"forks_count":1,"full_name":"Ayfri/advent-of-code-2021","homepage":"","html_url":"https://github.com/Ayfri/advent-of-code-2021","id":435184353,"is_template":false,"language":"Kotlin","name":"advent-of-code-2021","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-12-06T09:07:10Z","readme_content":"# advent-of-code-2021\nThe advent of code 2021 made in Kotlin.\n","size":34,"stargazers_count":0,"topics":[],"updated_at":"2021-12-18T17:50:51Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":287,"contributors_count":3,"created_at":"2020-08-26T02:54:04Z","default_branch":"master","description":"If you are forking please do not forget to star the repo","fork":true,"forks_count":0,"full_name":"Ayfri/anmol098","homepage":"","html_url":"https://github.com/Ayfri/anmol098","id":290379315,"is_template":false,"language":null,"name":"anmol098","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2020-08-26T00:47:20Z","readme_content":"<h2>नमस्ते (Namaste)🙏🏻, I'm Anmol Pratap Singh! <img src=\"https://media.giphy.com/media/12oufCB0MyZ1Go/giphy.gif\" width=\"50\"></h2>\n<img align='right' src=\"https://media.giphy.com/media/M9gbBd9nbDrOTu1Mqx/giphy.gif\" width=\"230\">\n<p><em>Software Engineer at <a href=\"http://www.cleartax.in\">ClearTax</a><img src=\"https://media.giphy.com/media/WUlplcMpOCEmTGBtBW/giphy.gif\" width=\"30\"> \n</em></p>\n\n![Twitter Follow](https://img.shields.io/twitter/follow/misteranmol?label=Follow)\n[![Linkedin: thaianebraga](https://img.shields.io/badge/-anmol-blue?style=flat-square&logo=Linkedin&logoColor=white&link=https://www.linkedin.com/in/anmol-p-singh/)](https://www.linkedin.com/in/anmol-p-singh/)\n![GitHub followers](https://img.shields.io/github/followers/anmol098?label=Follow&style=social)\n![](https://visitor-badge.glitch.me/badge?page_id=anmol098.anmol098)\n![Waka Readme](https://github.com/anmol098/anmol098/workflows/Waka%20Readme/badge.svg)\n\n👇 Hit in your console or terminal to connect with me.\n\n```bash\nnpx anmol\n```\n\n### <img src=\"https://media.giphy.com/media/VgCDAzcKvsR6OM0uWg/giphy.gif\" width=\"50\"> A little more about me...  \n\n```javascript\nconst anmol = {\n    pronouns: \"He\" | \"Him\",\n    code: [\"Javascript\", \"Typescript\", \"Python\", \"Java\", \"php\"],\n    askMeAbout: [\"web dev\", \"tech\", \"app dev\", \"photography\"],\n    technologies: {\n        mobileApp: [\"Android App\"],\n        frontEnd: {\n            js: [\"Vue\", \"Nuxt\"],\n            css: [\"materialize\", \"vuetify\", \"bootstrap\"]\n        },\n        backEnd: {\n            js: [\"node\", \"express\", \"SuiteScript\"],\n            python: [\"flask\"]\n        },\n        devOps: [\"AWS\", \"Docker🐳\", \"Route53\", \"Nginx\"],\n        databases: [\"mongo\", \"MySql\", \"sqlite\"],\n        misc: [\"Firebase\", \"Socket.IO\", \"selenium\", \"open-cv\", \"php\", \"SuiteApp\"]\n    },\n    architecture: [\"Serverless Architecture\", \"Progressive web applications\", \"Single page applications\"],\n    currentProject: \"I am developing Extension for NetSuite using SuiteScript2.0\",\n    funFact: \"There are two ways to write error-free programs; only the third one works\"\n};\n```\n\n<img src=\"https://media.giphy.com/media/LnQjpWaON8nhr21vNW/giphy.gif\" width=\"60\"> <em><b>I love connecting with different people</b> so if you want to say <b>hi, I'll be happy to meet you more!</b> 😊</em>\n\n---\n<!--START_SECTION:waka-->\n![Profile Views](http://img.shields.io/badge/Profile%20Views-1539-blue)\n\n![Lines of code](https://img.shields.io/badge/From%20Hello%20World%20I%27ve%20Written-2.7%20million%20lines%20of%20code-blue)\n\n**🐱 My Github Data** \n\n> 🏆 587 Contributions in the Year 2020\n > \n> 📦 340.6 kB Used in Github's Storage \n > \n> 💼 Opted to Hire\n > \n> 📜 32 Public Repositories\n > \n> 🔑 16 Private Repositories \n\n**I'm a Night 🦉** \n\n```text\n🌞 Morning    71 commits     ███░░░░░░░░░░░░░░░░░░░░░░   14.92% \n🌆 Daytime    146 commits    ███████░░░░░░░░░░░░░░░░░░   30.67% \n🌃 Evening    148 commits    ███████░░░░░░░░░░░░░░░░░░   31.09% \n🌙 Night      111 commits    █████░░░░░░░░░░░░░░░░░░░░   23.32%\n\n```\n📅 **I'm Most Productive on Sunday** \n\n```text\nMonday       75 commits     ████░░░░░░░░░░░░░░░░░░░░░   15.76% \nTuesday      54 commits     ██░░░░░░░░░░░░░░░░░░░░░░░   11.34% \nWednesday    45 commits     ██░░░░░░░░░░░░░░░░░░░░░░░   9.45% \nThursday     76 commits     ████░░░░░░░░░░░░░░░░░░░░░   15.97% \nFriday       66 commits     ███░░░░░░░░░░░░░░░░░░░░░░   13.87% \nSaturday     59 commits     ███░░░░░░░░░░░░░░░░░░░░░░   12.39% \nSunday       101 commits    █████░░░░░░░░░░░░░░░░░░░░   21.22%\n\n```\n\n\n📊 **This Week I Spent My Time On** \n\n```text\n⌚︎ Time Zone: Asia/Kolkata\n\n💬 Programming Languages: \nVue.js                   5 hrs 35 mins       ████████░░░░░░░░░░░░░░░░░   31.53% \nJavaScript               4 hrs 49 mins       ██████░░░░░░░░░░░░░░░░░░░   27.17% \nJSON                     2 hrs 58 mins       ████░░░░░░░░░░░░░░░░░░░░░   16.79% \nMarkdown                 2 hrs 18 mins       ███░░░░░░░░░░░░░░░░░░░░░░   13.03% \nPython                   45 mins             █░░░░░░░░░░░░░░░░░░░░░░░░   4.3%\n\n🔥 Editors: \nWebStorm                 16 hrs 3 mins       ██████████████████████░░░   90.5% \nPyCharm                  1 hr 20 mins        ██░░░░░░░░░░░░░░░░░░░░░░░   7.54% \nAndroid Studio           20 mins             ░░░░░░░░░░░░░░░░░░░░░░░░░   1.95% \nPhpStorm                 0 secs              ░░░░░░░░░░░░░░░░░░░░░░░░░   0.01%\n\n💻 Operating System: \nWindows                  17 hrs 44 mins      █████████████████████████   100.0%\n\n```\n\n**I Mostly Code in Vue** \n\n```text\nVue                      11 repos            ███████░░░░░░░░░░░░░░░░░░   28.21% \nJavaScript               8 repos             █████░░░░░░░░░░░░░░░░░░░░   20.51% \nJava                     6 repos             ███░░░░░░░░░░░░░░░░░░░░░░   15.38% \nDart                     3 repos             ██░░░░░░░░░░░░░░░░░░░░░░░   7.69% \nPHP                      3 repos             ██░░░░░░░░░░░░░░░░░░░░░░░   7.69%\n\n```\n\n\n**Timeline**\n\n![Chart not found](https://github.com/anmol098/anmol098/blob/master/charts/bar_graph.png) \n\n\n<!--END_SECTION:waka-->\n\n**These Readme stats are generated using github action [awesome-readme-stats](https://github.com/anmol098/waka-readme-stats)**\n","size":452,"stargazers_count":0,"topics":[],"updated_at":"2020-08-26T02:54:06Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":15,"contributors_count":0,"created_at":"2025-12-27T21:13:12Z","default_branch":"main","description":"A Minecraft Aternos server watcher in python.","fork":false,"forks_count":0,"full_name":"Ayfri/aternos-watcher","homepage":"","html_url":"https://github.com/Ayfri/aternos-watcher","id":1123889830,"is_template":false,"language":"Python","name":"aternos-watcher","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2025-12-27T22:11:35Z","readme_content":"# 🚀 Aternos Watcher\n\nA strictly typed Python 3.13 monitor for Aternos Minecraft servers. It intelligently filters out \"Ghost Proxies\" (Aternos servers that appear online but are actually in a standby/offline state).\n\n## ✨ Features\n\n- **Ghost Proxy Filtering**: Detects the difference between a truly online server and the Aternos \"Offline\" or \"Preparing\" MOTD.\n- **Discord Notifications**: Standardized embeds for state changes (Online/Offline) with full customization.\n- **ANSI MOTD Support**: Automatically converts Minecraft formatting codes (§) to ANSI for colorful MOTD display in Discord.\n- **Debounce Logic**: Prevents notification spam during server startup flickers.\n- **Strictly Typed**: Built with Python 3.13 type hints for reliability.\n\n## 🛠️ Installation & Setup\n\n### Prerequisites\n- [uv](https://github.com/astral-sh/uv) (Recommended) or Python 3.13+\n\n### Configuration\nCreate a `.env` file or set the following environment variables:\n\n#### ⚙️ Core Configuration\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `ATERNOS_WATCHER_HOST` | Your Aternos server address | `localhost` |\n| `ATERNOS_WATCHER_PORT` | Server port | `25565` |\n| `ATERNOS_WATCHER_UPDATE_TIME` | Polling interval in seconds | `30` |\n| `ATERNOS_WATCHER_VERBOSE` | Enable debug logging | `false` |\n| `ATERNOS_WATCHER_WEBHOOK_URL` | Discord Webhook URL | *Required* |\n\n#### 🎨 Embed Customization\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `ATERNOS_WATCHER_OFFLINE_COLOR` | Hex color when server is offline | `ff4040` |\n| `ATERNOS_WATCHER_OFFLINE_TITLE` | Title when server is offline | `🔴 Server OFFLINE` |\n| `ATERNOS_WATCHER_ONLINE_COLOR` | Hex color when server is online | `30c030` |\n| `ATERNOS_WATCHER_ONLINE_TITLE` | Title when server is online | `🟢 Server ONLINE!` |\n| `ATERNOS_WATCHER_STOPPING_COLOR` | Hex color when server is stopping | `ff8c00` |\n| `ATERNOS_WATCHER_STOPPING_TITLE` | Title when server is stopping | `🛑 Server STOPPING...` |\n| `ATERNOS_WATCHER_WAITING_COLOR` | Hex color when server is waiting | `ffff00` |\n| `ATERNOS_WATCHER_WAITING_MESSAGE` | Message shown during WAITING state | `Please connect in less than 7 minutes to make it stay open!` |\n| `ATERNOS_WATCHER_WAITING_TITLE` | Title when server is waiting for connection | `⏳ Server WAITING...` |\n\n#### 📝 Embed Metadata\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `ATERNOS_WATCHER_AUTHOR_ICON` | Author icon URL | *None* |\n| `ATERNOS_WATCHER_AUTHOR_NAME` | Author name in the embed | *None* |\n| `ATERNOS_WATCHER_AUTHOR_URL` | Author link URL | *None* |\n| `ATERNOS_WATCHER_FOOTER_ICON` | Footer icon URL | *None* |\n| `ATERNOS_WATCHER_FOOTER_TEXT` | Footer text in the embed | `Aternos Watcher` |\n| `ATERNOS_WATCHER_MENTION` | Content to ping (e.g. `@everyone`) | *None* |\n| `ATERNOS_WATCHER_THUMBNAIL_URL` | Thumbnail image URL | *None* |\n\n#### 🔍 Display Options\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `ATERNOS_WATCHER_SHOW_MOTD` | Show MOTD in embed | `true` |\n| `ATERNOS_WATCHER_SHOW_PLAYERS` | Show player count in embed | `true` |\n\n## 🚀 Running Locally\n\n```bash\n# Install dependencies and run\nuv run main.py\n```\n\n## 🐳 Docker Deployment\n\n### Docker Compose (Recommended)\nCreate a `docker-compose.yml` file:\n\n```yaml\nservices:\n  watcher:\n    image: ghcr.io/astral-sh/uv:python3.13-bookworm-slim\n    container_name: aternos-watcher\n    restart: unless-stopped\n    volumes:\n      - .:/app\n    working_dir: /app\n    environment:\n      - ATERNOS_WATCHER_HOST=your-server.aternos.me\n      - ATERNOS_WATCHER_WEBHOOK_URL=https://discord.com/api/webhooks/...\n    command: uv run main.py\n```\n\nRun with:\n```bash\ndocker compose up -d\n```\n\n## ☁️ Dokploy Deployment\n\nIf you are using [Dokploy](https://dokploy.com), use the following configuration:\n\n1. **Build Type**: Nixpacks\n2. **Environment Variables**: Set the variables listed in the Configuration section.\n3. **Start Command**: `uv run main.py`\n","size":35,"stargazers_count":0,"topics":["aternos","minecraft","python","server","watcher"],"updated_at":"2025-12-28T00:44:38Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":28,"contributors_count":5,"created_at":"2023-02-06T08:19:48Z","default_branch":"master","description":null,"fork":false,"forks_count":0,"full_name":"Ayfri/challenge-48h","homepage":"http://ayfri.me/challenge-48h/","html_url":"https://github.com/Ayfri/challenge-48h","id":598021027,"is_template":false,"language":"HTML","name":"challenge-48h","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2023-02-07T22:57:40Z","readme_content":"# challenge-48h\n\nHere is the solutions for all steps :\n\n1. Search the hidden italic letter. The letter is `g`.\n2. Click on the 9th button. The letter is `J`.\n3. Search the hidden paragraph in the HTML code. The letter is `o`.\n4. Search the hidden button at the bottom left of the text, download the zip, run the python script with the pgp key. The letter is `t`.\n5. Search the hidden button, remove any CSS style to it, then click on it. The letter is `R`.\n6. Convert the list to ASCII characters, remove the first and last characters and uppercase chars, then understand that the secret word\n   is `secret`. The letter is `A`.\n7. Find the hidden letters on each line of japanese text, the secret code is `lotos`. Then enter the code in the input field. The letter\n   is `Z`.\n8. Restart the game until you win. The letter is `P`.\n9. Rotate all the squares one time, then click on each square. The letter is `A`.\n10. Search the bold letter in the text `My favorite fitness activities are:`. The letter is `s`.\n11. Search the hidden paragraph in the HTML code at the end of the body and read the content of the paragraph. The letter is `p`.\n12. Search the hidden letter in the `html` tag element. The letter is `i`.\n13. Search the hidden paragraph in the HTML code at the end of the body. Copy the content and decrypt it as morse code. The letter is `S`.\n14. Search the hidden button that is spinning and moving, click on it. Then go to the inspector and search the session storage. The key\n    is `session_key`, the letter is `r`.\n15. Go back to step 7 and copy the 158th character. The letter is `c`.\n16. You won !\n","size":2437,"stargazers_count":0,"topics":[],"updated_at":"2023-02-07T11:56:57Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":1484,"contributors_count":88,"created_at":"2022-08-04T11:21:17Z","default_branch":"master","description":"Compose Multiplatform, a modern UI framework for Kotlin that makes building performant and beautiful user interfaces easy and enjoyable.","fork":true,"forks_count":0,"full_name":"Ayfri/compose-jb","homepage":"https://jetbrains.com/lp/compose/","html_url":"https://github.com/Ayfri/compose-jb","id":521237061,"is_template":false,"language":"Kotlin","name":"compose-jb","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-09-09T18:07:11Z","readme_content":"[![official project](http://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)\n[![Latest release](https://img.shields.io/github/v/release/JetBrains/compose-jb?color=brightgreen&label=latest%20release)](https://github.com/JetBrains/compose-jb/releases/latest)\n[![Latest build](https://img.shields.io/github/v/release/JetBrains/compose-jb?color=orange&include_prereleases&label=latest%20build)](https://github.com/JetBrains/compose-jb/releases)\n\n# Compose Multiplatform, by JetBrains\n![](artwork/readme/apps.png)\nCompose Kotlin UI framework port for desktop platforms (macOS, Linux, Windows) and Web, components outside of the core Compose repository\nat https://android.googlesource.com/platform/frameworks/support.\n\nPreview functionality (check your application UI without building/running it) for desktop platforms is available via IDEA plugin (https://plugins.jetbrains.com/plugin/16541-compose-multiplatform-ide-support).\n\n## Tutorials\n### Compose for Desktop\n* [Getting started](tutorials/Getting_Started)\n* [Image and icon manipulations](tutorials/Image_And_Icons_Manipulations)\n* [Mouse events and hover](tutorials/Mouse_Events)\n* [Scrolling and scrollbars](tutorials/Desktop_Components#scrollbars)\n* [Tooltips](tutorials/Desktop_Components#tooltips)\n* [Top level windows management](tutorials/Window_API_new)\n* [Menu, tray, notifications](tutorials/Tray_Notifications_MenuBar_new)\n* [Keyboard support](tutorials/Keyboard)\n* [Tab focus navigation](tutorials/Tab_Navigation)\n* [Swing interoperability](tutorials/Swing_Integration)\n* [Navigation](tutorials/Navigation)\n* [Accessibility](https://github.com/JetBrains/compose-jb/tree/master/tutorials/Accessibility)\n* [Building native distribution](tutorials/Native_distributions_and_local_execution)\n* [Signing and notarization](tutorials/Signing_and_notarization_on_macOS)\n\nAlso, see [Foundation](https://developer.android.com/jetpack/compose/documentation#core) and [Design](https://developer.android.com/jetpack/compose/documentation#design) docs from Google. They were originally written for Android, but most of information applies to Compose for Desktop as well.\n\n### Compose for Web\n* [Getting started with Compose for Web](tutorials/Web/Getting_Started) \n* [Building web UI](tutorials/Web/Building_UI)\n* [Handling Events](tutorials/Web/Events_Handling)\n* [Controlled and Uncontrolled inputs](tutorials/Web/Controlled_Uncontrolled_Inputs)\n* [Style DSL](tutorials/Web/Style_Dsl)\n* [Using test-utils](tutorials/Web/Using_Test_Utils)\n\n### Jetpack Compose for Android\nCompose Multiplatform uses Jetpack Compose developed by Google when you target Android platform. See more info about it [here](tutorials/Development_for_Android).\n\n[The docs](https://developer.android.com/jetpack/compose/documentation) published by Google are great and decribe how to develop on Compose for Android.\n\nNote that when you use Compose Multiplatform, you setup your project differently. You can create a multiplatform project with Android support via IDEA Project Wizard, or by copying [multiplatform template](https://github.com/JetBrains/compose-jb/tree/master/templates/multiplatform-template). In `androidMain` source set you can use almost all information from the docs, and in `commonMain` source set you can use information from Foundation and Design sections.\n\n## Examples\n   * [codeviewer](examples/codeviewer) - File Browser and Code Viewer application for Android and Desktop\n   * [imageviewer](examples/imageviewer) - Image Viewer application for Android and Desktop\n   * [issues](examples/issues) - GitHub issue tracker with an adaptive UI and ktor-client\n   * [game](examples/falling-balls) - Simple game\n   * [game](experimental/examples/falling-balls-mpp) - Simple game for web target\n   * [compose-bird](examples/web-compose-bird) - A flappy bird clone using Compose for Web\n   * [notepad](examples/notepad) - Notepad, using the new experimental Composable Window API\n   * [todoapp](examples/todoapp) - TODO items tracker with persistence and multiple screens\n   * [todoapp-lite](examples/todoapp-lite) - A simplified version of [todoapp](examples/todoapp), fully based on Compose\n   * [widgets gallery](examples/widgets-gallery) - Gallery of standard widgets\n   * [IDEA plugin](examples/intellij-plugin) - Plugin for IDEA using Compose for Desktop\n\n## Other ##\n* [artwork](artwork) - design artifacts\n* [benchmarks](benchmarks) - collection of benchmarks\n* [compose](compose) - composite build of [Compose-jb sources](https://github.com/JetBrains/androidx)\n* [ci](ci) - Continuous Integration helpers\n* [gradle-plugins](gradle-plugins) - a plugin, simplifying usage of Compose Multiplatform with Gradle\n* [templates](templates) - new application templates\n* [components](components) - custom components of Compose Multiplatform\n   * [Split Pane](components/SplitPane)\n* [experimental](experimental) - experimental components and examples\n   * [cef](experimental/cef) - CEF integration in Jetpack Compose (somewhat outdated)\n   * [Video Player](experimental/components/VideoPlayer)\n   * [LWJGL integration](experimental/lwjgl-integration) - An example showing how to integrate Compose with [LWJGL](https://www.lwjgl.org)\n   * [CLI example](experimental/build_from_cli) - An example showing how to build Compose without Gradle\n       \n## Getting latest version of Compose Multiplatform ##\n\nSee https://github.com/JetBrains/compose-jb/releases/latest for the latest stable release or https://github.com/JetBrains/compose-jb/releases for all stable and dev releases.\n","size":142542,"stargazers_count":0,"topics":[],"updated_at":"2022-08-04T13:35:52Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":1260,"contributors_count":448,"created_at":"2021-01-04T18:29:29Z","default_branch":"main","description":"deno.land website ","fork":true,"forks_count":1,"full_name":"Ayfri/deno_website2_fr","homepage":"https://deno.land","html_url":"https://github.com/Ayfri/deno_website2_fr","id":326773565,"is_template":false,"language":"TypeScript","name":"deno_website2_fr","open_issues_count":4,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-22T17:56:19Z","readme_content":"# deno_website2_fr\n\n[![Build Status](https://github.com/denoland/deno_website2/workflows/ci/badge.svg?branch=main&event=push)](https://github.com/denoland/deno_website2/actions)\n\nCeci est le code pour https://deno.land/\n\nCe site Web se compose de deux parties\n\n1. Un Worker Cloudflare\n2. Une application Next.js hébergée sur Vercel\n\nNous voulons fournir de jolies URL sémantiques pour les modules qui seront\nutilisés dans Deno. Par exemple: https://deno.land/std/http/server.ts\n\nLorsque nous demandons ce fichier à l'intérieur de Deno, nous devons recevoir le\ncontenu brut du fichier. Cependant, lorsque nous visitons cette URL dans le\nnavigateur, nous voulons voir un joli fichier HTML avec coloration syntaxique.\n\nPour ce faire, le Worker Cloudflare examine l'en-tête HTTP \"Accept:\" pour voir\nsi le client veut du HTML ou non. S'il veut du HTML, nous transmettons\nsimplement la demande à Vercel. (Nous utilisons Vercel en raison de leur belle\nintégration GitHub.)\n\n## Histoire\n\nCeci est une réécriture du site Web Deno, il combinera le code dans\nhttps://github.com/denoland/deno/tree/f96aaa802b245c8b3aeb5d57b031f8a55bb07de2/website\net https://github.com/denoland/registry et aura un déploiement plus rapide.\n\nCeci est écrit via React / TailwindCSS / Vercel / CloudFlare Workers. Pas en\nDeno. Idéalement, cela pourrait être porté à Deno à un moment donné, mais nous\navons besoin d'un nouveau site Web et la version portée sur Deno prend trop de\ntemps. Nous espérons voir ce code porté sur Deno avec un minimum d'interruptions\ndans le flux de développement (en particulier, nous avons besoin de la capacité\nd'écouter les événements du système de fichiers et de recharger le serveur Web).\n\n## Licence d'images\n\nCes images Deno sont distribuées sous licence MIT (domaine public et utilisation\ngratuite).\n\n- [Un graphique pour le blog v1 par @hashrock](https://deno.land/v1.jpg)\n","size":84108,"stargazers_count":0,"topics":[],"updated_at":"2021-04-19T06:49:37Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":3118,"contributors_count":453,"created_at":"2025-03-27T10:34:08Z","default_branch":"master","description":"A list of developer portfolios for your inspiration","fork":true,"forks_count":0,"full_name":"Ayfri/developer-portfolios","homepage":null,"html_url":"https://github.com/Ayfri/developer-portfolios","id":955873141,"is_template":false,"language":null,"name":"developer-portfolios","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2025-03-27T10:34:29Z","readme_content":"# Developer Portfolios\n\nA list of developer portfolios for your inspiration\n\nHave you built a portfolio? Are you proud of it?! Open a [PR](./CONTRIBUTING.md) to this repo and let's showcase your work! Refer to the [CONTRIBUTING](./CONTRIBUTING.md) file for direction.\n\nThis repo was inspired by [Ali Spittel's](https://twitter.com/ASpittel) tweet\n[<img width=\"597\" alt=\"Portfolio\" src=\"https://user-images.githubusercontent.com/7671983/64871043-bab42880-d644-11e9-8e87-4a98d06339c9.png\">](https://twitter.com/ASpittel/status/1171604728951779328)\n\nHopefully this repo can serve as a source of inspiration for your portfolio!\n\n## Current Portfolio Count: 974\n\n**Jump to:** [A](#a) | [B](#b) | [C](#c) | [D](#d) | [E](#e) | [F](#f) | [G](#g) | [H](#h) | [I](#i) | [J](#j) | [K](#k) | [L](#l) | [M](#m) | [N](#n) | [O](#o) | [P](#p) | [Q](#q) | [R](#r) | [S](#s) | [T](#t) | [U](#u) | [V](#v) | [W](#w) | [Y](#y) | [Z](#z) | [Random Portfolio](https://s111ew.github.io/random-button-redirector/)\n\n---\n\n## A\n\n- [Aaban Malik](https://muhammadaamirmalik.com/)\n- [Aabar Khan](https://aabaarkhan.quippedai.com/)\n- [Aabid Ahmed](https://sawad.framer.website/)\n- [Aabraham James](https://seera.framer.website/)\n- [Aakash Rajbanshi](https://aakashrajbanshi.com.np/) [Flutter Developer]\n- [Aakash Sharma](https://aakash-sharma.netlify.app)\n- [Aakhand Tajmirul](https://www.me.toinfinite.dev/) [Frontend Engineer]\n- [Aamir Malik](https://muhammadaamirmalik.com/)\n- [Aaron Dunphy](https://aarondunphy.com)\n- [Aaron Lacerda](https://nightdev4l.me/index.html)\n- [Aaryanna Simonelli](https://ashleighsimonelli.co.uk)\n- [Aashir Khan](https://portfolio-n4sn.vercel.app)\n- [Aashutosh Rathi](https://aashutosh.dev)\n- [Aayush Bharti](https://aayushbharti.in/) [Full-stack Developer]\n- [Aayush Kurup](https://aayushkurup.dev)\n- [Aayush Sood](https://www.aayushsood.com/)\n- [Abass Dev](https://abassdev.com)\n- [AbdeNassar Amimi](https://abdenassar-portfolio-4smfcqph6-abdenassaramimi99-gmailcom.vercel.app)\n- [Abdelaziz El Arassi](http://aelarassi.com)\n- [Abdul Rahman](https://abdulrahman.id)\n- [Abdul Rauf](https://armujahid.me)\n- [Abdul Wahab Khan](https://wahab-khan.github.io/Abdul-Wahab-Khan/) [Mobile Developer]\n- [Abdullah Ayoola](https://ayooladev.vercel.app)\n- [Abdulmalik Alsufayran](https://malikthefullstack.com)\n- [Abdusamad Malikov](https://www.abdusamad.uz)\n- [Abhinandhan Devadiga](https://abhicodestudio.com)\n- [Abhinav Galodha](https://www.galodha.com)\n- [Abhinav Kumar](https://my-portfolio-flax-kappa.vercel.app)\n- [Abhinay Thakur](https://abhinaythakur.com)\n- [Abhishek Bhardwaj](https://www.imabhishek.online)\n- [Abhishek Kandel](https://abhishekkandel.com.np)\n- [Abhishek Panchal](https://skillstackpanchal.vercel.app)\n- [Abhishek Panthee](https://abhishekpanthee.com.np)\n- [Abhishek Singh](https://www.abhishekworks.com/) [Full-Stack developer]\n- [Abu Said](https://www.abusaid.me)\n- [Abu Suhaib](https://suhaib.protool.co.in) [Full-Stack WebnApp Developer]\n- [Abubakr Mufutau-Oseni](https://abubakrmo.com)\n- [Adam Alston](https://www.adamalston.com)\n- [Adeola Badero](https://www.adeolabadero.me) [Frontend Engineer & UI/UX Designer]\n- [Adham Dannaway](https://www.adhamdannaway.com/) [UX/UI Designer & Frontend Developer]\n- [Adil Aboulkacim](https://adilaboulkacim.com)\n- [Adithya Krishnan](https://www.adithyakrishnan.com/)\n- [Aditya Chaudhary](https://aditya-portfolio-dusky.vercel.app/)\n- [Aditya Kumar Gupta](https://aditya30051993.github.io/my-portfolio) [Doctor & Developer]\n- [Aditya Kumar](https://www.adityakr.com)\n- [Aditya Medhe](https://aditya.medhe.in)\n- [Aditya Punmiya](https://adityapunmiya.com) [Software Engineer]\n- [Aditya Seth](https://adityaseth.in) [Software Developer & DevOps Architect]\n- [Aditya Vikram Singh](https://www.adityavsingh.com)\n- [Adityakumar Sinha](https://aditya113141.github.io)\n- [Adrian Alvarez](https://www.adrian-alvarez.dev) [Frontend Developer]\n- [Afam Olie](https://afamolie.com) [Full-Stack Developer]\n- [Agney Menon](https://agney.dev)\n- [Agrawal Pratham](https://agrawalpratham.in)\n- [Ahamed Kabeer](https://aktech27.github.io/) [MERN Full-Stack Developer]\n- [Ahmad Almory](https://ahmedalmory.github.io/portfolio)\n- [Ahmad Awais](https://ahmadawais.com)\n- [Ahmad Gill](https://ahmadgill-portfolio.netlify.app/) [MERN/NextJs Developer | Web 3 & Blockchain]\n- [Ahmed Oublihi](https://www.medevs.xyz)\n- [Ahmet Eren Odacı](https://ahmete.ren)\n- [Ahsan Khan](https://ahsankhan.me)\n- [Aishani Pachauri](https://aishanipach.netlify.app)\n- [Ajay Kannan](https://ajaykannan.netlify.app)\n- [Ajetunmobi Damilare](https://damilareajetunmobi.vercel.app/) [Software Developer]\n- [Ajink Gupta](https://ajinkgupta.vercel.app)\n- [Akash Balasubhramanyam](https://akashblsbrmnm.github.io) [C Developer]\n- [Akash Rajpurohit](https://akashrajpurohit.com)\n- [Akhil Surapuram](https://surapuramakhil.github.io) [Sofware Engineer & Data Enthusiast]\n- [Akhshy Ganesh](https://akhshyganesh.github.io/) [Full-Stack Developer | Solution Architect]\n- [Akira Yoshiro](https://gungho0619.vercel.app) [Full-Stack Developer Web | Blockchain]\n- [Akshat Gupta](https://www.akshatvg.com)\n- [Akshay](https://devakshay.vercel.app)\n- [Alan Hamlett](https://ahamlett.com/) [Founder & CEO @WakaTime]\n- [Alan Khalili](https://www.alan-khalili.com/)\n- [Alejandro Gomez](https://alejandro-gomez.vercel.app)\n- [Alejandro Sobko](http://alejandrosobko.com)\n- [Aleksandar Pajić](https://www.aleksandarpajic.co) [Software Developer & Designer]\n- [Alestor Aldous](http://alestor123.github.io)\n- [Alex Michailidis](https://alexandros.tech)\n- [Alexandre Trotel](https://www.alexandretrotel.org)\n- [Alexandros Lekkas](https://alexandroslekkas.com)\n- [Alexey Golub](http://tyrrrz.me)\n- [Alfred Dagenais](https://alfreddagenais.com)\n- [Ali Saleem](https://alisaleem252.com) [Web Developer & Web Programmer]\n- [Ali iranmanesh](https://linuxtimes.ir)\n- [Allan Im](https://allanim.com) [Software Engineer]\n- [Allan Muturi](https://allanmuturi.vercel.app)\n- [Aloys Dillar](https://trolologuy.github.io)\n- [Alvalens](https://www.alvalens.my.id)\n- [Aman Anku](http://amananku26.github.io)\n- [Aman Mittal](http://amanhimself.dev)\n- [Aman Shrivastava](https://aman04.netlify.app)\n- [Amir Akbulut](https://amirdev.nl)\n- [AmirAli Rashidi](https://amiralirashidi.github.io/) [Front-End Developer]\n- [Amoda Fernando](https://www.fernand3z.dev/)\n- [Amogh Telkar](https://amoghtelkar.com)\n- [Amresh Prasad Sinha](https://amreshsinha.vercel.app)\n- [Amruth Pillai](https://amruthpillai.com)\n- [Anamuddin Ahmad](https://github.com/AnamuddinAhmad/Portfolio_1) [Software Engineer & Freelancer]\n- [Anandhu Sajan](https://anandhusajan.com)\n- [Ananya Biswas](https://dub.sh/ananyabiswas)\n- [Anas Boubechra](https://cschad.com)\n- [Anay Paraswani](https://anayparaswani.dev)\n- [Andrej Sharapov](https://sharapov.dev)\n- [Andres Alcaraz](https://andres-alcaraz.netlify.app/)\n- [Andrew Woods](https://andrewwoods.net)\n- [Andrianarisoa Daniel](https://www.devist.xyz)\n- [Andrii Zontov](https://lwjerri.dev)\n- [André de Faria](https://andredfaria.github.io/)\n- [Andy Bell](https://andy-bell.design)\n- [Anik Ahammed Khan](https://anikahammedkhan.com)\n- [Aniket Kudale](https://aniket.co)\n- [Anil Khatri](https://imkaka.github.io)\n- [Anish Biswas](https://anish7.me)  [FullStack Dev]\n- [Ankit Dey](https://dub.sh/ankitdey)\n- [Ankush Minda](http://ankushminda.com)\n- [Anshul Gora](https://anshulwork.netlify.app)\n- [Anshuman Jha](https://anshuman-jha.vercel.app/)\n- [Anthony MAHEFASOA](https://thony32.me)\n- [Anthony Odumodu](https://antonodu.netlify.app/)\n- [Antoine Dangleterre](https://antoinedangleterre.com)\n- [Anton Bojko](https://mrtoxas.github.io/cv/portfolio/)\n- [Antonio Ferreiro](https://toniferr.github.io)\n- [Antony Jude Shaman](https://antonyjudeshaman.vercel.app)\n- [Antônio Junior](https://portfolio-antonio-ten.vercel.app)\n- [Anurag Affection](https://anuragaffection.vercel.app)\n- [Anurag Hazra](https://anuraghazra.github.io)\n- [Ares](https://ares.uy)\n- [Ariel Andrade](https://sudoariel.github.io)\n- [Arjun Ganesan](https://arjunganesan.com)\n- [Armel Munyaneza](https://munyaneza.vercel.app/)\n- [Arpit Sharma](https://yesarpit.github.io)\n- [Arsalan Shakil](https://arsalanshakil.github.io)\n- [Arsh Sahzad](https://www.arsh.dev)\n- [Arshad MQ](https://arshadmq.com) [Sr. Full Stack Developer and Freelancer]\n- [Arslan Sarfraz](https://arslansarfraz.github.io/portfolio/)\n- [Artur Bień](https://expensive.toys/) [UI & Frontend Developer]\n- [Arup Mandal](https://arupmandal.github.io)\n- [Asad Shah](https://iamasadshah-ibnerafi.vercel.app)\n- [Asfakur Nariz](https://asfakur-portfolio-nextjs.vercel.app) [Front-end Developer || UI/UX Designer || Full Stack Developer]\n- [Asfakur Nariz](https://asfakur-portfolio-nextjs.vercel.app/)\n- [Ashak Zahin Hasan](https://aboutzahin.pages.dev)\n- [Ashikur Rahaman](https://portfolio-by-ashik.netlify.app/)\n- [Ashish Mehra](https://ashishmehra.dev)\n- [Ashish Namdeo](https://ashishnamdeo.com)\n- [Ashkan Misaghi](https://ashkanmisaghi.ir)\n- [Ashwin Hariharan](https://ashwinhariharan.tech)\n- [Ashwith Rai](https://ashwithrai.me) [Full Stack developer]\n- [Assad Isah](https://www.nottherealalanturing.site)\n- [Aster Bandis](https://bandisast.eu)\n- [Aster Li](https://asterjuneli.com)\n- [Atanas Atanasov](https://atanas.info)\n- [Atul Kumar Awasthi](https://atultheportfolio.netlify.app)\n- [Auroob Ahmad](https://auroob.github.io/dev-port)\n- [Austin Gericke](https://www.austingericke.com)\n- [Austin Pham](https://auspham.dev)\n- [Avinash Pauskar](https://avinashhhportfolio.netlify.app)\n- [Avinash Singh](https://www.avinash-singh.in) [Full Stack Developer]\n- [Avinash Suthar](https://avinashsuthar.in) [Full Stack Developer]\n- [Avinash](https://avinash-portfolio-v3.web.app/) [Web dev and AI engg.]\n- [Aviral Dixit](https://aviraldixit.in)\n- [Avisek Ray](https://avisek.codeltix.com) [Full Stack Developer)\n- [Avnish Kumar](https://theavnishkumar.in)\n- [Ayanabha Misra](https://ayanabha.life)\n- [Aycan Öğüt](https://aycan.dev)\n- [Ayush Baral](https://rushayu.vercel.app) [Front-End Web Developer]\n- [Ayush Nighoskar](https://ayushn.netlify.app)\n- [Azaan Suhail](https://personal-portfolio-website-seven-teal.vercel.app/)\n\n## B\n\n- [Bakare Afolabi](http://afolabibakare.netlify.app)\n- [BalKrishna](https://balkrishnabk.com.np)\n- [Baptiste Miramont](https://baptistemiramont.fr)\n- [Barrack Amuyunzu](https://amuyunzubarrac.club)\n- [Beatriz Neaime](https://beatrizneaime.com) [Full Stack Web Developer)\n- [Becca Bailey](http://Becca.is)\n- [Bejagam Nithilesh](https://nithilesh.vercel.app/)\n- [Bekah Hawrot Weigel](http://bekahhw.github.io)\n- [Ben Oldham](https://www.benoldham.dev) [Web Developer]\n- [Ben Rogers](https://benrogers.dev)\n- [Benjamin Dallard](https://github.com/bdallard/ai-resume-portfolio)\n- [Benjamin Lannon](https://lannonbr.com)\n- [Benny Carlsson](https://bennycarlsson.github.io/MyPortfolio-Hacktoberfest2019/)\n- [Berat Bozkurt](https://beratbozkurt.net)\n- [Bertil Tandayamo](https://www.bertiltandayamo.me)\n- [Beteab Tefera](https://beteabtefera.com)\n- [Bhagawat Adhikari](https://github.com/bhagawatadhikari)\n- [Bharat Bhandari](https://bharatdev.vercel.app)\n- [Bhavani Ravi](http://bhavaniravi.com)\n- [Bhavesh Mishra](https://bhaveshmishra.dev)\n- [Bhavya Tomar](https://bhavya.dev)\n- [Bhupendra Singh](https://bhupi2508.netlify.app)\n- [Bhushan Borole](https://bhushan-borole.github.io)\n- [Binay Shaw](https://binay-shaw.onrender.com) [Mobile Developer]\n- [Bipin M V](https://bipinmv.netlify.app)\n- [Bjorn Melin](https://bjornmelin.io) [Data Scientist]\n- [Blanc John Clayton](https://www.johnclaytonblanc.com)\n- [Bob Matyas](https://www.bobmatyas.com)\n- [Bogdan Marić](https://bogdanmaric.dev)\n- [Bohdan Khvorostovskyi](https://khvorostovskyi.com)\n- [Boris Edison](https://borisedison.in)\n- [Bouwe Westerdijk](https://bouwe.io)\n- [Brad Garropy](https://bradgarropy.com)\n- [Brandon Mitchell](https://juncie.com) [Full Stack Developer]\n- [Brendan Lentz](https://brendanlentz.com)\n- [Brihadeesh R K](https://briha.xyz) [Full Stack Developer]\n- [Brittany Chiang](https://brittanychiang.com)\n- [Bryan Smith](https://multikitty.onrender.com)\n\n## C\n\n- [Cade Kynaston](https://cade.codes)\n- [Capt. Michael](https://captmichael.dev) [MERN Full Stack Developer]\n- [Carlos Dubón](https://carlosdubon.dev)\n- [Casper Iversen](https://caspertheghost.me)\n- [Cecelia Martinez](http://ceceliacreates.com)\n- [Cemal Türkcan)](https://cemalturkcan.com)\n- [Chambrin Alexandre](https://chambrin.dev)\n- [ChanhDai](https://chanhdai.com)\n- [Charles C. Pustejovsky III](https://cpustejovsky.com)\n- [Charles Ouimet](https://ouimet.info) [Backend Developer] (made with [TechFolios](https://techfolios.github.io))\n- [Chee Hwa Tang](https://cheehwatang.com)\n- [Chetan Padia](https://chetbox.com)\n- [Chetanya Kandhari](https://availchet.github.io)\n- [Chethin Manage](https://www.cmanage.dev)\n- [Chicago IT Systems](https://www.chicagoitsystems.com)\n- [Chirag Bhalotia](https://chirag.codes)\n- [Chirag Samal](http://chiragsamal.github.io)\n- [Chris Carr](http://snackpipe.com)\n- [Chris Kennedy](http://cyberstorm.vercel.app) [Blockchain focused web developer]\n- [Chris Otto](https://chrisotto.dev)\n- [Chris Poole](https://chrispoole.com)\n- [Christian Kaisermann](https://kaisermann.me)\n- [Christian Toscano](https://achris.me)\n- [Chuck Smith](https://eclecticcoding.com)\n- [Chuckz Okoye](https://chuckzokoye.com)\n- [Chung Nguyen Thanh - ChunhThanhDe](https://chunhthanhde.github.io)\n- [Ciro Ciampaglia](https://cirociampaglia.it)\n- [Clyde D'Souza](https://clydedsouza.net)\n- [Codervai](https://codervai.vercel.app/)\n- [Codexoft KE](https://codexoft.tech) [Full Stack Developer & Mobile App Dev]\n- [Cole Emeruche](https://coleruche.com)\n- [Colin Lord](https://colinlord.com)\n- [Collins Koech](https://collinskoechportfolio.web.app)\n- [Constance Souville](https://constancesouville.com/) [Frontend Developer]\n- [Cristian Cezar Moisés](https://ccm.securityops.com.br)\n- [Cristiano Filho](https://cristianofilho.github.io)\n- [Cui Ding](https://cuierd.github.io)\n- [codervai](https://codervai.vercel.app)\n\n## D\n\n- [Dale French](https://dalefrench.dev)\n- [Dale Larroder](https://dalelarroder.com)\n- [Damian Duda](https://damianduda.dev) [Full-stack Developer]\n- [Damian Markowski](https://damianmarkowski.com)\n- [Dania Al-Hakim](https://pixeldania.netlify.app)\n- [Daniel Grazziotti](https://grazziotti-portfolio.vercel.app)\n- [Daniel Mark](https://thedanielmark.com)\n- [Daniel Michael](https://www.daniel-michael.com)\n- [Daniel Steele](https://www.danielsteele.dev) [Full-Stack Developer]\n- [Danil Gordeev](https://dangor220.github.io/developer-portfolio/)\n- [Danilo Batson](https://danilobatson.github.io/portfolio)\n- [Danilo Castro](https://www.welcomedeveloper.com)\n- [Darshan Bhuva](https://darshanbhuva.vercel.app) [Full-stack Developer]\n- [Darshan Vasani 2](https://dpvasani56.vercel.app/)\n- [Darya Redkina](https://reddev.in/)\n- [David Hérault](https://dherault.com)\n- [Davide Santangelo](https://davidesantangelo.com)\n- [Debasish Dutta](https://debasishdutta.is-a.dev)\n- [Deepak Singh](https://deepaksingh.vercel.app)\n- [Delba](https://delba.dev)\n- [Demon142](https://demon142.net)\n- [Demon142](https://demon142.net)\n- [Denis Tokarev](https://devlato.com)\n- [Dennis Cristian](https://denncriss.com)\n- [Dev Abass](https://blog.abassdev.com)\n- [Dev Jadiya](https://dev-jadiya.web.app/)\n- [Dev](https://devpalwar.vercel.app)\n- [Devrim Mehmet Pattabanoğlu](https://devrimmehmet.com/)\n- [Dewald Els](https://dewaldels.com)\n- [Dhananjay Shahane](https://dhananjay-dev.vercel.app)\n- [Dhanush Nehru](https://chat-portfolio-dhanushnehru.netlify.app/) [Unique Whatsapp Portfolio]\n- [Dharmendra Kumar](https://www.developer-dharmendra.online)\n- [Dhaval Patel](https://dhavalcode.com)\n- [Dheeraj Gupta](https://dheerajgupta.netlify.app/#)\n- [Dhiraj Basavaraju](https://portfolio-dhirajb7.vercel.app)\n- [Dhruv Mali](https://dhruvmali.netlify.app/)[React and node Devloper]\n- [Dhruv Sathe](https://dhruv-alpha.vercel.app/) [Software Engineer & Freelancer]\n- [Dhruva Bhat S N](https://dhruvabhat.netlify.app)\n- [Dhruvil Rathod](https://dhruvilrathod.me/) [Fullstack Developer | Angular & NestJS Specialist]\n- [Dhyey Bhandari](https://dhyeybhandari.vercel.app) [Full Stack Developer & UI/UX Designer]\n- [Dhyey Bhandari](https://dwinurcahya.my.id) [Web Developer & Software Engineer]\n- [Diana Kit](https://winehoused.github.io/my-portfolio) [Front-End Developer]\n- [Dick Wyn Yong](https://dickwyn.xyz)\n- [Diego Rezende](https://diegorezm.netlify.app/)\n- [Dillion Megida](http://dillionmegida.com)\n- [Dimitri Pashutskii](https://dpashutskii.com)\n- [Dina TAKLIT](https://dinataklit.github.io/DinaTaklitPortfolio)\n- [Dineshreddy Paidi](https://dineshreddypaidi.vercel.app)\n- [Dino Gomez](https://dinogomez.vercel.app)\n- [Dinokage](https://dinokage.in)\n- [Dipesh Murmu](https://dipeshmurmu.com.np)\n- [Divyansh Kathuria](https://divyanshkathuria.netlify.app/)\n- [Dor Lugasi-Gal](https://dorlugasigal.netlify.app/)\n- [Drew Bredvick](https://drew.tech)\n- [Durgesh Chaudhary](https://yodkwtf.com)\n- [Dushmanta Behera](https://dushmanta.dev)\n- [Dustin Brett](https://dustinbrett.com/)\n- [Dustin Doan](https://dustindoan-portfolio.vercel.app/)\n- [Dylan GIL AMARO](https://dga-dev.fr)\n- [Dzmitry Drepin](https://linktr.ee/drepin)\n\n## E\n\n- [Edgard Barquero Real](https://barquero.dev)\n- [Eduard-Constantin Ibinceanu](https://eduardconstantin.github.io)\n- [Ehsan Rafee](https://ehsanrafee.ir)\n- [Electric Magic Factory](https://electricmagicfactory.com/en/)\n- [Elio Jordan Lopes](https://developer.vercel.app)\n- [Elliot Négrel-Jerzy](https://bsodium.fr)\n- [Elmo Nickol](https://elmonickcool.vercel.app)\n- [Emilia Sonder](https://isemilia.vercel.app)\n- [Emir Bolat](https://spee.dev/)\n- [Emmanuel ADEKPLOVI](https://homescriptone.com)\n- [Enea Xharja](https://eneaxharja.com)\n- [Enes Hacısağır](https://enesehs.github.io)\n- [Erdal TAŞKESEN](https://www.erdaltaskesen.com)\n- [Eren Aygün](https://www.erenaygun.com) [Frontend Developer]\n- [Erik Henrique Alves Cunha](https://www.erikunha.dev/)\n- [Esteban Mansart](https://mansartesteban.vercel.app/)\n- [Evander Inácio](https://evander.vercel.app)\n- [Ezekiel Ekunola](https://ezekielekunola.com)\n\n## F\n\n- [Fabio Junior Raminhuk](https://fabra.dev/)\n- [Fahim Bin Amin](https://www.fahimbinamin.com/)\n- [Faishal Hakim](https://faishal24.my.id)\n- [Farindra Bhandari](https://fbb.com.np/)\n- [Fayaz Bin Salam](https://p32929.github.io)\n- [Felipe Mourão](https://mouraocode.com.br/)\n- [Felix Leupold](https://xiel.dev)\n- [Felix Tellmann](https://flext.dev)\n- [Fernando Júnior](https://fernaandojr.vercel.app)\n- [Fi Amanillah](https://fi.amanillah.com/) [Full-Stack Developer] ([@fiamanillah](https://github.com/fiamanillah))\n- [Fidalgo Pedro](http://fidalgo.dev)\n- [Filippo Concato](https://concatofilippo.com)\n- [Flavia Medici](https://t.co/iQK1Hbx8xD?amp=1)\n- [Floris Melchers](https://Floriscodes.nl)\n- [Frances Coronel](https://francescoronel.com)\n- [Franck GALLIOD](https://www.franckwebpro.com/) [Fullstack & Webflow Developer]\n- [Franklin Castellanos](https://onecastell.github.io)\n- [Franklin Huichi Contreras](https://franh20.github.io)\n- [Franklin Ohaegbulam](https://frankiefab.netlify.app)\n- [Frederic Henri](https://cloud06.io)\n- [Furkan Cengiz](https://furki.vercel.app)\n- [Furkan Kapukaya](https://furkankapukayaa.github.io)\n\n## G\n\n- [Gabriel López](https://glpzzz.dev)\n- [Gabriel Machado](https://machado001.github.io) ([@machado001](https://github.com/machado001))\n- [Gabriel Tekombo](https://gabrielthecode.com)\n- [Gabriele Corti](https://borntofrappe.github.io)\n- [Ganesh Patil](https://hardikjain.netlify.app)\n- [Garv Nanwani](https://garvnanwani.netlify.app)\n- [Gaspare Tortora](https://gaspavar.dev)\n- [Gaurav Bansal](https://gaurav-bansal.vercel.app/)\n- [Genesis Gabiola](https://genesisgabiola.now.sh)\n- [George Christeas](https://chr-ge.com)\n- [George Fincher](https://www.grimfunky.dev)\n- [Georges Atalla](https://www.georgesatalla.com)\n- [Georgi Yanev](https://gyanev.com)\n- [Gerardo Perrucci](https://gperrucci.com)\n- [Ghazi Khan](https://ghazikhan.in)\n- [Ghom Krosmonaute](https://ghomkrosmonaute.github.io/?game) ([@GhomKrosmonaute](https://github.com/GhomKrosmonaute))\n- [Ghulam Ahmed](https://gahmed.com)\n- [Gianluca Fiore](http://gianlucafiore.it)\n- [Gianluca Galota](https://gianlucagalota.dev)\n- [Giorgio Faini](https://giorgiofaini.com)\n- [Goh Jun Xiang](https://gohjunx.github.io/GohJunXiang.github.io)\n- [Goh You Sheng](https://shenggg2000.github.io/portfolio)\n- [Gokul Raja](https://gokul-raja84.github.io/)\n- [Grace Snow](https://gracesnowdesign.co.uk)\n- [Grégoire Launay--Bécue](https://linv.dev) ([@Linventif](https://github.com/linventif))\n\n## H\n\n- [Hafid Ziti](https://www.hafidziti.dev)\n- [Hamish Williams](https://hamishw.com/)\n- [Hamza Ehsan](https://www.hamzaehsan.com)\n- [Hamza Naseem](https://hamzanaseem.vercel.app/)\n- [Hanif Yuli Abdillah P](https://hanifabdlh.vercel.app/) [AI Software Engineer and Data Science]\n- [Hansana Prabath](https://hansana.is-a.dev)\n- [Hanzla Tauqeer](https://github.com/1hanzla100/developer-portfolio)\n- [Hareesh Bhittam](https://hareesh.is-a.dev) [Full-Stack Developer]\n- [Harijaona Ravelondrina](http://www.bigjohn.dev)\n- [Harlon Garcia](https://harlon.netlify.app)\n- [Harsh Singhvi](https://harshsinghvi.com)\n- [Harwin Dan](https://itscrazydev.netlify.app)\n- [Hasan Aydoğdu](https://haydogdu1990.github.io/resume-json-css)\n- [Hasan](https://hasansiddiqui.netlify.app)\n- [Hassam Ul Haq](https://hassam.dev) [Backend Developer - PHP Laravel]\n- [Hassan Ahmed](https://www.hassanahmed.net)\n- [Hassan Ahani](https://hasanahani.ir)\n- [Hassan Murtaza](https://hassanmurtaza.com)\n- [Hassan RJ](https://hassanrj.vercel.app/) [Hassan RJ Full Stack Next.js Developer\n- [Hemsundar Paranthaman](https://hemdev.vercel.app)\n- [Henry Lee](https://dragonwarrior.vercel.app)\n- [Herman Starikov](http://starikov.dev)\n- [Himavanth Kumar Perni](http://himavanth-kumar-perni-portfolio.vercel.app) [Fullstack Developer]\n- [Hisami Kurita](https://hsmkrt1996.com/) [Frontend Developer]\n- [Hrithik Dhakrey](https://iamdhakrey.dev) [Backend Developer]\n- [Hubert Kimani](https://hubertkimani.me)\n- [Hugo Damion](https://hugo-damion.me)\n- [Hugo Folloni](https://hugofolloni.com)\n- [Humanshu Jaglan](https://humanshu-jaglan.vercel.app)\n- [Hungry Bear Studio](https://www.hungrybearstudios.com)\n- [Hussein Sarea](https://ho011.vercel.app)\n- [Huzaifa Mustafa](https://www.huzaifamustafa.com)\n\n## I\n\n- [Ian Lunn](https://ianlunn.co.uk/) [Frontend Developer | Responsive Web Specialist]\n- [Ibrahim Hizlioglu](https://www.ibrahimhizlioglu.com)\n- [Ike Ofoegbu](https://iodev.io)\n- [Ilham Riski Wibowo](http://ilhamriski.com/) [Fullstack Developer]\n- [Ilija Korodić](https://ilijakorodic.netlify.app/) [Frontend Developer]\n- [Ilke Ozsekerli](https://ilkeozs.info)\n- [Ilyes Landolsi](https://ilandols.com)\n- [Indrajeet Nikam](https://indrajeet.me)\n- [Ingus Jansons](https://ingus.co.uk)\n- [Iqboljon Hasan](https://iqboljon.uz)\n- [Isabella Riquetti](https://isabella-riquetti.netlify.app)\n- [Ishaan Sheikh](https://frikishaan.com)\n- [Isitha Subasinghe](https://isub.dev)\n- [Ismail Ghallou aka Smakosh](https://smakosh.com)\n- [Israel Mitolu](https://israelmitolu.netlify.app)\n- [Iulian Rotaru](https://iulian.rotaru.fr)\n\n## J\n\n- [Jack Parsons](https://jackparsonss.me)\n- [Jacob Herper](https://jacobherper.com)\n- [Jaen Nova](https://jaenn.netlify.app)\n- [Jagadeesh B](https://jagadeeshftw.netlify.app)\n- [Jagannath p s](https://jagannathps.site/) [Front end developer ]\n- [Jahir Fiquitiva](https://jahir.dev)\n- [Jaimin Bariya](https://jaimin-bariya.web.app/) (Check [GitHub Repo](https://github.com/jaimin-bariya/jaimin-bariya-portfolio))\n- [Jainam Desai](https://th3c0d3br34ker.github.io)\n- [Jainex Patel](https://jainex.vercel.app)\n- [Jake Ginesin](https://jakegines.in)\n- [Jam Moonbami](https://moonbamiofficial.vercel.app)\n- [James Mathew](https://crazymath072.tech)\n- [James Mumo](https://jamesmumo.vercel.app/)\n- [James Turner](http://turnerj.com)\n- [Jason Solano](https://jasonsolano.tech)\n- [Jatin Jha](https://jatin0jha.github.io/)\n- [Jatin Sharma](http://j471n.in)\n- [Jatin Tekam](https://jatin-tekam.netlify.app/)\n- [Jay Bhavsar](https://jay.is-savvy.dev)\n- [Jay Gaha](https://jaygaha.com.np) [full-stack developer]\n- [Jay Keraliya](https://jaykeraliya.com)\n- [Jay Vegad](https://jayvegad.vercel.app/)\n- [Jaya Vignesh](https://i-viki.github.io/) [Backend Developer]\n- [Jayant Goel](http://jayantgoel001.github.io)\n- [Jayant Parashar](https://jparasha.github.io)\n- [Jayed Rafi](https://jayedrafi.com)\n- [Jayvee Valenzuela](https://jayveepvalenzuela.github.io)\n- [Jeayoung Jeon](https://jyje.live) [MLOps/DevOps Engineer]\n- [Jeff Chiu](https://jeffchiucp.github.io/portfolio)\n- [Jens van Wijhe](https://www.beterbekend.nl)\n- [Jeremiah Haastrup](https://jeremiahhaastrup.com)\n- [Jeremy Erik Leong](https://www.jeremyerikleong.com)\n- [Jeremy Grifski](https://jeremygrifski.com)\n- [Jerin BS](https://jerinbs.vercel.app)\n- [Jerry Hirsch](https://jerryhirsch.com)\n- [Jesus Santander](https://jsantanders.dev)\n- [Jim Raptis](http://www.raptis.wtf)\n- [Jin Jheng Rong](https://jinrup.vercel.app)\n- [Jo Lienhoop](https://jolienhoop.com)\n- [John Carlo Camara](https://jiseeeh.codes)\n- [John Doe](https://portfolio-john2.netlify.app)\n- [Jonas Werner](https://jonaswerner.com)\n- [Joshua Chinwendu](http://joshualine.github.io)\n- [Joshua Izuchukwu](https://joshuaizu.vercel.app)\n- [Juan Cisneros](https://portfoliojuanfranciscocisneros.web.app)\n- [Juan Diaz](https://jpdiaz.dev)\n- [Juan Pablo Jimenez](https://juanpablojimenez.dev) [Front-end Developer]\n- [Jubin Ayoob](https://web-portfolio-jubin369.vercel.app)\n- [Judicaël AHYI](https://judicael-ahyi.com)\n- [Jules Lofficial](https://pandaguerrier.fr) [@PandaGuerrier](https://github.com/PandaGuerrier)\n- [Julia Johnson](http://juliacodes.com)\n- [Juned Khan](https://junedkhan.me)\n- [Juon Kawakami (@evesquare)](https://me.evesq.com) [Fullstack Developer | UI/UX Designer]\n- [Jyotirmoy Bandyopadhayaya](https://itsmebravo.dev)\n\n## K\n\n- [KIRAN KUMAR](https://ikiran-dev.github.io)\n- [Kaleigh Scruggs](http://kaleighscruggs.com)\n- [Kamil Mazurek](https://kamilmazurek.pl/)\n- [Kapil Dadhich](https://kapildadhich075.netlify.app/)\n- [Karen Fletcher](https://knpfletcher.dev)\n- [Karthik Menon](https://www.karthikmenon.com)\n- [Karthik Shetty](http://karthikshetty.info/) [Software Engineer | Fullstack Developer]\n- [Karunika](https://karunika.work/)\n- [Kashiful Haque](https://ifkash.vercel.app)\n- [Katie Amberg-Johnson](https://kambergjohnson.com) (made with [TechFolios](https://techfolios.github.io))\n- [Katie Haus](https://astro-portfolio-site.netlify.app/)\n- [Katleho Mokhele](https://mokhele.pythonanywhere.com)\n- [Kaung Myat](https://kgmyat.vercel.app/) [Frontend Developer]\n- [Kaustubhai](https://kaustubhai.netlify.app)\n- [Kavan Bhavsar](https://kavan-bhavsar.vercel.app) [Fullstack web developer | UI/UX Designer]\n- [Kavi Castelo Dev](https://kavicastelo-dev.netlify.app)\n- [Kavi Castelo](https://kavindukokila.netlify.app)\n- [Kay Evans-Stocks](https://www.kaystocks.com/) [Design Engineer]\n- [Keita Yamada](https://p5aholic.me) [Designer & Web Developer]\n- [Keith Lau](https://keithlau2015.github.io/portfolio)\n- [Kenta Yamamoto](https://ychof.com)\n- [Ketuman Vishwakarma](https://k2maan.vercel.app/)([@k2maan](https://github.com/k2maan))\n- [Kevin Bogagne](https://kevinbg.vercel.app/) [Software Engineer ]\n- [Kevin Nguyen](https://www.kevinbkdev.blog/) [Software Engineer | Blockchain Enthusiast]\n- [Khaled Ahmed](https://khaled.is-a.dev)\n- [Khang Nguyen](https://khangnd.info)\n- [Khizar FAREED](https://khizarfareed.netlify.app/) [Engineer ]\n- [Khokon M.](https://khokon.dev)\n- [Kidus Bewket](https://kidus.ca)\n- [Kiran Naragund](https://kiran1689.github.io)\n- [Kiran Poudel](https://pkiran.com.np)\n- [Kowsyap Pranay](https://kowsyappranay.site)\n- [Krishnanand A](https://krishnananda.netlify.app)\n- [Krupal Sanchaniya](https://krupal-portfolio.vercel.app/) [Software Developer ]\n- [Krutarth Parmar](https://kayparmar.com)\n- [Kunal Passan](https://kunalpassan.vercel.app)\n- [Kushan Devarajegowda (Software Developer | Software Engineer | SDE | SWE)](https://ikushdev.github.io)\n- [Kyle Smith](https://yskkyle.com)\n\n## L\n\n- [Lakshan Rukantha](https://lakshanrukantha.github.io)\n- [Larry Xue](https://larryxue.dev)\n- [Laurie Barth](http://laurieontech.dev)\n- [Le Duong Hung Thinh](https://thinh.io.vn/) [Front-end Engineer]\n- [Leandro Simões](https://lesimoes.dev)\n- [Lee Robinson](https://leerob.io)\n- [Lee Warrick](http://leewarrick.com)\n- [Leonardo Oliveira](https://leonardoliveira.com)\n- [Leonel Ngoya](https://lndev.me)\n- [Leroy Rosales](https://leroyrosales.com)\n- [Lindsey Howard](https://lindseyk.dev)\n- [Liplan Lekipising](https://lekipising.com)\n- [Liran Tal](https://lirantal.com) [Developer Advocate at Snyk, GitHub Star, OpenJS Foundation Pathfinder for Security Award]\n- [Lisa Blunt](https://lisablunt.github.io)\n- [Lisa Savoie](http://lscodes.com)\n- [Liz Lam](https://lizlam.github.io)\n- [Long Do](https://longpdo.github.io)\n- [Loránd Kiss](https://lorandkissdev.github.io/github-portfolio/)\n- [Luca Lischetti](https://sirlisko.com)\n- [Lucas Batista](https://lucasbatista.online)\n- [Lucas Dantas](https://dantsdev.vercel.app)\n- [Lucas Lima](https://lucas-lima.vercel.app)\n- [Luis Cacho](https://luiscachog.io)\n- [Lukasz Kups](https://lukaszkups.net)\n\n## M\n\n- [Dr Milan Milanovic](https://milan.milanovic.org/)\n- [MP3Martin](https://mp3martin.xyz)\n- [Maciej Pulikowski](https://pulik.dev) [Software Engineer & Security Researcher | 8 x Google Hall of Fame]\n- [Madhan K](https://madhank93.github.io)\n- [Madhur Dixit](https://madhurdixit13.github.io/Portfolio/)\n- [Madhurima Rawat](https://madhurimarawat.github.io/Portfolio-Website/) [Data Scientist & Frontend Developer]\n- [Mads Hougesen](https://mhouge.dk)\n- [Maduakor Emmanuel](https://emmajs.vercel.app)\n- [Madza](https://www.madza.dev/)\n- [Mahmoud AlSharif](https://malsharif.me)\n- [Mahmoud Nabhan](https://mahmoudnabhan.com/)\n- [Makechi Eric](https://love-makechi.web.app)\n- [Malik Muhammad Safwan](https://maliksafwan.netlify.app)\n- [Malinda Lakshan](https://www.malindalakshan.com/)\n- [Manish Tamang](https://www.manishtamang.com)\n- [Manoj Thilakarathna](https://manojtharindu11.github.io/Personal_portfolio_website/)\n- [Marc Backes](http://marc.dev)\n- [Marco Baldini](https://marcobaldini.pages.dev/)\n- [Marijan Smetko](https://msmetko.xyz)\n- [Mario Kandut](https://www.mariokandut.com)\n- [Mariya Baig](https://mariyabaig.vercel.app/)([@mariyabaig](https://github.com/mariyabaig))\n- [Marko Denic](https://markodenic.com)\n- [Markus Polzer](https://www.rapidtech1898.com)\n- [Marouane Rassili](https://mrassili.com)\n- [Martin Tale](https://martintale.com/) [Web, App, Game Developer]\n- [Mason Slover](https://github.com/MasonSlover/ProcessingPortfolio)\n- [Masud Rana Shawon Dark](https://masudranashawon.netlify.app)\n- [Masud Rana Shawon Light](https://masudranashawon.vercel.app)\n- [Mateus Felipe G.](https://mateusf.com)\n- [Matheus Misumoto](https://matheusmisumoto.dev)\n- [Matheus Victor](https://matheusvictor.vercel.app)\n- [Mathis Zeghouani](https://mathisdev.pro)\n- [MathisCool](https://mathiscool.is-a.dev)\n- [Matt Filer](http://mattfiler.co.uk)\n- [Matus Stafura](https://stafura.dev)\n- [Matvey Kottsov](https://matvey.codes)\n- [Maverick](https://supacode.dev)\n- [Maxim Villivald](https://villivald.com)\n- [Maya Shavin](https://www.mayashavin.com)\n- [Mayank Aggarwal](https://mayank0255.github.io)\n- [Mayank Mehra](https://mayank-portfolio-pied.vercel.app/)\n- [Maytiya Monburinon](https://gigigimay.github.io)\n- [Md Muhaiminul Islam Shihab](https://muhaiminShihab.github.io) [Software Developer | PHP, Laravel, Next.js, MySQL.]\n- [Md Nabil Ahsan](https://www.mdnabilahsan.com)\n- [Md Ranju](https://www.mdranju.xyz) [Frontend Developer]\n- [Md Usman Ansari](https://mdusmanansari.netlify.app)\n- [Mees Verberne](https://meesverberne.com/) [Creative Frontend Developer & Designer]\n- [Meet Vipul Gandhi](https://portfolio-nu-lovat-90.vercel.app/project) [Software Developer]\n- [Melvin Jones Repol](https://mrepol742.github.io)\n- [Melvyn Malherbe](https://melvynx.com)\n- [Mertcan Kose](https://mertcankose.vercel.app)\n- [Michael Hoffmann (Mokkapps)](https://mokkapps.de)\n- [Michaell Alavedra](https://www.michaellalavedra.com/)\n- [Michal Grzebisz](https://www.michalgrzebisz.com/) [Creative Frontend Developer | UI/UX Enthusiast]\n- [Michel de Freitas](https://michelfreitas.com)\n- [Michelle Brenner](https://michellebrenner.com)\n- [Miguel Rodriguez](https://migu.es)\n- [Mihir](https://mihir-portfolio-main-777.vercel.app)([Mihir2006](https://github.com/MIHIR2006))\n- [Minmitha A](https://minmitha.vercel.app)\n- [Mitul Savani](http://mitulsavani.com)\n- [Mohamad Fadhil Yaacob](https://fadhil-blog.dev)\n- [Mohamed Zhioua](https://mohamedzhioua.vercel.app)\n- [Mohammad Haaris Iqubal](http://haarisiqubal.github.io)\n- [Mohammad Rahmani](https://afgprogrammer.com)\n- [Mohammed Hesham Farhan](https://mohammedfarhan.me)\n- [Mohammed-Yousuf Hamid](https://mohammedcodes.dev)\n- [Mohit Paudyal](https://findmohit.netlify.app)\n- [Morelen Yim](https://morelenyim.com)\n- [Moritz Kornher](https://moritzkornher.de)\n- [Mouad ZIANI](https://mouadziani.github.io)\n- [Mounir Mohamed Amine](https://aminedev.vercel.app/)\n- [Mubeen Mohammed](https://mubeenmohammed.tech)\n- [Mudassir Ali](https://mudassirali.com/) [Full Stack Developer | Software Engineer]\n- [Muhammad Azlaan Zubair](https://www.mdazlaanzubair.com/) [Frontend Developer]\n- [Muhammad Jaafar](https://m7mad.dev/)\n- [Muhammad Muhaddis](https://muhaddis.info)\n- [Muhammad Murtaza](https://murtazasarwar.com)\n- [Muhammad Mustafiz Rahman](https://mustafizrahman.vercel.app/) [Frontend Developer | MERN Stack Developer]\n- [Muhammad Naeem Tahir](https://muhammadnaeemtahir.github.io)\n- [Muhammad Rashid](https://iamrashy.netlify.app)\n- [Muhammad Saad Siddique](https://saad-muhammadsaadsiddique.vercel.app)\n- [Muhammad Ubaid Raza](https://mubaidr.js.org) [Sr. Software Engineer | Full Stack Developer | Chrome Extension Expert]\n- [Mukul Chugh](https://mukulchugh.com)\n- [Mushfiqur Rahman](https://mushfiq.xyz/)\n- [Mustafa Bhikhapurwala](https://mustafabhikhapur.me/)\n- [Mustapha Nkhili](https://mustapha-nkhili.web.app)\n- [Muzaffer Kadir YILMAZ](https://mkdir.dev)\n- [mahdi.is-a.dev](http://mahdi.is-a.dev) [Try to Find the Easter Egg! :)]\n\n## N\n\n- [Nabin Khair](https://www.nabinkhair.com.np)\n- [Nacho Caiafa](https://nachokai.github.io/rpg-cv)\n- [Nader Ferjani](https://nader.run)\n- [Nafas Ebrahimi](https://nafasebra.ir)\n- [Nahid Hasan](https://mdnahidhasan.netlify.app)\n- [NatachaBezerra](https://tachan-t.github.io/Portfolio-Natacha-Bezerra/)\n- [Nathan Simpson](https://nathansimpson.design)\n- [Naveed Ahmed](https://www.trixum.net)\n- [Nayan Das](https://www.nayandas.dev)\n- [Nazia Shehnaz Joynab](https://geek-a-byte.github.io)\n- [Nazmus Sayad](https://sayad.dev)\n- [Neelanjan Chakraborty](https://neelanjan-chakraborty.github.io)\n- [Nguyen Chanh Dang](https://chanhdang.com)\n- [Nhlanhla Hasane](https://nhlanhlahasane.netlify.app)\n- [Nicholas Gannon](https://nicholasgannon.io/)\n- [Nico Bachner](https://nicobachner.com)\n- [Nico van Zyl](https://nicovanzyl.com)\n- [Nicolo Rebughini](https://nirebu.com)\n- [Nikita Sobolev](https://sobolevn.me)\n- [Nilesh Fatfatwale](https://nileshfatfatwale.vercel.app/)\n- [Nilkanth Patadiya](https://nilkanthpatadiya.vercel.app)\n- [Nimit Trevadiya](https://nimit-trevadiya.vercel.app/) (fullstack developer)\n- [Nipun Jain](https://lucifernipun22.github.io)\n- [Niresh Shrestha](https://niresh.com.np/)\n- [Nisarg Patel](https://nisarg.io)\n- [Nischal Dutt](https://nischaldutt.netlify.app)\n- [Nishant Banjade](https://nishantbanjade.com.np)\n- [Nishant Dewangan](https://nishantdewangan.vercel.app)\n- [Nitesh Seram](https://niteshseram.in)\n- [Noaman Ahmed](https://noamanahmed.com)\n- [Nurliman Diara](https://nurliman.dev)\n- [Nuwan Jaliyagoda](http://nuwanjaliyagoda.com)\n\n## O\n\n- [Oktay Shakirov](https://oktayshakirov.com)\n- [Olaolu Olawuyi](https://olaolu.dev)\n- [Om Avcher](https://omavchar.vercel.app/)\n- [Om](https://omchaudhari1107.github.io)\n- [Omar Gastón Chalas](https://ogaston.com)\n- [Omargpax](https://omargpax.pages.dev)\n- [Omari Thompson-Edwards](https://omarileon.me)\n- [Onur Şuyalçınkaya](https://onur.dev/)\n- [Opeyemi Obembe](http://obem.be/opeyemi)\n- [Oraz Gulchayew](https://orazgulcayew.vercel.app)\n- [Orion Dobos](https://oriondobos.com/)\n- [Osama Islam](https://osamaislam.vercel.app)\n- [Oscar Tian](http://www.bluexguardian.com)\n- [Oussama Bonnor](https://oussamabonnor1.github.io/portfolio)\n- [Oussama Bouchikhi](https://oussamabouchikhi.github.io)\n- [Oussama Sallak](https://www.osallak.tech)\n\n## P\n\n- [PHPxCODER](https://phpxcoder.in)\n- [Paal Stakvik](https://paalss.vercel.app)\n- [Pablo Conejos](https://www.pabloconejos.dev/)\n- [Pablo Ramon](https://pabloramon.com.br/)\n- [Pan Wei Lian](https://williamson922.github.io)\n- [PandaDEV](https://pandadev.net)\n- [Pandiyan Murugan](https://pandiyancool.github.io/pandiyan.cool)\n- [Panhareach Phat](https://phatpanhareach.vercel.app)\n- [Pankaj Gaikar](https://pankajgaikar.com)\n- [Pankaj Kumar](https://pankaj-kumar-techie.github.io) [Software Engineer]\n- [Parth Kaul](https://parthkaul-bit.github.io/portfolio/)\n- [Parth Kothari](https://0xparthdev.netlify.app)\n- [Parth Mittal](https://parthmittal.netlify.app)\n- [Pasindu Dilshan](https://pasi-d.me/)\n- [Patricia Aas](https://patricia.no)\n- [Patrick Chiu](https://patrick-kw-chiu.github.io)\n- [Patrick Hyatt](https://www.patrickhyatt.com)\n- [Patrick Obermeier](https://www.patrickobermeier.at)\n- [Patrick Reid](http://iamreliq.com)\n- [Paul Agbogun](https://ifeoluwa-portfolio-five.vercel.app)\n- [Paul Koeck](https://paul.koeck.dev)\n- [Paulo Oliveira](https://paul8liveira.is-a.dev)\n- [Pawaret Meungkaew](https://www.pawaret.dev)\n- [Pazindu Shane](https://pazindushane.github.io)\n- [Pedro Reis](https://preis.tech)\n- [Peter Gallwas](https://peter.husky.nz)\n- [Philip Johnson](https://philipmjohnson.org) (made with [TechFolios](https://techfolios.github.io))\n- [Philipe Almeida](https://palmeida.netlify.app)\n- [Pierre Nel](https://pierre.io/) [Full-stack Developer | UX/UI Designer]\n- [Pieter-Jan Scheir](https://www.pieterjanscheir.com)\n- [Poonam Chauhan](https://poo17nam.github.io/profile)\n- [Prakash Pun](https://prakashpun.me) [Software Engineer]\n- [Pramesh Karki](https://karkipramesh.com.np)\n- [Pranshu Patel](https://pranshu05.vercel.app)\n- [Prashant Khandelwal](https://prashantk.dev)\n- [Praveen Kumar Purushothaman](https://praveen.science)\n- [Preet Suthar](https://preetsuthar.me)\n- [Prem Prakash Sharma](https://premprakashsharma.vercel.app/)\n- [Prince Kumar](https://www.princecodes.online)\n- [Pritam Debnath](https://pridebnath.github.io/portfolio-v2/) [ Frontend Developer ]\n- [Pritu Yadav](https://prituyadav.github.io/)\n- [Priya Nayak](https://priya180975.github.io/portfolio)\n- [Pruthviraj Mundargi](https://pruthviraj-guddu.github.io/)\n- [Pushkar Patel](https://thepushkarp.com)\n- [Pushpak Chhajed](https://pushpak1300.github.io)\n- [Puzant Bakjejian](https://puzant.netlify.app/)\n\n## Q\n\n- [Quentin Berthet](https://quentinberthet.ch)\n- [Qui Nguyen](https://www.lexnguyen.dev)\n\n## R\n\n- [Rabin Thami](https://www.rabinthami.com.np/)\n- [Rachit Bharadwaj](https://rachit.infornics.com)\n- [Radiat Hossain Ridoy](https://radiat.netlify.app)\n- [Rafael Salazar](https://rafalazar.github.io)\n- [Rafael Santana](https://www.rafaelsantana.dev)\n- [Ragav R](https://ragavs-profile.netlify.app/)\n- [Rahul Bhatija](https://rahulbhatija.com)\n- [Rahul Kumar](https://rahulbaran.vercel.app)\n- [Rahul Sawant](http://raalzz.com)\n- [Raj Aryan](https://rajxryan.vercel.app)\n- [Raj Chhalotrte](https://raj-portfolio101.netlify.app/)\n- [Rajan Bhattarai](https://cdrrazan.com)\n- [Rajekevin](https://rajekevin.fr)\n- [Rajesh Kumar Yadav](https://rajeshkumaryadav.com/)\n- [Rakib Sarowar](https://rakibsarowar.com)\n- [Rakibul Islam](https://rakibul-islam-hasib.web.app)\n- [Ralf D. Müller](https://fiveandahalfstars.ninja/rdmueller.html)\n- [Ramesh Kumar](https://rameskum.com)\n- [Ramin Rezaei - V1](https://raminrezaei.se)\n- [Ramin Rezaei - V2](https://raminr77.vercel.app/)\n- [Ramiz](https://my-portfolio-pied-xi.vercel.app)\n- [Ratnesh Patil](https://ratanesh-patil.github.io/portfolioratnesh/)\n- [Raziel Rodrigues](https://www.razielrodrigues.dev/)\n- [Razin Rayees](https://razin.in)\n- [Reeya Gupta](https://reeyadev.vercel.app/) [Full Stack Developer]\n- [Remi Jara](https://www.remi-jara.fr)\n- [Renjith Abraham](https://renjith.com)\n- [Rensith Udara](https://rensithudara.github.io/portfolio/)\n- [Riccardo Venturini](https://riccardoventurini.dev/)\n- [Richard Hill](https://www.rhdigital.co.uk/) [Digital Designer]\n- [Rick Hanlon](https://rickhanlonii.github.io)\n- [Rifat Ishtiyak](https://rifat-ishtiyak.web.app)\n- [Riley J. Shaw](https://rileyjshaw.com)\n- [Rimenes Ribeiro](https://rimenesribeiro.com)\n- [Rimon Chowdhury](https://rimonchowdhury.netlify.app/)\n- [Rishabh Kushwah](https://rishabhkushwah.netlify.app)\n- [Rishabh Rawat](https://rrawat.com)\n- [Rituparna Warwatkar](https://rituparnawarwatkar.com) [SDE@AWS EC2, Berlin]\n- [Robin Mastromari](http://robinmastromarino.com/) [UI/UX Designer]\n- [Robiul Hasan](https://www.robiulhasan.dev)\n- [Rohit Kushwaha](https://rohitk06.vercel.app)\n- [Rohit Raj](https://rohit-raj.netlify.app/)\n- [Rohit Wadhwa](https://github.com/rohit-wadhwa)\n- [Roland L. Taylor](http://rolandixor.pro)\n- [Roman Smunyov](https://romanisthere.github.io)\n- [Ronny Coste](https://ronnycoste.com)\n- [Roshan Kr Soni](https://roshankrsoni.github.io)\n- [Ruhban Abdullah](https://developerruhban.com/)\n- [Rutik Kulkarni](https://www.crio.do/learn/portfolio/rutikkulkarni2001)\n- [Ryan Burgess](http://ryanburgess.com)\n- [Ryan MacLean](http://ryanmaclean.com)\n- [Ryan Pereira](http://ryanpereira.me)\n\n## S\n\n- [Saahil D](https://saahild.com)\n- [Sabarish](https://www.sabarish.in/)\n- [Sabin Ranabhat](https://sawin.com.np) [Senior Mobile Developer]\n- [Sachin Srinivasan](https://s8sachin.github.io)\n- [Saeid Doroudi](https://saeiddoroudi.ir)\n- [Safoor Safdar](https://safoorsafdar.com)\n- [Sagar Betkar](https://sagarbetkar.netlify.app/)\n- [Sagar Giri](https://girisagar46.github.io)\n- [Sagar Khurana](https://hellosagar.vercel.app)\n- [Sagar Mude](https://sagarmude.netlify.app)\n- [Sahil] (https://sahil500-portfolio.netlify.app/)\n- [Sai Sudheer Dontha](https://github.com/saisudhir14)\n- [Sai Teja](https://saiteja13427.github.io)\n- [Sai Terukula](https://terukulasai-portfolio.netlify.app/) [DevOps Engineer]\n- [Said Kharboutli](https://saidk.io)\n- [Saif Ur Rehman](https://saifwebdev.netlify.app)\n- [Saiful Alam](https://msar.me)\n- [Saiful Islam](https://saifulislam.online) [Front-end web development]\n- [Saikiran Somanagoudar](https://www.saikiransomanagoudar.com)\n- [Saitheja komalla](https://saitheja20.github.io/Portfolio/)\n- [Sajjad Gul](https://sajjadgul.com/)\n- [Saksham Agarwal](https://skshamagarwal.github.io/)\n- [Salman Ibrahim](https://salman-ibrahim.github.io)\n- [Sam Foreman](https://samforeman.me) \\[Computational Scientist\\]\n- [Samarth Kadam](https://samarthkadam.vercel.app)\n- [Samik Malhotra](https://samikmalhotra.netlify.app)\n- [Samrat Mitra](https://lionelsamrat10.github.io)\n- [Samuel Muchai Macharia](https://sammymacharia.vercel.app)\n- [Sanajit Jana](https://sanajitjana.github.io)\n- [Sandeep Panigrahi](https://sandeepdot1.github.io)\n- [Sanee Itas](https://saneeitas.netlify.app)\n- [Santosh Yadav](http://santoshyadav.dev)\n- [Sanyam Kumar](https://sanyam.dev)\n- [Sarang N](https://srng.dev)\n- [Saroj Pradhan](https://pradhansaroj.com.np)\n- [Sartaj Alam](https://sak03.github.io/sartaj.dev/)\n- [Sarvesh Patil](https://sarveshpatil.com)\n- [Satish Jhanwer](https://satishjhanwer.github.io) ([@satishjhanwer](https://github.com/satishjhanwer))\n- [Satyam Gupta](https://imlolman.github.io) ([@imlolman](https://github.com/imlolman))\n- [Saurabh Daware](https://www.saurabhdaware.in)\n- [Saurabh Nemade](https://www.nemade.eu) (Staff Engineer) ([@saurabhnemade](https://github.com/saurabhnemade))\n- [Saurabh Patil](https://saurabhpatil.netlify.app/) [Code Craftsman]\n- [Saurav M H](https://sauravmh.com)\n- [Sayan Pramanik](https://sayanpramanik2012.github.io/Portfolio)\n- [Sayantan Basu](https://sayantan-basu.vercel.app/)\n- [Sayed Anowar](https://sayedanowar.netlify.app/) [Freelance Web Developer]\n- [Sayyid Marvan](https://sayyidmarvanvt.vercel.app/)\n- [Schalk Venter](https://schalkventer.me/)\n- [Schleidens Dev](https://schleidens.netlify.app)\n- [Scott Spence](https://scottspence.com)\n- [Sebastian Cherny](https://sebascherny.github.io/)\n- [Sebbie Chanzu](https://sebbie-chanzu.vercel.app/) [Backend, DevOps and Machine Learning Engineer]\n- [Sergei Chestakov](https://sergei.com)\n- [Sergio Sanchez](https://sdsanchezm.github.io/) [.Net and Java Dev]\n- [Seth Hall](https://sethhallcreative.com)\n- [Seunghun Bang](https://seunghun-website.vercel.app) (Software Engineer | Support Engineer)](https://github.com/a1603169)\n- [Seyhun Akyurek](https://www.seyhunakyurek.com)\n- [Seyoon Puvi](https://seyoonpuvi.github.io/personal-portfolio/)\n- [Shaan Khan](https://www.shaankhan.dev)\n- [Shahid Shaikh](http://shahidshaikh.com)\n- [Shakhzhakhan Maxudbek](https://args.tech)\n- [Shannon Crabill](http://shannoncrabill.com)\n- [Shanthosh Krishnakumar](https://drmsweb.com)\n- [Sharif Rahat](https://sharifrahat.com/) [Full Stack Developer]\n- [Sharon Yi](https://sharon-yi.com/) [Frontend Developer]\n- [Shashank Kumar Chaudhary](https://my-portfolio-shashank-crypto.vercel.app)\n- [Shashank Shet](https://shashank-shet.vercel.app/)\n- [Shashi Kant](https://shashikantportfolio.web.app/) [Full Stack Developer]\n- [Shaun Furtado](https://shaunfurtado.is-a.dev)\n- [Shefali](https://shefali.dev)\n- [Shibiraj](https://shibiverse.tech/)\n- [Shikhar Gupta](https://shikhar97.github.io)\n- [Shiva Raj Paudel](https://shivarajpaudel.com.np/)\n- [Shivam Raj](https://shivxmr.netlify.app)\n- [Shivesh Chaturvedi](https://shivesh1606.github.io/portfolio)\n- [Shivram Sambhus](https://shivi.io)\n- [Shomi Khan](https://shomi-khan.github.io)\n- [Shrey Asthana](https://shrey-asthana-portfolio.netlify.app)\n- [Shripad Khandare](https://shripadkhandare.in/)\n- [Shubham Chaturvedi](https://shu8ham.netlify.app)\n- [Shubham Gaur](https://shubhamessier.github.io/portfolio)\n- [Shubham Tarade](https://coder-shanks.github.io)\n- [Shuvam Manna](http://shuvam.xyz)\n- [Shyamalendu Nayak](https://www.shyam.dev/)\n- [Siddharth Vaishnav](https://codesiddharth.tech)\n- [Silas Rodrigues](https://silasrodrigues.vercel.app)\n- [Simon Knott](https://simonknott.de)\n- [Siyana Zdravkova](https://szwebdeveloper.netlify.app)\n- [Soham Mondal](https://sohammondal.com)\n- [Soumyajit Behera](https://soumyajit.vercel.app/)\n- [Sourabh Kothari](https://sourabhkothari.vercel.app)\n- [Sourav Dutta](http://i-am-souravdutta.firebaseapp.com)\n- [Sree Godavarthi](http://sreegodavarthi.github.io)\n- [Srihari Kulkarni](https://srihari-k-portfolio.vercel.app/)\n- [Srijan Baniyal](https://srijanbaniyal.com)[Full Stack Developer]\n- [Ste O'Neill](https://steoneill.dev)\n- [Stefan Bohacek](https://fourtonfish.com)\n- [Stefan Topalovic](https://www.stefantopalovic.com/)\n- [Stéphane Chan Hiou Kong](https://www.chan-stephane.me) (Software Engineer) ([@chan-stephane](https://github.com/chan-stephane))\n- [Sudev Thapa Magar](https://portfolio-nu-ten-94.vercel.app/) - Full Stack Developer \n- [Suhaib SZ](https://suhaib.protool.co.in) (Founder of) ([@Protool](https://protool.co.in))\n- [Sumonta Saha Mridul](https://sumonta056.github.io)\n- [Surya MU](https://surya-mu.me/)\n- [Syauqi Suhaimi](https://portfolio-syauqi.vercel.app)\n- [Syed Muhammad Abdullah Ahsan](https://linktr.ee/abdullahahsan)\n- [Syed Muhammad Saad Bukhari](https://saadbukhari.vercel.app) [Software Developer,Polygot Programmer]\n\n## T\n\n- [TJ Klint](https://tjklint.github.io)\n- [TOBIAS MEYHÖFER](https://www.tobiasmeyhoefer.de)\n- [Tadashi Amano](https://tadashiamano.vercel.app)\n- [Taiizor](https://github.com/Taiizor) [.NET Developer]\n- [Tanisha Gupta](https://tanishagupta1.github.io/Tanisha-Gupta-portfolio)\n- [Taranjeet Singh](https://taranjeet.co)\n- [Tarun M S](https://tarunms.netlify.app/)\n- [Tejas Kumar](http://tej.as)\n- [Tejaswi Chaudhari](https://tejaswichaudhari.me)\n- [Tek Kshetri](http://tekkshetri.com.np)\n- [Tek Raj Joshi](https://t3kraj.netlify.app)\n- [TheKaushikGoswami](https://thekaushikgoswami.github.io)\n- [Thea Choem](https://thea.juniorise.com)\n- [Thea Mushambadze](https://highflyer910.github.io)\n- [Thiago Sousa](https://github.com/ThiagoSousa81) [Cryptographer - Full-Stack Developer]\n- [Thibaud Dervily](https://www.thibaud-dervily.fr)\n- [Thibault Mathian](https://thibault.sh)\n- [Thinh Ngo](https://thinhcorner.com/)\n- [Thomas David](https://thomas-david-portfolio.netlify.app)\n- [Tiago Hermano](https://tiagohermano.dev)\n- [Tiago Leite](https://www.tiagocreator.com)\n- [Tibor Ignéczi](https://igneczitibor.hu) [Full-Stack Developer]\n- [Tim Jones](https://timmoth.com)\n- [Tim Stanton](https://www.tim-stanton.dev)\n- [Timmy O'Mahony](https://timmyomahony.com/) [Full-Stack Developer]\n- [Tinotenda Mhedziso](https://tinotenda-mhedziso.pages.dev) [Software Developer]\n- [Torben Korb](https://www.digital-creative.de)\n- [Travis Fischer](https://transitivebullsh.it)\n- [Tristan Chin](https://www.chintristan.io)\n- [Tsiry Sandratraina](https://tsiry-sandratraina.com)\n- [Tushar Kanjariya](https://tusharkanjariya.me)\n- [Tushar Singh](https://tusharsingh110.github.io/My-Portfolio)\n\n## U\n\n- [Uday Bagda](https://terminal-portfolio-seven-black.vercel.app/)\n- [Uday G](https://portfolio-v1-kappa-ten.vercel.app/)\n- [Uday Lunawat](https://udaylunawat.github.io)\n- [Ujjal Sigdel](https://www.ujjalsigdel.com.np/)\n- [Ukhang Marma](https://ukhang.vercel.app/)\n- [Ullas Arwan](https://ullas.xyz)\n- [Ulysse Pavloff](https://pavloffulysse.com/)\n- [Umesh Nagare](https://umeshnagare.com)\n- [Utkarsh Aggarwal](https://utkarshaggarwal.vercel.app/)\n- [Utkarsh Maurya](https://utkarshs-terminal.netlify.app)\n- [Utkarsh Singhal](https://utkarsh-singhal.tech)\n- [Utsav Ghimire](https://www.utsavghimire.com.np)\n- [Uğur Atmaca](https://uguratmacacv.web.app)\n\n## V\n\n- [Vahid Foroughi](https://vahidforoughi.com)\n- [Vaibhav Jaiswal](https://vaibhavjaiswal.vercel.app/#)\n- [Vaibhav Padmani](https://vi0650.github.io/)\n- [Vaibhav Prajapat](https://vai-portfolio.netlify.app)\n- [Vaibhav Singh](http://vaibhavsingh97.com)\n- [Vaidhyanathan S M](https://vaidhyanathansm.netlify.app)\n- [Vamsi Indugu](https://vamsiindugu.vercel.app/)\n- [Vamsi Krishna Chandaluri](https://vamsi-krishna-portfolio.vercel.app)\n- [Vansh Mehta](https://vansh-mehta-portfolio.vercel.app/)\n- [Varun Dey](https://varundey.me)\n- [Vatsal Shah](https://vatsalshah.in)\n- [Vauth](https://vauth.github.io/hueco)\n- [Vedant Athavale](https://vedantathavale.webflow.io)\n- [Vedant Milind Athavale](http://vedant-athavale.byethost31.com/portfolio.html?i=1)\n- [Vertanzil](https://vertanzil.github.io)\n- [Vibhor Arya](https://vibhorarya12.vercel.app/)\n- [Vidushan Chooriyakumaran](https://vidu.sh/an)\n- [Vighnesh Raut](https://vighnesh153.dev)\n- [Vijay Verma](https://vjy.me)\n- [Vikas Chauhan](https://vikaschauhan.vercel.app/)\n- [Vikas Ukani](https://vikas-ukani.github.io)\n- [Vinay Somawat](https://vinaysomawat.github.io)\n- [Vinit Shahdeo](https://vinitshahdeo.com)\n- [Vishal Bhangare](https://vishalbhangare.netlify.app/)\n- [Vishal Rai](https://vishalrai.netlify.app/)\n- [Vishwa Pramuditha](https://pramu.cc/)\n- [Vishwanath B](https://frozenhearth.vercel.app)\n- [Vishwasa Navada K](https://vishwas.tech)\n- [Vitaliy Ivanov](https://vitaliy.vercel.app)\n- [Vito Sartori](https://vito.io)\n- [Vivek Chudasama](https://vivekchudasama-2004.github.io/portfolio/)\n- [Vivek Patel - Ubuntu](http://vivek9patel.github.io)\n- [Vivek Patel](http://vivek9patel.com)\n- [Vladyslav Kryvytchenko](https://www.vladfrontend.pro)\n- [Volkan Kabay](https://volkankabay.com/)\n- [Vyom Dubey](https://vmoyd.github.io/portfolio-app/) [VMOY]\n- [vm ](https://vmthedev.web.app)\n\n## W\n\n- [William Thanh Long](https://long18.github.io) ([@Long18](https://github.com/Long18))\n- [Willian De Almeida Lemos](https://rarewolf626.github.io)\n- [Wilson Mun](https://rebrand.ly/wilsonmun)\n- [Wilson Toribio](https://wt-portafolio.vercel.app/)\n- [Wisit Longsida](https://wisit-blog.vercel.app/about)\n\n## Y\n\n- [Yamin Hossain](https://yamins-portfolio.vercel.app) [Fresher Data Scientist]\n- [Yared Tekileselassie](https://yared.vercel.app)\n- [Yaroslav Lebedenko](https://portfolio-nailheart.vercel.app)\n- [Yash Datir](https://yashdatir.github.io/profile-os)\n- [Yash Johri](https://yash1200.github.io)\n- [Yashita Namdeo](https://yashitanamdeo.github.io)\n- [Yassine Haimouch](https://gitcoder.vercel.app)\n- [Yassine Oularbi](https://yassineoularbi.github.io)\n- [Yeabsira Tarekegn](https://yeabsiras-portfolio.vercel.app)\n- [Yechiel Kalmenson](https://yechiel.me)\n- [Yoav](https://yoav.xyz/)\n- [Yogesh Choudhary Paliyal](https://yogeshpaliyal.com)\n- [Yogesh Saini](https://saini-yogesh.github.io/Portfolio/)\n- [Younes Megaache](https://younes-megaache.com) [Software developer]\n- [Yuji Sato](https://yujisatojr.github.io/react-portfolio-template)\n- [Yuri Faria](https://windows87.github.io)\n- [Yusuf Bozacı](https://yusufbozaci.dev)\n- [Yusuf Yıldırım](https://www.yusufyildirim.dev)\n\n## Z\n\n- [ZHENG Robert](https://www.robert.hase-zheng.net)\n- [Zander Lewis](https://zanderlewis.dev)\n- [Zeel Bhanderi](https://zeelbhanderi.netlify.app) [Export Flutter Developer & FlutterFlow Developer]\n- [Ziyad](https://ziyadsk.github.io/portfolio-V2)\n- [Zobaidul Kazi](https://zobkazi.github.io/)\n- [Zonayed Ahmed](https://zonayed.me)\n","size":2404,"stargazers_count":0,"topics":[],"updated_at":"2025-03-27T10:34:08Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":117,"contributors_count":4,"created_at":"2020-10-20T20:55:40Z","default_branch":"main","description":"A npm package to fetch all of the messages of a channel, channel list or a guild, using discord.js.","fork":false,"forks_count":2,"full_name":"Ayfri/discord-fetch-messages","homepage":"https://www.npmjs.com/package/discord-fetch-messages","html_url":"https://github.com/Ayfri/discord-fetch-messages","id":305831492,"is_template":false,"language":"TypeScript","name":"discord-fetch-messages","open_issues_count":5,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-20T12:30:06Z","readme_content":"![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/Ayfri/discord-fetch-messages)\n![npm](https://img.shields.io/npm/dt/discord-fetch-messages)\n![npm](https://img.shields.io/npm/v/discord-fetch-messages?label=latest%20version)\n[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/Ayfri/discord-fetch-messages.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Ayfri/discord-fetch-messages/context:javascript)\n\n# discord-fetch\n\nA npm package to fetch all the messages from a guild, a channel or a thread.\n\n## How to use it\n\n<strong>⚠️ READ BEFORE USING ⚠️ <br>\nThese operations took a long time to process. Be patient and avoid doing this often because it's doing a lot of requests to Discord and you can be banned for sending too many requests to Discord. <br>\n⚠️ READ BEFORE USING ⚠️\n</strong>\n\n```js\nconst fetcher = new Fetcher(client);\n\nfetcher.on('fetchChannel', async channel => {\n\tawait message.channel.send(`Fetching <#${channel.id}>.`);\n});\n\nconst guildMessages = await fetcher.fetchGuild(guildID);\nconst channelMessages = await fetcher.fetchChannel(channel);\nconst threadMessages = await fetcher.fetchThread(thread);\n\nconst channelsMessages = await fetcher.fetchChannels(\n    guild.channels.filter(channel => channel.isText() && !channel.isThread() && channel.name.startsWith('g'))\n);\nconst guildMessagesAndThreads = await fetcher.fetchGuild(guildID, true);\n\nconst threadsMessages = await fetcher.fetchThreads(threadsIDs, parentChannelOfThreads);\n```\n\n## Event list :\n\n| Event Name     | Description                                                              | Arguments                                                                                        |\n| -------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |\n| `fetchChannel` | Emitter when fetching a Channel.                                         | `channel`: The channel fetched.                                                                  |\n| `fetchGuild`   | Emitted when fetching a Guild.                                           | `guild`: The guild fetched.                                                                      |\n| `fetch`        | Emitted after fetched a bulk a of messages, can fetch 0 to 100 messages. | `length`: The number of messages fetched.<br/>`messages`: The messages fetched, as a Collection. |\n| `fetchThread` | Emitted when fetching a Thread.                                           | `thread`: The thread fetched.<br/>`channel`: The parent channel of the thread. |\n\nYou can also use a `fetching` boolean property that is set to true when fetching a bulk of message, then to false.\n\n> Note :\n>\n> Node.js > 16 is required.\n","size":88,"stargazers_count":12,"topics":["discord","discord-bot","discord-js","discord-messages","fetch","fetching"],"updated_at":"2024-01-20T23:49:38Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":330,"contributors_count":39,"created_at":"2021-01-18T08:20:47Z","default_branch":"master","description":"The basic new coder friendly \"idiot's guide\", Created by Hindsight#2020 and maintained by the community.","fork":true,"forks_count":0,"full_name":"Ayfri/discordjs-bot-guide","homepage":"https://anidiots.guide","html_url":"https://github.com/Ayfri/discordjs-bot-guide","id":330599405,"is_template":false,"language":null,"name":"discordjs-bot-guide","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-01-18T08:32:35Z","readme_content":"# Welcome\n\n## Introduction\n\nThis guide makes a best effort attempt at humanizing the use of the Discord.js library. It is maintained by York\\#0001 and Hindsight\\#2020 \\(\"Evie.Codes\"\\), with the help of many precious contributors that enable us to keep updating and enhancing this guide.\n\n{% hint style=\"danger\" %}\nPlease take note that this guide is not yet fully updated to Version 12. You're currently in the v11 branch. You can switch to the V12 version by the top-left selector:\n{% endhint %}\n\n![The Gitbook version selector](.gitbook/assets/selector.png)\n\nThis guide was born out of necessity - the first version of this guide for Discord.js version 7, more than 4 years ago, was the first of its kind because I \\(Evie\\) could not find any such beginner's guide and the documentation was \\(and still is\\) unfathomably difficult to navigate for anyone without a sufficiently advanced knowledge of JavaScript concepts.\n\nIn this guide we make every effort to _teach_ you how to use the library and how to extend it with your own code. We do, however expect you to have a basic understanding of JavaScript before attempting to write bots. Discord.js \\(and other discord libraries\\) require some median-to-advanced concepts that might be hard to grasp for anyone that doesn't have a good footing with the language.\n\n## Get Support\n\nIf you have any questions after reading this guide, please don't hesitate to join us on our Discord server, \"An Idiot's Guide\". The link is located at the top of this page. If you wish to consult with the discord.js developers and official community, the Discord.js official discord is right next to ours, still at the top of the page!\n\nLast Updated: `23/04/2020`\n\n","size":2688,"stargazers_count":0,"topics":[],"updated_at":"2021-04-22T23:57:19Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":11,"contributors_count":2,"created_at":"2024-02-08T18:24:15Z","default_branch":"main","description":"A docker tp.","fork":false,"forks_count":0,"full_name":"Ayfri/docker-tp","homepage":null,"html_url":"https://github.com/Ayfri/docker-tp","id":754768512,"is_template":false,"language":"Python","name":"docker-tp","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2024-02-08T18:41:58Z","readme_content":"# student-list \nThis repo is a simple application to list student with a webserver (PHP) and API (Flask)\n\n![project](https://user-images.githubusercontent.com/18481009/84582395-ba230b00-adeb-11ea-9453-22ed1be7e268.jpg)\n\n\n------------\n\n## 1.1\tContexte\n\nPOZOS est une société informatique qui développe des logiciels pour des lycées. Le département de l'innovation veut améliorer l'infrastructure existante pour s'assurer qu’elle peut être évolutive, facilement déployable avec un maximum d'automatisation.\n\nPOZOS souhaite que vous construisiez un **POC** (Proof Of Concept) pour montrer comment docker peut vous aider et à quel point cette technologie est efficace. Pour ce POC, POZOS vous donnera une application et voudra que vous construisiez une infrastructure \"découple\" basée sur Docker. Actuellement, l'application s'exécute sur un seul serveur avec aucune répartition de charge et aucune haute disponibilité. Lorsque POZOS a besoin de déployer une nouvelle version, à chaque fois, une erreur se produit. En conclusion, POZOS a besoin d'agilité dans son parc logiciel.\nL'application sur laquelle vous allez travailler pour cette première partie s'appelle \" student_list \", cette application est très basique et permet à POZOS d'afficher la liste des étudiants avec leur âge.\n\nCette application a deux modules :\n- Le premier module est une API REST (avec authentification basique nécessaire) qui envoie la liste d'étudiants souhaitée en format JSON\n- Le deuxième module est une application web écrite en HTML + PHP qui permet à l'utilisateur final d'obtenir une liste d'étudiants\nVotre travail consiste à créer un conteneur pour chaque module et à les faire interagir les uns avec les autres\nLe code source de l'application peut être trouvé ici (https://github.com/takoukam/B3_Ynov_student-list.git )\n\nLes fichiers que vous devez fournir (dans votre livraison) sont Dockerfile et rapport. Les fichers Dockerfile sont actuellement vides.  \nIl est maintenant temps de vous expliquer le rôle de chaque fichier :\n-\tDockerfile : le fichier qui sera utilisé pour construire l'image API et web (des détails seront donnés)\n-\tstudent_age.json : contient le nom des étudiants et l'âge au format JSON\n-\tstudent_age.py : contient le code source de l'API en python\n-\tindex.php : page PHP où l'utilisateur final sera connecté pour interagir avec le service afin de lister les étudiants ainsi que leur l'âge. Vous devez mettre à jour la ligne suivante $url = 'http://<api_ip_or_name:port>/pozos/api/v1.0/get_student_ages'; avant d'exécuter le conteneur de site Web pour que api_ip_or_name et le port correspondent à votre déploiement. \n\n## 1.2\tConstruire et tester l’API\nCi-dessous des informations capitales nécessaires pour construire le conteneur API\n-\tImage de base\n\nPour créer une image API, vous devez utiliser \"python:2.7-stretch\"\n-\tMainteneur\n\nN'oubliez pas de préciser les informations du responsable. C’est une bonne pratique. \n-\tAjouter le code source\n\nVous devez copier le code source de l'API dans le conteneur dans le chemin racine \"/\" \n-\tPrérequis\n\nL'API utilise le moteur Flask, voici une liste du package que vous devez installer\n\n````apt-get update -y && apt-get install python-dev python3-dev libsasl2-dev python-dev libldap2-dev libssl-dev -y````\n\n````pip install flask==1.1.2 flask_httpauth==4.1.0 flask_simpleldap python-dotenv==0.14.0````\n\n-\tDonnées persistantes (volume)\n\nCréez un dossier de données à la racine \"`/data`\" où les données seront stockées et déclarez-le en tant que volume\nVous utiliserez ce dossier pour monter la liste des étudiants\n-\tPort API\n\nPour interagir avec cette API, exposez le port 5000\n-\tCMD\n\nLorsque le conteneur démarre, il doit exécuter student_age.py (copié à l'étape 4), il devrait donc ressembler à quelque chose comme\n`CMD [ \"python\", \"./student_age.py\" ]`\n\n-\tFaites le build de votre image \n\nNom de l’image : api \ntag: 1.0\n\n-\tRéseau\n\nCréez un réseau de type bridge appelé ``my-network``. C’est ce réseau qui sera utilisé afin de faire communiquer l’api et le web de l’application.  \n\n-\tFaites le run de votre image \n\nVérifiez que le conteneur est à l’écoute et est prêt à répondre. Lors du run de votre image, pensez bien à préciser le réseau dans lequel votre api sera déployée.  Exécutez cette commande pour vous assurer que l'API répond correctement (prenez une capture d'écran à des fins de livraison)\n\n``curl -u toto:python -X GET http://<host IP>:<API exposed port>/pozos/api/v1.0/get_student_ages``\n\nFélicitations ! Vous venez de déployer l’API (le back-end de l’application). Vous êtes maintenant prêt pour l'étape suivante qui est de déployer le web (le front-end de l’application)\n\n\n## 1.3\tConstruire et tester la page web\nAprès avoir testé votre image API, vous devez déployer le site web dans le même réseau créer précédemment ``my-network``. \n\nCi-dessous des informations nécessaires pour construire le conteneur de la page web.\n\n-\tImage de base\n\nPour créer une image web, vous devez utiliser l’image \" ``php:apache`` \"\n\n-\tMainteneur\n\nN'oubliez pas de préciser les informations du responsable. C’est une bonne pratique. \n\n-\tVariable d’environnement\n\nAfin de permettre au conteneur web de se connecter à la base de données avec les identifiants corrects vous fournirez en variable d’environnement les informations ``USERNAME`` et ``PASSWORD``. \n\n-\tVolume \n\nAfin d’éviter que l'image ``php:apache`` ne soit exécutée avec le site Web par défaut, le fichiers du site web doivent être déposés dans le répertoire ``/var/www/html``.\n-\tPort web\n\nN'oubliez pas d'exposer le port d’écoute de votre serveur web \" ``php:apache`` \"\n\n-\tFaites le build de votre image \n\nNom de l’image : web-student_list \n\ntag: 1.0\n\n-\tRéseau\n\nN’oubliez pas de place le web dans le même réseau que l’API. Il s’agit en effet du réseau de type bridge appelé ``my-network`` crée précédemment. \n\n-\tFaites le run de votre image \n\nVérifiez que le conteneur est à l’écoute et est prêt à répondre. Lors du run de votre image, pensez bien à préciser le réseau dans lequel votre api sera déployée et aussi à mapper les ports.  \n\n***Enfin, accédez à votre site Web et cliquez sur le bouton  \"List Student\"\nSi la liste des élèves apparaît, vous avez réalisé avec succès l'application POZOS ! Félicitations (faites une capture d'écran)***\n\n\n","size":26,"stargazers_count":1,"topics":[],"updated_at":"2024-09-14T17:08:57Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":45,"contributors_count":0,"created_at":"2019-11-23T15:08:25Z","default_branch":"master","description":"Repository of Doctor Moderation, a super cool moderation bot for Discord !","fork":true,"forks_count":0,"full_name":"Ayfri/doctor_moderation","homepage":"","html_url":"https://github.com/Ayfri/doctor_moderation","id":223607548,"is_template":false,"language":null,"name":"doctor_moderation","open_issues_count":4,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-19T17:36:50Z","readme_content":"# Doctor Moderation\n\nDoctor Modération is a French bot to moderate the server [Les Laboratoires JS](https://discord.gg/3vC2XWK) on Discord.\n\n# Features\n\n- [x] Ban command\n- [x] Kick command\n- [x] Warn command\n- [ ] Delmod commmand\n- [ ] Mute command\n- [x] Mod_see command\n- [x] Ping command\n- [x] Help command\n- [ ] Clear command\n    - [ ] Specific user\n    - [ ] From users\n    - [ ] From bots\n    - [ ] Before / after\n    - [ ] Regex\n    - [ ] Include\n    - [ ] Image\n    - [ ] Embed\n    \n\n\n- [ ] Anti Spam/Flood\n- [ ] Anti SelfBot\n- [x] Server Stats\n    - [x] Member Count\n    - [x] Bot Count\n\n- [ ] Server Logs\n    - [ ] Message delete\n    - [ ] Message update\n    - [ ] Role create\n    - [ ] Role update\n    - [ ] Role delete\n    - [ ] Channel create\n    - [ ] Channel update\n    - [ ] Channel delete\n    - [ ] Invite create\n\n- [ ] Mod logs\n    - [x] Warn add\n    - [ ] Warn remove\n    - [x] Ban\n    - [x] Unban\n    - [x] Kick\n    - [ ] Mute\n    - [x] Unmute\n    - [ ] Mod_see\n    \n# How to install\n\nInstalling DoctorModeration is very easy !\n\nFirst, `git clone https://github.com/loockeeer/doctor_moderation`\n\n\nThen, create a file in `src` called `token.json` with your token in a string (`\"TOKEN\"`)\n\nYou'll need to install PostgreSQL and then to pipe `database.sql` into it.\n\nTODO : DataBase API (other repository)\n","size":131,"stargazers_count":1,"topics":[],"updated_at":"2020-08-24T22:09:15Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":21,"contributors_count":2,"created_at":"2025-01-20T08:42:27Z","default_branch":"master","description":"Le hackaton en m1.","fork":false,"forks_count":0,"full_name":"Ayfri/hackaton-m1","homepage":null,"html_url":"https://github.com/Ayfri/hackaton-m1","id":919356385,"is_template":false,"language":"TypeScript","name":"hackaton-m1","open_issues_count":2,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2025-04-15T00:08:57Z","readme_content":"# Svelte + TS + Vite\n\nThis template should help get you started developing with Svelte and TypeScript in Vite.\n\n## Recommended IDE Setup\n\n[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode).\n\n## Need an official Svelte framework?\n\nCheck out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more.\n\n## Technical considerations\n\n**Why use this over SvelteKit?**\n\n- It brings its own routing solution which might not be preferable for some users.\n- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app.\n\nThis template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project.\n\nShould you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate.\n\n**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?**\n\nSetting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information.\n\n**Why include `.vscode/extensions.json`?**\n\nOther templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project.\n\n**Why enable `allowJs` in the TS template?**\n\nWhile `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant.\n\n**Why is HMR not preserving my local component state?**\n\nHMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr).\n\nIf you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR.\n\n```ts\n// store.ts\n// An extremely simple external store\nimport { writable } from 'svelte/store'\nexport default writable(0)\n```\n","size":228,"stargazers_count":0,"topics":[],"updated_at":"2025-01-21T14:52:36Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":19,"contributors_count":0,"created_at":"2021-11-24T13:01:47Z","default_branch":"master","description":"A hangman game made in go.","fork":false,"forks_count":0,"full_name":"Ayfri/hangman-classic","homepage":null,"html_url":"https://github.com/Ayfri/hangman-classic","id":431486509,"is_template":false,"language":"Go","name":"hangman-classic","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-12-09T13:15:41Z","readme_content":"# hangman-classic\nA hangman game made in go.\n","size":23,"stargazers_count":1,"topics":[],"updated_at":"2021-12-09T13:15:44Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":1463,"contributors_count":353,"created_at":"2020-12-06T22:37:43Z","default_branch":"master","description":"Hello world in every computer language.  Thanks to everyone who contributes to this, make sure to see CONTRIBUTING.md for contribution instructions!","fork":true,"forks_count":0,"full_name":"Ayfri/hello-world","homepage":"http://github.com/leachim6/hello-world/wikis","html_url":"https://github.com/Ayfri/hello-world","id":319146316,"is_template":false,"language":"Assembly","name":"hello-world","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2020-12-11T16:35:58Z","readme_content":"# Hello World\n\nHello world in every computer language.\n\nAs I watch the collection expand, this project has blown up more than I ever thought possible.\nThanks to everyone who continues to contribute; new languages are created every day!\n\nMake sure to see [contributing.md](/contributing.md) for instructions on contributing to the project!\n\n<!--Languages start-->\n## Languages (716 total)\n\n* [05Ab1E](%23/05AB1E)\n* [0815](%23/0815.0815)\n* [1C Enterprise](%23/1c-enterprise)\n* [256](%23/256.256)\n* [2B](%23/2B.2b)\n* [420](%23/420.420)\n* [4Gl](%23/4gl.4gl)\n* [4Test](%23/4test)\n* [4Thdimension](%23/4thdimension.4dd)\n* [8Th](%23/8th)\n* [~Bengali](%23/~Bengali.ext)\n* [~English](%23/~English.ext)\n* [~Finnish](%23/~Finnish.ext)\n* [~Gujarati](%23/~Gujarati.ext)\n* [~Hausa](%23/~Hausa.ext)\n* [~Hebrew](%23/~Hebrew.ext)\n* [~Hindi](%23/~Hindi.ext)\n* [~Indonesia](%23/~Indonesia.ext)\n* [~Italian](%23/~Italian.ext)\n* [~Javanese](%23/~Javanese.ext)\n* [~Kannada](%23/~Kannada.ext)\n* [~Malay](%23/~Malay.ext)\n* [~Malayalam](%23/~Malayalam.ext)\n* [~Marathi](%23/~Marathi.ext)\n* [~Odia](%23/~Odia.ext)\n* [~Sanskrit](%23/~Sanskrit.ext)\n* [~Serbian](%23/~Serbian.ext)\n* [~Tamil](%23/~Tamil.ext)\n* [~Telugu](%23/~Telugu.ext)\n* [~Thai](%23/~Thai.ext)\n* [~Turkish](%23/~Turkish.ext)\n* [~Ukrainian](%23/~Ukrainian.ext)\n* [~Urdu](%23/~Urdu.ext)\n* [Μλ](%23/%CE%BC%CE%BB)\n* [قلب](%23/%D9%82%D9%84%D8%A8)\n* [なでしこ](%23/%E3%81%AA%E3%81%A7%E3%81%97%E3%81%93.nako)\n* [ひまわり](%23/%E3%81%B2%E3%81%BE%E3%82%8F%E3%82%8A.hmw)\n* [文言](%23/%E6%96%87%E8%A8%80.wy)\n* [易语言](%23/%E6%98%93%E8%AF%AD%E8%A8%80.e)\n* [A++](a/a%2B%2B)\n* [Abap](a/abap.abap)\n* [Abc](a/abc.abc)\n* [Acidic](a/ACIDIC.acidic)\n* [Acpi](a/acpi)\n* [Acronym](a/ACRONYM.acronym)\n* [Acs](a/acs.acs)\n* [Actionscript](a/actionscript.as)\n* [Actionscript2](a/actionscript2.as)\n* [Actionscript3](a/actionscript3.as)\n* [Actionscript Flashmx](a/actionscript_flashmx.as)\n* [Ada](a/ada.adb)\n* [Advpl](a/advpl)\n* [Aeolbonn](a/Aeolbonn.aeo)\n* [Aeolbonn](a/aeolbonn.aeolbonn)\n* [Agda](a/agda.agda)\n* [Aheui](a/aheui.aheui)\n* [Aime](a/aime.aime)\n* [Aiml](a/aiml.aiml)\n* [Alaguf](a/ALAGUF.alaguf)\n* [Alda](a/alda.alda)\n* [Algae](a/algae.algae)\n* [Algol W](a/ALGOL-W.algol)\n* [Algol60](a/algol60.algol60)\n* [Algol68](a/algol68.algol68)\n* [Alore](a/alore.alore)\n* [Alphabet](a/AlPhAbEt.abc)\n* [Amiga E](a/Amiga-E.amiga-e)\n* [Amos](a/amos)\n* [Android](a/android.java)\n* [Angelscript](a/angelscript)\n* [Angular](a/angular.js)\n* [Ante](a/ante.ante)\n* [Antlang](a/AntLang.ant)\n* [Apc](a/apc.apc)\n* [Apex](a/Apex.cls)\n* [Apl](a/apl.apl)\n* [Applescript](a/applescript.scpt)\n* [Applesoft Basic](a/applesoft_basic)\n* [Arc](a/arc.arc)\n* [Arduino](a/arduino.ino)\n* [Arena](a/arena.are)\n* [Argh](a/argh.agh)\n* [Arkscript](a/ArkScript.ark)\n* [Arnoldc](a/arnoldc.arnoldc)\n* [Asciidots](a/asciidots.ascii)\n* [Ash](a/ash.ash)\n* [Asm2Bf](a/asm2bf.asm)\n* [Asp](a/asp.asp)\n* [Aspectj](a/aspectj.aj)\n* [Assember Hp 85](a/assember-hp-85.asm)\n* [Assembler 6502](a/assembler_6502.asm)\n* [Assembler 6502Appleii](a/assembler_6502appleII.asm)\n* [Assembler 6502C64](a/assembler_6502c64.asm)\n* [Assembler 6809Vectrex](a/assembler_6809vectrex.asm)\n* [Assembler 8048 Videopac](a/assembler_8048_videopac.asm)\n* [Assembler Arm](a/assembler_arm.s)\n* [Assembler Atari2600](a/assembler_atari2600.asm)\n* [Assembler Bootsect](a/assembler_bootsect.asm)\n* [Assembler Dcpu16](a/assembler_DCPU16.asm)\n* [Assembler Fasm Dos](a/assembler_fasm_dos.asm)\n* [Assembler Hla](a/assembler_hla.hla)\n* [Assembler Ibm360](a/assembler_ibm360.asm)\n* [Assembler Intel](a/assembler_intel.asm)\n* [Assembler Lc 3](a/assembler_lc-3.asm)\n* [Assembler M68000 Amigaos](a/assembler_m68000_amigaos.asm)\n* [Assembler Masm Dos](a/assembler_masm_dos.asm)\n* [Assembler Masm Win32](a/assembler_masm_win32.asm)\n* [Assembler Masm Win64](a/assembler_masm_win64.asm)\n* [Assembler Mips](a/assembler_mips.asm)\n* [Assembler Mmix](a/assembler_mmix.asm)\n* [Assembler Nasm Freebsd](a/assembler_nasm_freebsd.asm)\n* [Assembler Nasm Linux](a/assembler_nasm_linux.asm)\n* [Assembler Nasm Linux64](a/assembler_nasm_linux64.asm)\n* [Assembler Nasm Macho64](a/assembler_nasm_macho64.asm)\n* [Assembler Nasm Win32](a/assembler_nasm_win32.asm)\n* [Assembler Pdp10 Midas](a/assembler_pdp10_midas.mid)\n* [Assembler Pdp11 Palx](a/assembler_pdp11_palx.palx)\n* [Assembler Tasm Dos](a/assembler_tasm_dos.asm)\n* [Assembler Tms9900 Ti99 4A](a/assembler_tms9900_ti99_4a.asm)\n* [Assembler Vax Ultrix](a/assembler_vax_ultrix.asm)\n* [Assembler Z80 Knightos](a/assembler_z80_knightos.asm)\n* [Assembler Z80 Ti83Calculator](a/assembler_z80_ti83calculator.asm)\n* [Assembler Z80 Zxspectrum](a/assembler_z80_zxspectrum.asm)\n* [Ats2](a/ATS2.dats)\n* [Attache](a/Attache.%40)\n* [Autohotkey](a/autohotkey.ahk)\n* [Autoit](a/autoit.au3)\n* [Avisynth](a/avisynth.avs)\n* [Awful](a/awful.yuk)\n* [Awk](a/awk.awk)\n* [B](b/B.b)\n* [Baik](b/BAIK.ina)\n* [Ballerina](b/ballerina.bal)\n* [Bash](b/bash.bash)\n* [Basic 256](b/basic-256.kbs)\n* [Basic](b/basic.bas)\n* [Batch](b/batch.bat)\n* [Batch](b/batch.cmd)\n* [Batsh](b/batsh.batsh)\n* [Battlestar](b/battlestar.bts)\n* [Bc Gnu](b/bc-gnu.bc)\n* [Bc](b/bc.bc)\n* [Bcpl](b/BCPL.bcl)\n* [Beanshell](b/Beanshell.bsh)\n* [Beatnik](b/beatnik.beatnik)\n* [Beef](b/beef.bf)\n* [Befunge](b/befunge.be)\n* [Bennugd](b/BennuGD)\n* [Beta](b/beta.bet)\n* [Binaryfuck](b/binaryfuck.bf)\n* [Birl](b/BIRL.c)\n* [Bit](b/BIT.bit)\n* [Bitbitjump](b/BitBitJump.bbj)\n* [Bitsbox](b/bitsbox.b)\n* [Blackrum](b/BlackRum.br)\n* [Blc](b/BLC.Blc)\n* [Blitz3D](b/blitz3d.bb)\n* [Bloop](b/bloop.bloop)\n* [Blub](b/blub.blub)\n* [Bolgefuck](b/bolgefuck.bf)\n* [Boo](b/boo.boo)\n* [Boolfuck](b/boolfuck)\n* [Bosque](b/bosque.bsq)\n* [Brainfuck 2D](b/brainfuck-2d.bf2d)\n* [Brainfuck](b/brainfuck.bf)\n* [Brainloller](b/Brainloller.png)\n* [Broccoli](b/broccoli.brocc)\n* [Brzrk](b/BRZRK.brzrk)\n* [Burlesque](b/burlesque.burlesque)\n* [Byter](b/byter.byter)\n* [C++](c/c%2B%2B.cpp)\n* [C](c/c.c)\n* [Caml](c/caml.ml)\n* [Cardinal](c/cardinal.cardinal)\n* [Casio Basic](c/Casio%20BASIC)\n* [Cat](c/cat.cat)\n* [Cbot](c/cbot.txt)\n* [Cduce](c/cduce.cduce)\n* [Centura](c/centura.centura)\n* [Ceylon](c/ceylon.ceylon)\n* [Cgi](c/cgi.c)\n* [Chapel](c/chapel.chpl)\n* [Cheddar](c/cheddar.cheddar)\n* [Chef](c/chef.ch)\n* [Chicken](c/chicken.chicken)\n* [Cil](c/cil.il)\n* [Clean](c/clean.icl)\n* [Clipper](c/clipper.cli)\n* [Clipper](c/clipper.clipper)\n* [Clipper](c/clipper.prg)\n* [Clips](c/clips.clips)\n* [Clisp](c/clisp.lisp)\n* [Clojure](c/clojure.clj)\n* [Cobol](c/cobol.cbl)\n* [Cobra](c/cobra.cobra)\n* [Coconut](c/coconut.coc)\n* [Coffeescript](c/coffeescript.coffee)\n* [Coldfusion](c/coldfusion.cfm)\n* [Common Lisp](c/common-lisp.lisp)\n* [Concurnas](c/concurnas.conc)\n* [Continuesequation](c/ContinuesEquation.ce)\n* [Control Language](c/control-language.cllc)\n* [Cool](c/cool.cl)\n* [Cor](c/cor.cor)\n* [Cow](c/cow.cow)\n* [Crystal](c/crystal.cr)\n* [Csh](c/csh.csh)\n* [Csharp](c/csharp.cs)\n* [Cson](c/cson.cson)\n* [Css](c/css.css)\n* [Cuda](c/cuda.cu)\n* [Cuneiform](c/cuneiform.cfl)\n* [Curry](c/curry.curry)\n* [Cypherneo4J](c/cypherNeo4j.cypher)\n* [D](d/d.d)\n* [Dark](d/dark.txt)\n* [Dart](d/Dart.dart)\n* [Darwin](d/Darwin.drw)\n* [Db2](d/db2.sql)\n* [Dbase](d/dBase.dbf)\n* [Dc](d/dc.dc)\n* [Dcl](d/DCL)\n* [Dd Dd](d/dd_dd.dd)\n* [Decimal](d/Decimal.dec)\n* [Delphi](d/delphi.delphi)\n* [Delphi](d/delphi.pas)\n* [Deno](d/deno.ts)\n* [Desmos](d/desmos.desmos)\n* [Dis](d/dis.dis)\n* [Divzeros](d/divzeros.dz)\n* [Dna#](d/DNA%23.dna)\n* [Dna Sharp](d/DNA-Sharp.dna)\n* [Dogescript](d/dogescript.djs)\n* [Dogo](d/DOGO.dogo)\n* [Dongbei](d/dongbei.dongbei)\n* [Dos](d/dos.bat)\n* [Draco](d/draco.d)\n* [Dreammaker](d/dreammaker.dm)\n* [Drive In Window](d/Drive-In%20Window.diw)\n* [Dtrace](d/dtrace.d)\n* [Dup](d/DUP.dup)\n* [Dylan](d/dylan.dl)\n* [Dyvil](d/Dyvil.dyv)\n* [E](e/E.e)\n* [E62Qpodb593](e/e62qpodb593)\n* [Ebuild](e/ebuild.ebuild)\n* [Ec](e/ec.ec)\n* [Echolisp](e/echolisp.echolisp)\n* [Efene](e/efene.efene)\n* [Egl](e/egl.egl)\n* [Eiffel](e/Eiffel.eiff)\n* [Elena](e/elena.elena)\n* [Elixir](e/elixir.ex)\n* [Elixir](e/elixir.exs)\n* [Elm](e/elm.elm)\n* [Emacslisp](e/EmacsLisp.el)\n* [Emmental](e/emmental.emmental)\n* [Emojicode](e/emojicode.emojic)\n* [Emoticon](e/emoticon.emoticon)\n* [Enkelt](e/enkelt.e)\n* [Eoool](e/EOOOL.eoool)\n* [Erlang](e/erlang.erl)\n* [Erlang Escript](e/erlang_escript.erl)\n* [Euphoria](e/euphoria.ex)\n* [Express](e/express.js)\n* [F](f/F.f95)\n* [Factor](f/factor.factor)\n* [Factors](f/factors.fact)\n* [Falcon](f/falcon.fal)\n* [False](f/false.f)\n* [Fancy](f/fancy.fy)\n* [Fantom](f/fantom.fan)\n* [Fennel](f/fennel.fnl)\n* [Ferite](f/ferite.fe)\n* [Fetlang](f/fetlang.fet)\n* [Fim++](f/fim%2B%2B.fimpp)\n* [Fish](f/fish.fish)\n* [Fjoelnir](f/fjoelnir.fjo)\n* [Flascript](f/flascript.fls)\n* [Flask](f/flask.py)\n* [Flutter](f/flutter.dart)\n* [Fob](f/fob.fob)\n* [Focal](f/focal.fc)\n* [Fog.Fog](f/fog.fog.md)\n* [Foo](f/foo.foo)\n* [Forobj](f/forobj.forobj)\n* [Forth](f/forth.fth)\n* [Fortob](f/fortob.fortob)\n* [Fortran](f/fortran.f90)\n* [Fortran77](f/fortran77.f77)\n* [Fourier](f/fourier.fourier)\n* [Foxpro](f/FoxPro.prg)\n* [Fractran++](f/fractran%2B%2B.fpp)\n* [Freebrain](f/freebrain.frbr)\n* [Frink](f/frink.frink)\n* [Fsharp](f/fsharp.fs)\n* [Fstar](f/fstar.fst)\n* [Gaml](g/GAML.gaml)\n* [Gammaplex](g/gammaplex.gammaplex)\n* [Gasoil](g/GASOIL.gasoil)\n* [Gdscript](g/gdscript.gd)\n* [Gecho](g/gecho.gecho)\n* [Gentzen](g/gentzen.gentzen)\n* [Geojson](g/geojson.geojson)\n* [Gibberish](g/gibberish.gibberish)\n* [Glass](g/glass.glass)\n* [Gml](g/gml.gml)\n* [Go](g/go.go)\n* [Golfscript](g/golfscript.golfscript)\n* [Golo](g/golo.golo)\n* [Googleappscript](g/googleappscript.gs)\n* [Gosu](g/gosu.gosu)\n* [Gosu](g/gosu.gs)\n* [Graphql](g/graphql.graphql)\n* [Gravity](g/gravity.gravity)\n* [Green Marl](g/Green-Marl.gm)\n* [Gri](g/gri.gri)\n* [Gridscript](g/GridScript.gridscript)\n* [Grin](g/grin.grin)\n* [Groovy](g/groovy.groovy)\n* [Gui4Cli](g/Gui4Cli)\n* [Hack](h/hack.hh)\n* [Haml](h/haml.haml)\n* [Haskell](h/haskell.hs)\n* [Haxe](h/haxe.hx)\n* [Hello](h/hello)\n* [Hello++](h/hello%2B%2B)\n* [Hex](h/HEX.hex)\n* [Hexish](h/hexish.hexish)\n* [Higher Subleq](h/Higher%20Subleq.higher_subleq)\n* [Hodor](h/hodor.hd)\n* [Hollow](h/hollow.hollow)\n* [Holyc](h/holyc.HC)\n* [Homespring](h/homespring.homespring)\n* [Hop](h/HOP)\n* [Hq9+](h/hq9%2B.h)\n* [Html](h/html.html)\n* [Hubot](h/hubot.coffee)\n* [Huf](h/huf.huf)\n* [Hy](h/hy.hy)\n* [Hypertalk](h/hypertalk.ht)\n* [I5](i/i5.i5)\n* [Ibm1401](i/ibm1401)\n* [Icedcoffeescript](i/IcedCoffeeScript.ics)\n* [Ici](i/ici.ici)\n* [Icon](i/icon.icn)\n* [Idl](i/IDL)\n* [Idris](i/idris.idr)\n* [Il](i/il.il)\n* [Incal](i/INCAL.incal)\n* [Indec](i/InDec.indec)\n* [Inform](i/inform.inform)\n* [Ink](i/ink.ink)\n* [Inkling](i/inkling.ink)\n* [Intercal](i/intercal.i)\n* [Io](i/Io.Io)\n* [Ioke](i/ioke.ik)\n* [Irc](i/irc)\n* [Iscom](i/iscom.iscom)\n* [Islisp](i/ISLISP.lisp)\n* [J](j/j.ijs)\n* [Jade](j/jade.jade)\n* [Jai](j/jai.jai)\n* [Jasmin](j/Jasmin.j)\n* [Jason](j/jason.mas2j)\n* [Java](j/Java.java)\n* [Javascript](j/javascript.js)\n* [Jess](j/jess.cpl)\n* [Jsfuck](j/jsfuck.js)\n* [Json](j/json.json)\n* [Jsoniq](j/JSONiq)\n* [Jsx](j/jsx.js)\n* [Judoscript](j/judoscript)\n* [Julia](j/julia.jl)\n* [Jython](j/jython.py)\n* [K](k/k.k)\n* [Karel](k/karel.kl)\n* [Kiml](k/KimL.kiml)\n* [Kipple](k/kipple.kipple)\n* [Kitten](k/kitten.ktn)\n* [Koberi C](k/koberi-c.koberice)\n* [Kotlin](k/kotlin.kt)\n* [Ksh](k/ksh.ksh)\n* [Labyrinth](l/labyrinth.labyrinth)\n* [Lassoscript](l/lassoscript.lasso)\n* [Latex](l/LaTeX.tex)\n* [Lazyk](l/LazyK.lazy)\n* [Lbl](l/LBL.lbl)\n* [Lcoffee](l/lcoffee.lcoff)\n* [Less](l/less.less)\n* [Leszek](l/leszek.leszek)\n* [Limbo](l/limbo.b)\n* [Lingo](l/lingo.lg4)\n* [Lisaac](l/lisaac.li)\n* [Lisp](l/lisp.lsp)\n* [Livescript](l/livescript.ls)\n* [Llvm](l/llvm.ll)\n* [Lnusp](l/LNUSP.lnusp)\n* [Locomotive Basic](l/locomotive-basic.b)\n* [Logicode](l/logicode.lgc)\n* [Logo](l/logo.lg)\n* [Logtalk](l/logtalk.lgt)\n* [Lola](l/LOLA.lola)\n* [Lolcode](l/lolcode.lol)\n* [Lolpython](l/lolpython.lol)\n* [Lotusscript](l/lotusscript.lss)\n* [Lsl](l/lsl.lsl)\n* [Lua](l/lua.lua)\n* [Lua Grimex](l/lua_grimex.j)\n* [Lwc](l/lwc.html)\n* [Löve](l/L%C3%B6ve.lua)\n* [M4](m/m4.m4)\n* [Maclisp](m/maclisp.lisp)\n* [Macsyma](m/macsyma.mac)\n* [Magic](m/magic)\n* [Make](m/make.makefile)\n* [Malbolge](m/malbolge.mbg)\n* [Mariolang](m/mariolang)\n* [Markdown](m/markdown.md)\n* [Mathematica Online](m/mathematica-online.nb)\n* [Matlab](m/matlab.m)\n* [Matlab1.0](m/matlab1.0.m)\n* [Maxscript](m/maxscript.ms)\n* [Mel](m/mel.mel)\n* [Meq](m/meq.meq)\n* [Mercury](m/mercury.m)\n* [Milkscript](m/milkscript.milk)\n* [Minecraft](m/minecraft)\n* [Mips](m/mips.s)\n* [Mirc](m/mirc.mrc)\n* [Mmmm()](m/Mmmm%28%29.mmmm)\n* [Modiscript](m/modiscript.chai)\n* [Modula 2](m/modula-2.mod)\n* [Modula 3](m/modula-3.m3)\n* [Mongo](m/mongo.shell)\n* [Monte](m/monte.mt)\n* [Moo](m/moo.moo)\n* [Moonscript](m/moonscript.moon)\n* [Morsecode](m/morsecode)\n* [Mouse](m/mouse.mse)\n* [Move](m/move.mv)\n* [Mozart](m/mozart.oz)\n* [Muf](m/muf.muf)\n* [Mumps](m/mumps.m)\n* [Mushcode](m/mushcode.mush)\n* [Myrddin](m/myrddin.myr)\n* [Mysql](m/mysql.sql)\n* [Mathematica](n/mathematica.nb)\n* [Nadeshiko](n/nadeshiko.fjo)\n* [Neko](n/neko.neko)\n* [Nemerle](n/nemerle.n)\n* [Newtonscript](n/newtonscript.nwt)\n* [Nial](n/nial.ndf)\n* [Nice](n/nice.nice)\n* [Night](n/Night.night)\n* [Nim](n/nim.nim)\n* [Nit](n/nit.nit)\n* [Nodejs](n/nodejs.js)\n* [Novice](n/novice.novice)\n* [Nu](n/nu.nu)\n* [Nwscript](n/nwscript.nss)\n* [Nxc](n/nxc.nxc)\n* [Oberon 2](o/oberon-2.obn)\n* [Oberon](o/oberon.o)\n* [Obix](o/obix.osc)\n* [Obj](o/obj.st)\n* [Object Pascal](o/object-pascal.pp)\n* [Objective C](o/objective-c.m)\n* [Objective J](o/objective-j.j)\n* [Objectstar](o/ObjectStar)\n* [Ocaml](o/ocaml.ml)\n* [Octave](o/Octave.m)\n* [Omgrofl](o/omgrofl.omgrofl)\n* [Ooc](o/ooc.ooc)\n* [Ook](o/ook.ok)\n* [Opa](o/opa.opa)\n* [Openlaszlo](o/OpenLaszlo.lzx)\n* [Oraclesql](o/oraclesql.sql)\n* [Orc](o/Orc.orc)\n* [Oz](o/oz.oz)\n* [Parenthetic](p/parenthetic.p)\n* [Parser](p/parser.p)\n* [Pascal](p/pascal.p)\n* [Pauscal](p/pauscal.pdp)\n* [Pawn](p/pawn.p)\n* [Pb](p/pb.pwr)\n* [Pbwin](p/pbwin.bas)\n* [Pebble](p/pebble.c)\n* [Perl](p/perl.cgi)\n* [Perl](p/perl.pl)\n* [Perl6](p/perl6.p6)\n* [Perseus](p/perseus.p%2B%2B)\n* [Pharo](p/pharo.st)\n* [Php](p/php.php)\n* [Picat](p/picat.pi)\n* [Piet](p/piet.png)\n* [Pig](p/pig.pig)\n* [Pikalang](p/pikalang.pokeball)\n* [Pike](p/pike.pike)\n* [Pit](p/pit.pit)\n* [Pizza](p/pizza.pizza)\n* [Please Porige Hot](p/please-porige-hot.pph)\n* [Pli](p/PLI.pl1)\n* [Plsql](p/plsql.sql)\n* [Pluvo](p/pluvo.pvo)\n* [Polynomial](p/polynomial.pol)\n* [Pony](p/pony.pony)\n* [Portugol](p/portugol.por)\n* [Postcss](p/postcss.pcss)\n* [Postgresql](p/postgresql.sql)\n* [Postscript](p/postscript.ps)\n* [Postscript Page](p/postscript_page.ps)\n* [Posxml](p/posxml.posxml)\n* [Potaka](p/potaka.ptk)\n* [Potigol](p/potigol.poti)\n* [Powershell](p/powershell.ps1)\n* [Processing](p/processing.pde)\n* [Profan](p/profan)\n* [Prolog](p/prolog.pro)\n* [Promela](p/promela.pml)\n* [Providex](p/providex.vim)\n* [Pug](p/pug.pug)\n* [Pure Data](p/pure_data.pd)\n* [Purebasic](p/purebasic.pb)\n* [Purescript](p/purescript.purs)\n* [Pyret](p/pyret.arr)\n* [Python](p/python.py)\n* [Python3](p/python3.py)\n* [Q](q/q.q)\n* [Qbasic](q/Qbasic.bas)\n* [Qcl](q/qcl.qcl)\n* [Qore](q/qore.q)\n* [Qsharp](q/qsharp.qs)\n* [Qu](q/qu.qu)\n* [Quakec](q/QuakeC.qc)\n* [Quartzcomposer](q/QuartzComposer.qtz)\n* [Qugord](q/qugord.qugord)\n* [Quorum](q/quorum.quorum)\n* [Qwerty](q/qwerty.qwerty)\n* [R](r/R.R)\n* [Racket](r/racket.rkt)\n* [Radixal](r/radixal.radixal)\n* [Ratfor](r/ratfor.ratfor)\n* [React](r/react.js)\n* [React360](r/react360.js)\n* [Readlink](r/readlink.readlink)\n* [Realbasic](r/realbasic.realbasic)\n* [Reason](r/reason.re)\n* [Rebol](r/rebol.r)\n* [Rebol](r/rebol.reb)\n* [Recurse](r/recurse.recurse)\n* [Red](r/Red.red)\n* [Redis](r/redis)\n* [Refal](r/refal.ref)\n* [Restructuredtext](r/reStructuredText.rst)\n* [Retro](r/retro.retro)\n* [Rexx](r/rexx.rexx)\n* [Richtea](r/richtea.tea)\n* [Ride](r/ride.ride)\n* [Ring](r/ring.ring)\n* [Rivescript](r/rivescript.rive)\n* [Rockstar](r/rockstar.rock)\n* [Roco](r/roco.roco)\n* [Roy](r/roy.roy)\n* [Rpg Iv](r/RPG-IV.rpgle)\n* [Rpg](r/rpg.rpgle)\n* [Rtl2](r/rtl2.rtl2)\n* [Ruby](r/ruby.rb)\n* [Ruota](r/ruota.ruo)\n* [Rust](r/rust.rs)\n* [S Algol](s/S-algol)\n* [Sacred](s/sacred.sacred)\n* [Sal](s/sal.s)\n* [Sas](s/sas.sas)\n* [Sass](s/sass.sass)\n* [Sather](s/sather.sa)\n* [Scala](s/scala.scala)\n* [Scheme](s/scheme.scm)\n* [Schwift](s/schwift.y)\n* [Scilab](s/scilab.scilab)\n* [Scratch](s/scratch.sb)\n* [Scratch](s/scratch.sb3)\n* [Scratch1](s/scratch1.sb)\n* [Scratch2](s/scratch2.sb2)\n* [Scss](s/Scss.scss)\n* [Sed](s/sed.sed)\n* [Seed](s/seed)\n* [Seed7](s/seed7.s7)\n* [Self](s/self.self)\n* [Semicolon](s/semicolon)\n* [Sendstuff](s/SendStuff.ss)\n* [Setanta](s/Setanta.set)\n* [Shakespeare](s/shakespeare.spl)\n* [Shell](s/shell.sh)\n* [Shen](s/shen.shen)\n* [Sidekiq](s/sidekiq.sidekiq)\n* [Sil](s/SIL.SIL)\n* [Simpl+](s/simpl%2B.usp)\n* [Simula](s/simula.sim)\n* [Skip](s/skip.sk)\n* [Skript](s/Skript.sk)\n* [Slashes](s/slashes.slashes)\n* [Slim](s/slim.slim)\n* [Smali](s/smali.smali)\n* [Smalltalk Gnu](s/smalltalk-gnu.st)\n* [Smalltalk](s/smalltalk.sm)\n* [Smil](s/smil.smil)\n* [Sml](s/sml.sml)\n* [Snowman](s/snowman.sm)\n* [Solidity](s/Solidity.sol)\n* [Soupscript](s/soupscript.script)\n* [Sparql](s/sparql.sparql)\n* [Spoon](s/spoon.spoon)\n* [Spss](s/spss.spss)\n* [Sql](s/sql.sql)\n* [Squirrel](s/squirrel.nut)\n* [Standard Ml](s/standard-ml.sml)\n* [Stanza](s/stanza.stanza)\n* [Starlark](s/starlark.star)\n* [Streem](s/streem.strm)\n* [Stuck](s/stuck.stuck)\n* [Stuck 0Byte](s/stuck_0byte.stuck)\n* [Stylus](s/stylus.styl)\n* [Subleq](s/subleq.sq)\n* [Supercollider](s/supercollider.sc)\n* [Svelte](s/svelte.svelte)\n* [Svg](s/svg.svg)\n* [Swift](s/swift.swift)\n* [Systemtap](s/systemtap.stp)\n* [上海话](s/%E4%B8%8A%E6%B5%B7%E8%AF%9D.shanghai)\n* [Plain Text](t/plain-text.txt)\n* [Raffalang](t/raffalang.bro)\n* [Tao Presentations](t/Tao-Presentations.ddd)\n* [Tapebagel](t/TapeBagel.tb)\n* [Tcl](t/tcl.tcl)\n* [Tcsh](t/tcsh.tcsh)\n* [Telephone](t/telephone)\n* [Terra](t/terra.t)\n* [Tex](t/TeX.tex)\n* [Thp](t/thp.hrp)\n* [Thue](t/thue.th)\n* [Ti Hexadecimal](t/TI-hexadecimal.hex)\n* [Tibasic](t/tibasic.ti)\n* [Tk](t/tk.tk)\n* [Tri](t/tri.tri)\n* [Trollscript](t/trollscript.troll)\n* [Trumpscript](t/TrumpScript.py)\n* [Tsql](t/tsql.sql)\n* [Ttcn3](t/TTCN3.ttcn)\n* [Turing](t/turing.oot)\n* [Turing](t/Turing.t)\n* [Typescript](t/typescript.ts)\n* [Ubercode](u/Ubercode.cls)\n* [Ubiquity](u/ubiquity.ubiquity)\n* [Umajin](u/umajin.u)\n* [Unicomal](u/unicomal.lst)\n* [Uniface](u/Uniface.uniface)\n* [Unlambda](u/unlambda.unl)\n* [V](v/V)\n* [V](v/v.v)\n* [Vala](v/vala.vala)\n* [Vbnet](v/vbnet.vb)\n* [Velato](v/velato.ly)\n* [Verbose](v/verbose.verbose)\n* [Verbosefuck](v/verbosefuck.vbfk)\n* [Verilog](v/verilog.v)\n* [Verve](v/verve.vrv)\n* [Vhdl](v/vhdl.vhdl)\n* [Vi](v/vi)\n* [Vimscript](v/vimscript.vim)\n* [Virgil](v/virgil.v3)\n* [Visual Basic For Applications](v/visual-basic-for-applications.vba)\n* [Visual Basic Script](v/visual-basic-script.vbs)\n* [Visual Basic](v/visual-basic.vb)\n* [Visualfoxpro](v/visualfoxpro.prg)\n* [Vjass](v/vjass.j)\n* [Vms](v/vms.vms)\n* [Vowels](v/Vowels.vw)\n* [Vrml](v/vrml.wrl)\n* [Vue](v/vue.js)\n* [Wenyan](w/wenyan.wy)\n* [Wheat](w/wheat.wheat)\n* [Whenever](w/whenever.whenever)\n* [Whirl](w/whirl.wr)\n* [Whitespace](w/whitespace.ws)\n* [Wikitext](w/wikitext)\n* [Wml](w/wml.wml)\n* [Wolframlanguage](w/wolframlanguage.wl)\n* [Wren](w/wren.wren)\n* [Wsh](w/wsh.vbs)\n* [X D](x/x-D.xd)\n* [Xbase++](x/xbase%2B%2B.prg)\n* [Xbase](x/xbase.dbf)\n* [Xl](x/xl.xl)\n* [Xlisp](x/xlisp.xlisp)\n* [Xlogo](x/xlogo.lgo)\n* [Xml](x/xml.xml)\n* [Xpl0](x/xpl0.xpl)\n* [Xquery](x/xquery.xq)\n* [Xrf](x/XRF.xrf)\n* [Xslt](x/xslt.xslt)\n* [Xul](x/xul.xul)\n* [Y](y/Y.y)\n* [Yaml](y/yaml.yaml)\n* [Yolang](y/yolang.yo)\n* [Yoptascript](y/yoptascript.js)\n* [Zbd](z/zbd)\n* [Zepto](z/zepto.zp)\n* [Zetaplex](z/zetaplex.zeta)\n* [Zig](z/zig.zig)\n* [Zim](z/zim.zim)\n* [Zimbu](z/zimbu.zu)\n* [Zinc](z/zinc.zn)\n* [Zombie](z/zombie.zombie)\n* [Zonnon](z/zonnon.znn)\n* [Zsh](z/zsh.zsh)\n<!--Languages end-->\n\n## Related\n\n- [FizBuzz](https://github.com/zenware/FizzBuzz)\n- [The Hello World Collection](https://helloworldcollection.github.io/)\n","size":3636,"stargazers_count":0,"topics":[],"updated_at":"2020-12-11T16:35:52Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":41,"contributors_count":0,"created_at":"2026-02-04T09:06:42Z","default_branch":"main","description":"Cloud IA model.","fork":false,"forks_count":0,"full_name":"Ayfri/ia-cloud-1","homepage":null,"html_url":"https://github.com/Ayfri/ia-cloud-1","id":1149567570,"is_template":false,"language":"Python","name":"ia-cloud-1","open_issues_count":4,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-21T22:33:26Z","readme_content":"# House Price Prediction Project\n\nThis project provides a simple machine learning pipeline to predict house prices based on size, number of rooms, and the presence of a garden.\n\n## Features\n- **Model Training**: Linear regression model trained on house data.\n- **FastAPI**: REST API for real-time predictions.\n- **Streamlit**: Web interface for interactive predictions.\n- **Containerization**: Docker and Docker Compose support.\n\n## Getting Started\n\n### Prerequisites\n- Install [UV](https://github.com/astral-sh/uv)\n\n### 1. Installation\nInstall dependencies using UV:\n```bash\nuv sync\n```\n\n### 2. Train the Model\nRun the training script:\n```bash\nuv run train_model.py\n```\n\n### 3. Run the API (FastAPI)\n```bash\nuv run fast_api.py\n```\nThe API will be available at `http://localhost:8000`. You can test the `/predict` endpoint.\n\n### 4. Run the Web App (Streamlit)\n```bash\nuv run streamlit run model_app.py\n```\n\n## Kafka Workflows\n\n### Setup: Create Partitions\nInitialize Kafka partitions for both input and output topics:\n```bash\nuv run -m kafka_exos.create_partitions\n```\nThis creates 2 partitions per topic to enable parallel processing and prevent duplicate message handling.\n\n### Workflow 1: Single Message Production & Consumption\n**Purpose**: Test basic producer-consumer interaction with partition routing.\n\n1. Start consumer (partition 0):\n```bash\nuv run -m kafka_exos.consumer 0\n```\n\n2. Send message:\n```bash\nuv run -m kafka_exos.producer\n```\n\n3. Verify message received on assigned partition.\n\n---\n\n### Workflow 2: ML Model Predictions (Full Pipeline)\n\n**Purpose**: Production ML inference pipeline - predictions should be processed only once across multiple consumers.\n\n#### Step 1: Start Prediction Consumers\nEach consumer handles one partition independently:\n\nTerminal 1 (partition 0):\n```bash\nuv run -m kafka_exos.consumer_predict 0\n```\n\nTerminal 2 (partition 1):\n```bash\nuv run -m kafka_exos.consumer_predict 1\n```\n\n**What they do**:\n- Load ML model at startup\n- Listen on their assigned partition\n- Receive raw input data\n- Run predictions using the trained model\n- Send results to `OUTPUT_TOPIC`\n\n#### Step 2 (Optional): Monitor Predictions\nView prediction results:\n\nTerminal 3 (partition 0):\n```bash\nuv run -m kafka_exos.consumer_view_predictions 0\n```\n\nTerminal 4 (partition 1):\n```bash\nuv run -m kafka_exos.consumer_view_predictions 1\n```\n\n#### Step 3: Send Data for Prediction\nSend multiple messages (they route to random partitions):\n```bash\nuv run -m kafka_exos.producer_multi 5\n```\n\n**Result**:\n- Each message goes to partition 0 or 1 randomly\n- Only the corresponding consumer receives and processes it\n- Predictions are made and sent to `OUTPUT_TOPIC`\n- No duplicate processing even with multiple consumers\n- Enables horizontal scaling of prediction workers\n\n---\n\n## Architecture Overview\n\n```\nProducer (random partition)\n    ↓\nInput Topic [Partition 0, Partition 1]\n    ↓\nConsumer Predict 0 ─→ Load Model ─→ Predict ─→ Output Topic [Partition 0]\nConsumer Predict 1 ─→ Load Model ─→ Predict ─→ Output Topic [Partition 1]\n    ↓\nConsumer View (optional monitoring)\n```\n\n## Docker\nBuild and run the entire stack using Docker Compose:\n```bash\ndocker-compose up --build\n```\n","size":758,"stargazers_count":0,"topics":[],"updated_at":"2026-02-05T12:18:56Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":19,"contributors_count":2,"created_at":"2023-03-02T21:54:53Z","default_branch":"main","description":"A JetBrains plugin that lets you copy the contents of the current file when saving.","fork":false,"forks_count":0,"full_name":"Ayfri/jetbrains-plugin-copy-save","homepage":null,"html_url":"https://github.com/Ayfri/jetbrains-plugin-copy-save","id":608855036,"is_template":false,"language":"Kotlin","name":"jetbrains-plugin-copy-save","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2023-03-03T17:49:35Z","readme_content":"# Copy Current File On Save\n\n![Build](https://github.com/Ayfri/jetbrains-plugin-copy-save/workflows/Build/badge.svg)\n[![Version](https://img.shields.io/jetbrains/plugin/v/io.ayfri.jetbrainsplugincopysave.svg)](https://plugins.jetbrains.com/plugin/io.ayfri.jetbrainsplugincopysave)\n[![Downloads](https://img.shields.io/jetbrains/plugin/d/io.ayfri.jetbrainsplugincopysave.svg)](https://plugins.jetbrains.com/plugin/io.ayfri.jetbrainsplugincopysave)\n\n<!-- Plugin description -->\nThis plugin copies the current file contents on save, it might be useful for some people that needs to permanently copy a script to paste it into another\nprogram, like overwatch mods developers.\n<!-- Plugin description end -->\n\n## Installation\n\n- Using IDE built-in plugin system:\n  \n  <kbd>Settings/Preferences</kbd> > <kbd>Plugins</kbd> > <kbd>Marketplace</kbd> > <kbd>Search for \"Copy Current File On Save\"</kbd> >\n  <kbd>Install Plugin</kbd>\n  \n- Manually:\n\n  Download the [latest release](https://github.com/Ayfri/jetbrains-plugin-copy-save/releases/latest) and install it manually using\n  <kbd>Settings/Preferences</kbd> > <kbd>Plugins</kbd> > <kbd>⚙️</kbd> > <kbd>Install plugin from disk...</kbd>\n\n\n---\nPlugin based on the [IntelliJ Platform Plugin Template][template].\n\n[template]: https://github.com/JetBrains/intellij-platform-plugin-template\n","size":1351,"stargazers_count":1,"topics":[],"updated_at":"2023-03-05T16:10:10Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":1,"contributors_count":0,"created_at":"2020-12-15T18:45:30Z","default_branch":"master","description":"A simple terminal made in kotlin.","fork":false,"forks_count":0,"full_name":"Ayfri/kerminal","homepage":null,"html_url":"https://github.com/Ayfri/kerminal","id":321758528,"is_template":false,"language":null,"name":"kerminal","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2020-12-15T18:45:33Z","readme_content":"# kerminal\nA simple terminal made in kotlin.\n","size":14,"stargazers_count":1,"topics":[],"updated_at":"2020-12-16T02:25:58Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":3610,"contributors_count":28,"created_at":"2026-02-18T12:35:26Z","default_branch":"main","description":"A modern framework for full stack web apps in Kotlin, built upon Compose HTML","fork":true,"forks_count":0,"full_name":"Ayfri/kobweb","homepage":"https://kobweb.varabyte.com","html_url":"https://github.com/Ayfri/kobweb","id":1160837076,"is_template":false,"language":null,"name":"kobweb","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-10T12:52:01Z","readme_content":"[![version: 0.24.0](https://img.shields.io/badge/kobweb-0.24.0-blue)](COMPATIBILITY.md)\n[![version: 0.9.21](https://img.shields.io/badge/kobweb_cli-0.9.21-blue)](https://github.com/varabyte/kobweb-cli)\n<br>\n[![kotlin: 2.3.10](https://img.shields.io/badge/kotlin-2.3.10-blue?logo=kotlin)](COMPATIBILITY.md)\n[![compose: 1.10.2](https://img.shields.io/badge/compose-1.10.2-blue?logo=jetpackcompose)](COMPATIBILITY.md)\n[![ktor: 3.4.0](https://img.shields.io/badge/ktor-3.4.0-blue)](https://ktor.io/)\n<br>\n<a href=\"https://kobweb.varabyte.com/docs\">\n![User Guide docs](https://img.shields.io/badge/User_Guide-royalblue?logo=readthedocs)\n</a>\n<a href=\"https://varabyte.github.io/kobweb/\">\n![API Reference docs](https://img.shields.io/badge/API_Reference-grey?logo=readthedocs)\n</a>\n<br>\n[![Varabyte Discord](https://img.shields.io/discord/886036660767305799.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/5NZ2GKV5Cs)\n[![Kotlin Slack](https://img.shields.io/badge/%23Kobweb-4A154B?logo=slack&logoColor=white)](https://kotlinlang.slack.com/archives/C04RTD72RQ8)\n[![Bluesky](https://img.shields.io/badge/Bluesky-0285FF?logo=bluesky&logoColor=fff)](https://bsky.app/profile/bitspittle.bsky.social)\n\n# K🕸️bweb\n\nKobweb is an opinionated Kotlin framework for creating websites and web apps, built on top of\n[Compose HTML](https://github.com/JetBrains/compose-multiplatform#compose-html) and inspired by [Next.js](https://nextjs.org)\nand [Chakra UI](https://chakra-ui.com).\n\n```kotlin\n@Page\n@Composable\nfun HomePage() {\n  Column(\n    Modifier.fillMaxWidth().whiteSpace(WhiteSpace.PreWrap).textAlign(TextAlign.Center),\n    horizontalAlignment = Alignment.CenterHorizontally\n  ) {\n    var colorMode by ColorMode.currentState\n    Button(\n      onClick = { colorMode = colorMode.opposite },\n      Modifier.borderRadius(50.percent).padding(0.px).align(Alignment.End)\n    ) {\n      // Includes support for Font Awesome icons\n      if (colorMode.isLight) FaMoon() else FaSun()\n    }\n    H1 {\n      Text(\"Welcome to Kobweb!\")\n    }\n    Span {\n      Text(\"Create rich, dynamic web apps with ease, leveraging \")\n      Link(\"https://kotlinlang.org/\", \"Kotlin\")\n      Text(\" and \")\n      Link(\n        \"https://github.com/JetBrains/compose-multiplatform/#compose-html\",\n        \"Compose HTML\"\n      )\n    }\n  }\n}\n```\n\n<p align=\"center\">\n<img src=\"https://github.com/varabyte/media/raw/main/kobweb/screencasts/kobweb-welcome.gif\" />\n</p>\n\n---\n\nWhile Kobweb is still pre-1.0, it has been usable for a while now. It provides escape hatches to lower-level APIs, so\nyou can accomplish anything even if Kobweb doesn't support it yet. Please consider starring the project to indicate\ninterest, so we know we're creating something the community wants.\n[How ready is it?▼](#can-we-kobweb-yet)\n\nOur goal is to provide:\n\n* an intuitive structure for organizing your Kotlin website or web app\n* automatic handling of routing between pages\n* a collection of useful _batteries included_ widgets built on top of Compose HTML\n* an environment built from the ground up around live reloading\n* static site exports for improved SEO\n* support for responsive (i.e. mobile and desktop) design\n* out-of-the-box Markdown support\n* a way to easily define server API routes and persistent API streams\n* support for creating and using web workers\n* a growing collection of general purpose utilities added on top of Compose HTML and Kotlin/JS ([learn more▼](#general-purpose-improvements-on-top-of-compose-html-and-kotlinjs))\n* an open source foundation that the community can extend\n* and much, much more!\n\n📚 You can find a detailed guide at https://kobweb.varabyte.com/docs\n\nYou can\nalso [check out my talk at Droidcon SF 24](https://www.droidcon.com/2024/07/17/kobwebcreating-websites-in-kotlin-leveraging-compose-html/)\nfor a high level overview of Kobweb. The talk showcases what Kobweb can do, introduces Compose HTML (which it builds\non top of), and covers a wide range of frontend and backend functionality. It is light on code but heavy on\nunderstanding the structure and capabilities of the framework.\n\n---\n\n<span id=\"demo\"></span>\nHere's a demo where we create a Compose HTML project from scratch with Markdown support and live reloading, in under\n10 seconds:\n\nhttps://user-images.githubusercontent.com/43705986/135570277-2d67033a-f647-4b04-aac0-88f8992145ef.mp4\n\n## Getting started\n\nThe first step is to get the Kobweb binary. You can install it, download it, and/or build it, so we'll include\ninstructions for all these approaches.\n\n### Install the Kobweb binary\n\n*Major thanks to [aalmiray](https://github.com/aalmiray) and [helpermethod](https://github.com/helpermethod) to helping\nme get these installation options working. Check out [JReleaser](https://github.com/jreleaser/jreleaser) if you ever\nneed to do this in your own project!*\n\n#### [Homebrew](https://brew.sh/)\n\n*OS: Mac and Linux*\n\n```bash\n$ brew install varabyte/tap/kobweb\n```\n\n#### [Scoop](https://scoop.sh/)\n\n*OS: Windows*\n\n```shell\n# Note: Adding buckets only has to be done once.\n\n# Feel free to skip java if you already have it\n> scoop bucket add java\n> scoop install java/openjdk\n\n# Install kobweb\n> scoop bucket add varabyte https://github.com/varabyte/scoop-varabyte.git\n> scoop install varabyte/kobweb\n```\n\n#### [SDKMAN!](https://sdkman.io/)\n\n*OS: Windows, Mac, and \\*nix*\n\n```shell\n$ sdk install kobweb\n```\n\n#### Arch Linux\n\n*Thanks a ton to [aksh1618](https://github.com/aksh1618) for adding support for this target!*\n\nWith an [AUR helper](https://wiki.archlinux.org/title/AUR_helpers), e.g.:\n\n```shell\n$ yay -S kobweb\n$ paru -S kobweb\n$ trizen -S kobweb\n# etc.\n```\n\nWithout an AUR helper:\n\n```shell\n$ git clone https://aur.archlinux.org/kobweb.git\n$ cd kobweb\n$ makepkg -si\n```\n\n#### Don't see your favorite package manager?\n\nPlease see: https://github.com/varabyte/kobweb-cli/issues/11 and consider leaving a comment!\n\n### Download the Kobweb binary\n\nOur binary artifact is hosted on GitHub. To download the latest, you can either\n[grab the zip or tar file from GitHub](https://github.com/varabyte/kobweb-cli/releases/tag/v0.9.21) or you can fetch\nit from your terminal:\n\n```bash\n$ cd /path/to/applications\n\n# You can either pull down the zip file\n\n$ wget https://github.com/varabyte/kobweb-cli/releases/download/v0.9.21/kobweb-0.9.21.zip\n$ unzip kobweb-0.9.21.zip\n\n# ... or the tar file\n\n$ wget https://github.com/varabyte/kobweb-cli/releases/download/v0.9.21/kobweb-0.9.21.tar\n$ tar -xvf kobweb-0.9.21.tar\n```\n\nand I recommend adding it to your path, either directly:\n\n```bash\n$ PATH=$PATH:/path/to/applications/kobweb-0.9.21/bin\n$ kobweb version # to check it's working\n```\n\nor via symbolic link:\n\n```bash\n$ cd /path/to/bin # some folder you've created that's in your PATH\n$ ln -s /path/to/applications/kobweb-0.9.21/bin/kobweb kobweb\n```\n\n### Build the Kobweb binary\n\nAlthough we host Kobweb artifacts on GitHub, it's easy enough to build your own.\n\nBuilding Kobweb requires JDK11 or newer. We'll first discuss how to add it.\n\n#### Download a JDK\n\nIf you want full control over your JDK install, manually downloading is a good option.\n\n* [Download a JDK for your OS](https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html)\n* Unzip it somewhere\n* Update your `JAVA_HOME` variable to point at it.\n\n```bash\nJAVA_HOME=/path/to/jdks/corretto-11.0.12\n# ... or whatever version or path you chose\n```\n\n#### Install a JDK with the IntelliJ IDE\n\nFor a more automated approach, you can request IntelliJ install a JDK for you.\n\nFollow their instructions here: https://www.jetbrains.com/help/idea/sdk.html#set-up-jdk\n\n#### Building the Kobweb CLI\n\nThe Kobweb CLI is actually maintained in a separate GitHub repo. Once you have the JDK set up, it should be easy to\nclone and build it:\n\n```bash\n$ cd /path/to/src/root # some folder you've created for storing src code\n$ git clone https://github.com/varabyte/kobweb-cli\n$ cd kobweb-cli\n$ ./gradlew :kobweb:installDist\n```\n\nFinally, update your PATH:\n\n```bash\n$ PATH=$PATH:/path/to/src/root/kobweb-cli/kobweb/build/install/kobweb/bin\n$ kobweb version # to check it's working\n```\n\n### Update the Kobweb binary\n\nIf you previously installed Kobweb and are aware that a new version is available, the way you update it depends on how\nyou installed it.\n\n| Method                    | Instructions                                                                                                                         |\n|---------------------------|--------------------------------------------------------------------------------------------------------------------------------------|\n| Homebrew                  | `brew update`<br/>`brew upgrade kobweb`                                                                                              |\n| Scoop                     | `scoop update kobweb`                                                                                                                |\n| SDKMAN!                   | `sdk upgrade kobweb`                                                                                                                 |\n| Arch Linux                | Rerunning [install steps](#arch-linux) should work. If using an AUR helper, you may need to review its manual.                       |\n| Downloaded from<br>Github | Visit the [latest release](https://github.com/varabyte/kobweb-cli/releases/tag/v0.9.21). You can find both a zip and tar file there. |\n\n### Create your first Kobweb site\n\n```bash\n$ cd /path/to/projects/\n$ kobweb create app\n```\n\nYou'll be asked a few questions required for setting up your project.\n\nYou don't need to create a root folder for your project ahead of time - the setup process will prompt you for one to\ncreate. For the remaining parts of this section, let's say you choose the folder \"my-project\" when asked.\n\nWhen finished, you'll have a basic project with two pages - a home page and an about page (with the about page written\nin markdown) - and some components (which are collections of reusable, composable pieces). Your own directory structure\nshould look something like this:\n\n```\nmy-project\n└── site/src/jsMain\n    ├── kotlin.org.example.myproject\n    │   ├── components\n    │   │   ├── layouts\n    │   │   │   ├── MarkdownLayout.kt\n    │   │   │   └── PageLayout.kt\n    │   │   ├── sections\n    │   │   │   ├── Footer.kt\n    │   │   │   └── NavHeader.kt\n    │   │   └── widgets\n    │   │       └── IconButton.kt\n    │   ├── pages\n    │   │   └── Index.kt\n    │   └── AppEntry.kt\n    └── resources/markdown\n        └── About.md\n```\n\nNote that there's no index.html or routing logic anywhere! We generate that for you automatically when you run Kobweb.\nThis brings us to the next section...\n\n#### Run your Kobweb site\n\n```bash\n$ cd your-project/site\n$ kobweb run\n```\n\nThis command spins up a web server at http://localhost:8080. If you want to configure the port, you can do so by editing\nyour project's `.kobweb/conf.yaml` file.\n\nYou can open your project in IntelliJ and start editing it. While Kobweb is running, it will detect changes, recompile,\nand deploy updates to your site automatically.\n\n### Using IntelliJ\n\nIf you don't want to keep a separate terminal window open beside your IDE window, you may prefer alternate solutions.\n\n#### Terminal tool window\n\nYou can use the [IntelliJ terminal tool window](https://www.jetbrains.com/help/idea/terminal-emulator.html) to run\n`kobweb` within it. If you run into a compile error, the stack trace lines will get decorated with\nlinks, making it easy to navigate to the relevant source.\n\n#### Gradle commands\n\n`kobweb` itself delegates to Gradle, but nothing is stopping you from calling the commands yourself. You can create\nGradle run configurations for each of the Kobweb commands.\n\n> [!TIP]\n> When you run a Kobweb CLI command that delegates to Gradle, it will log the Gradle command to the console. This is\n> how you can discover the Gradle commands discussed in this section.\n\n* To start a Kobweb server, use the `kobwebStart -t` command.\n  * The `-t` argument (or, `--continuous`) tells Gradle to watch for file changes, which gives you live loading behavior.\n* To stop a running Kobweb server, use the `kobwebStop` command.\n* To export a site, use<br>\n  `kobwebExport -PkobwebReuseServer=false -PkobwebEnv=DEV -PkobwebRunLayout=FULLSTACK -PkobwebBuildTarget=RELEASE -PkobwebExportLayout=FULLSTACK`\n  * If you want to export a static layout instead, change the last argument to<br>`-PkobwebExportLayout=STATIC`.\n* To run an exported site, use<br>\n  `kobwebStart -PkobwebEnv=PROD -PkobwebRunLayout=FULLSTACK`\n  * If your site was exported using a static layout, change the last argument to<br>`-PkobwebRunLayout=STATIC`.\n\nYou can read all about [IntelliJ's Gradle integration here](https://www.jetbrains.com/help/idea/gradle.html). Or to just jump straight into how to create run\nconfigurations for any of the commands discussed above, read [these instructions](https://www.jetbrains.com/help/idea/run-debug-gradle.html).\n\n### Running examples\n\nKobweb will provide a growing collection of samples for you to learn from. To see what's available, run:\n\n```bash\n$ kobweb list\n\nYou can create the following Kobweb projects by typing `kobweb create ...`\n\n• app: A template for a minimal site that demonstrates the basic features of Kobweb\n• examples/jb/counter: A very minimal site with just a counter (based on the Jetbrains tutorial)\n• examples/todo: An example TODO app, showcasing client / server interactions\n```\n\nFor example, `kobweb create examples/todo` will instantiate a TODO app locally.\n\n### Gradle configuration\n\n#### Declaring repositories to fetch Kobweb artifacts\n\nKobweb publishes its libraries to Maven Central and its plugins to the Gradle Plugin Portal. Therefore, Kobweb\nrecommends setting up your project's `settings.gradle.kts` like so:\n\n```kotlin\npluginManagement {\n    repositories {\n        gradlePluginPortal()\n    }\n}\n\ndependencyResolutionManagement {\n    repositories {\n        mavenCentral()\n        google()\n    }\n}\n```\n\n> [!TIP]\n> All Kobweb templates embrace this pattern, so if you start your own project by building on top of any of them, then\n> this will already be done for you.\n\nDependencies on Maven Central and the Gradle Plugin Portal are so standard, it's hard to imagine a project that isn't\nalready using them, so in most cases, you won't have to do anything.\n\n#### Testing snapshots\n\nOccasionally, especially if you file an issue for a bug fix or a feature request, our team may ask you if you're willing\nto try using a snapshot build (a dev build, essentially).\n\nSnapshots are, by design, not supported in either Maven Central nor the Gradle Plugin Portal. Therefore, we host all\nplugin and library artifacts in a separate official snapshot repository (at\n`https://central.sonatype.com/repository/maven-snapshots/`). As a result, you will have to declare this repository\nfor both plugin *and* library blocks.\n\nAn easy way to enable this is by adding the following block of code into your `settings.gradle.kts` file:\n\n```diff\npluginManagement {\n    repositories {\n        gradlePluginPortal()\n    }\n}\n\ndependencyResolutionManagement {\n    repositories {\n        mavenCentral()\n        google()\n    }\n}\n\n+ // The following block registers dependencies to enable Kobweb snapshot support. It is safe to delete or comment out\n+ // this block if you never plan to use them.\n+ gradle.settingsEvaluated {\n+     fun RepositoryHandler.kobwebSnapshots() {\n+         maven(\"https://central.sonatype.com/repository/maven-snapshots/\") {\n+             mavenContent {\n+                 includeGroupByRegex(\"com\\\\.varabyte\\\\.kobweb.*\")\n+                 snapshotsOnly()\n+             }\n+         }\n+     }\n+\n+     pluginManagement.repositories { kobwebSnapshots() }\n+     dependencyResolutionManagement.repositories { kobwebSnapshots() }\n+ }\n```\n\n> [!CAUTION]\n> The above code, adding repositories inside the `settingsEvaluated` block, is actually not Gradle idiomatic -- that\n> approach would be to create a settings plugin or just copy/paste the repository declaration in all relevant places --\n> but at the moment we are suggesting this approach for its simplicity:\n>\n> 1. If we could have declared a top level method in the settings file that both blocks could have called, that would\n> have been a nice option to recommend. However, the `pluginManagement` block is \"magic\" and you cannot share code with\n> it. This approach lets us at least mimic that kind of solution.\n> 2. Keeping the snapshot declaration logic separated in its own block makes it easy to remove it later if you decide\n> you don't want to keep it anymore.\n> 3. This approach is isolated inside a single file, while a settings plugin would be a lot of work that would require\ntouching several files, which is probably not worth it just for enabling snapshots.\n\n#### Gradle version catalogs\n\nThe project templates created by Kobweb all embrace Gradle version catalogs.\n\nIf you're not aware of it, it's a file that exists at `gradle/libs.versions.toml`. If you find yourself wanting to tweak\nor add new versions to projects you originally created via `kobweb create`, that's where you'll find them.\n\nFor example, here's the\n[libs.versions.toml](https://github.com/varabyte/kobweb-site/blob/main/gradle/libs.versions.toml) we use for our own\nlanding site.\n\nTo read more about the feature, please check out the\n[official docs](https://docs.gradle.org/current/userguide/platforms.html#sub:conventional-dependencies-toml).\n\n### Upgrading Kobweb in your project\n\nThe latest available version of Kobweb is declared at the top of this README. If a new version has come out, you can\nupdate your own project by editing `gradle/libs.version.toml` and updating the `kobweb` version there.\n\n> [!IMPORTANT]\n> You should double-check [COMPATIBILITY.md](COMPATIBILITY.md) to see if you also need to update your `kotlin` and\n> `jetbrains-compose` versions as well.\n\n> [!CAUTION]\n> It can be confusing, but Kobweb has two versions -- the version for the library itself (the one that is applicable in\n> this situation), and the one for the command line tool.\n\n<!--\nWe collected all the links from the old README so if a user tries to visit them, they'll end up here and NOT at the top\nof the README.\n-->\n\n<span id=\"stevdza-san\"></span>\n<span id=\"tutorial-videos\"></span>\n<span id=\"beginner-topics\"></span>\n<span id=\"create-a-page\"></span>\n<span id=\"route-override\"></span>\n<span id=\"package\"></span>\n<span id=\"packagemapping\"></span>\n<span id=\"page-context\"></span>\n<span id=\"query-parameters\"></span>\n<span id=\"dynamic-routes\"></span>\n<span id=\"packagemapping-1\"></span>\n<span id=\"page\"></span>\n<span id=\"querying-dynamic-route-values\"></span>\n<span id=\"catch-all-dynamic-routes\"></span>\n<span id=\"optional-catch-all-routes\"></span>\n<span id=\"static-and-dynamic-siblings\"></span>\n<span id=\"public-resources\"></span>\n<span id=\"html-styling\"></span>\n<span id=\"inline-vs-stylesheet\"></span>\n<span id=\"modifier\"></span>\n<span id=\"attrsmodifier-and-stylemodifier\"></span>\n<span id=\"silk\"></span>\n<span id=\"initsilk-methods\"></span>\n<span id=\"cssstyle\"></span>\n<span id=\"cssstylebase\"></span>\n<span id=\"cssstyle-name\"></span>\n<span id=\"additional-selectors\"></span>\n<span id=\"breakpoints\"></span>\n<span id=\"color-mode-aware\"></span>\n<span id=\"initial-color-mode\"></span>\n<span id=\"persisting-color-mode-preference\"></span>\n<span id=\"extending-css-styles\"></span>\n<span id=\"component-styles\"></span>\n<span id=\"component-variants\"></span>\n<span id=\"addvariantbase\"></span>\n<span id=\"structuring-code-around-component-styles\"></span>\n<span id=\"animations\"></span>\n<span id=\"elementrefscope-and-raw-html-elements\"></span>\n<span id=\"ref\"></span>\n<span id=\"disposableref\"></span>\n<span id=\"refscope\"></span>\n<span id=\"compose-html-refs\"></span>\n<span id=\"style-variables\"></span>\n<span id=\"in-many-cases-dont-use-css-variables\"></span>\n<span id=\"font-awesome\"></span>\n<span id=\"material-design-icons\"></span>\n<span id=\"components-layouts-sections-and-widgets\"></span>\n<span id=\"layouts-sections-and-widgets\"></span>\n<span id=\"markdown\"></span>\n<span id=\"front-matter\"></span>\n<span id=\"root\"></span>\n<span id=\"route-override-1\"></span>\n<span id=\"kobweb-call\"></span>\n<span id=\"block-syntax\"></span>\n<span id=\"inline-syntax\"></span>\n<span id=\"imports\"></span>\n<span id=\"global-imports\"></span>\n<span id=\"local-imports\"></span>\n<span id=\"callouts\"></span>\n<span id=\"callout-variants\"></span>\n<span id=\"custom-callouts\"></span>\n<span id=\"iterating-over-all-markdown-files\"></span>\n<span id=\"learning-css-through-kobweb\"></span>\n<span id=\"ways-kobweb-helps-with-css\"></span>\n<span id=\"a-concrete-example\"></span>\n<span id=\"css-2-kobweb\"></span>\n<span id=\"still-stuck\"></span>\n<span id=\"exporting-your-site\"></span>\n<span id=\"a-concrete-export-example\"></span>\n<span id=\"exporting-requires-a-browser\"></span>\n<span id=\"static-layout-vs-full-stack-sites\"></span>\n<span id=\"static-layout-sites\"></span>\n<span id=\"full-stack-sites\"></span>\n<span id=\"choosing-the-right-site-layout-for-your-project\"></span>\n<span id=\"exporting-and-running\"></span>\n<span id=\"pagecontextisexporting\"></span>\n<span id=\"dynamic-routes-and-exporting\"></span>\n<span id=\"deploying\"></span>\n<span id=\"intermediate-topics\"></span>\n<span id=\"specifying-your-application-root\"></span>\n<span id=\"updating-default-html-styles-with-silk\"></span>\n<span id=\"setting-application-globals\"></span>\n<span id=\"globally-replacing-silk-widget-styles\"></span>\n<span id=\"server\"></span>\n<span id=\"communicating-with-the-server\"></span>\n<span id=\"declare-a-full-stack-project\"></span>\n<span id=\"define-api-routes\"></span>\n<span id=\"responding-to-an-api-request\"></span>\n<span id=\"intercepting-api-routes\"></span>\n<span id=\"dynamic-api-routes\"></span>\n<span id=\"initapi-methods-and-initializing-services\"></span>\n<span id=\"api-stream\"></span>\n<span id=\"define-api-streams\"></span>\n<span id=\"example-api-stream\"></span>\n<span id=\"api-stream-conveniences\"></span>\n<span id=\"api-routes-vs-api-streams\"></span>\n<span id=\"passing-state-across-pages\"></span>\n<span id=\"type-safe-storage-values\"></span>\n<span id=\"splitting-kobweb-code-across-multiple-modules\"></span>\n<span id=\"worker\"></span>\n<span id=\"creating-a-kobweb-worker\"></span>\n<span id=\"background-what-are-web-workers\"></span>\n<span id=\"web-workers-wrapped-in-kobweb\"></span>\n<span id=\"example-worker-module-build-file\"></span>\n<span id=\"worker-factory\"></span>\n<span id=\"worker\"></span>\n<span id=\"workerfactory-examples\"></span>\n<span id=\"echoworkerfactory\"></span>\n<span id=\"countdownworkerfactory\"></span>\n<span id=\"findprimesworkerfactory\"></span>\n<span id=\"transferables\"></span>\n<span id=\"final-notes-about-worker-factories\"></span>\n<span id=\"single-worker-factory\"></span>\n<span id=\"worker-factory-name-constraint\"></span>\n<span id=\"when-to-use-kobweb-workers\"></span>\n<span id=\"advanced-topics\"></span>\n<span id=\"setting-your-sites-base-path\"></span>\n<span id=\"redirects\"></span>\n<span id=\"css-layers\"></span>\n<span id=\"default-layers\"></span>\n<span id=\"registering-layers\"></span>\n<span id=\"csslayer-annotation\"></span>\n<span id=\"layer-blocks\"></span>\n<span id=\"importing-third-party-styles-into-layers\"></span>\n<span id=\"generating-site-code-at-compile-time\"></span>\n<span id=\"generating-resources\"></span>\n<span id=\"adding-kobweb-to-an-existing-project\"></span>\n<span id=\"exporting-your-site-in-a-github-workflow\"></span>\n<span id=\"arithmetic-for-stylevariables-using-calc\"></span>\n<span id=\"kobweb-server-plugins\"></span>\n<span id=\"create-a-kobweb-server-plugin\"></span>\n<span id=\"register-your-server-plugin-jar\"></span>\n<span id=\"hooking-into-ktor-routing-events\"></span>\n<span id=\"changing-a-kobweb-server-plugin-requires-a-server-restart\"></span>\n<span id=\"using-your-own-backend-with-kobweb\"></span>\n<span id=\"cssnumeric\"></span>\n<span id=\"cssnumericvalue-type-aliases\"></span>\n<span id=\"background\"></span>\n<span id=\"csssizevalue\"></span>\n<span id=\"cssnumericvalue\"></span>\n<span id=\"prefer-using-kobwebs-cssnumericvalue-type-aliases\"></span>\n<span id=\"miscellaneous-topics\"></span>\n<span id=\"debugging-your-site\"></span>\n<span id=\"debugging-the-frontend\"></span>\n<span id=\"debugging-the-backend\"></span>\n<span id=\"using-a-custom-font\"></span>\n<span id=\"font-hosting-service\"></span>\n<span id=\"self-hosted-fonts\"></span>\n<span id=\"kobweb-server-logs\"></span>\n<span id=\"configuring-cors\"></span>\n<span id=\"generating-export-traces\"></span>\n\n## Read the Guide\n\nIf you got this far, it is time to start reading the manual!\n\n📚 https://kobweb.varabyte.com/docs\n\nThe guide walks you through all Kobweb concepts, organized into sections to make it easier to read as well as later\ncontinue where you left off.\n\n> [!IMPORTANT]\n> All the documentation for Kobweb used to live in this README, but it was getting so long as to be unwieldy. You may\n> have ended up at this section after following an old link found in the wild. We apologize for the inconvenience, but\n> you should be able to find the relevant information by\n> [visiting the guide](https://kobweb.varabyte.com/docs) and using the search bar found in the top right of the page.\n\n## Miscellaneous topics\n\n### General purpose improvements on top of Compose HTML and Kotlin/JS\n\nIn the beginning, Kobweb was only intended to be a thin layer on top of Compose HTML, but the more we worked on it, the\nmore we ran into features that were simply not yet implemented in Compose HTML. In other cases, we found ourselves\nreaching for utilities that we wished existed in Kotlin/JS browser APIs. As we began adding these features, we realized\nit would have been a shame to bury them deep inside our framework.\n\nAs a result, we created two modules:\n* [`compose-html-ext`](frontend/compose-html-ext/README.md), where we put code that we would be more than happy for the\n  Compose HTML team to fork and migrate over to Compose HTML someday.\n* [`browser-ext`](frontend/browser-ext/README.md), a collection of general purpose utilities that we think could be\n  useful to any Kotlin/JS project targeting the browser.\n\nThe features across these modules include (not comprehensive):\n\n* a *ton* of missing type-safe wrappers around many, many CSS properties\n* type-safe wrappers around CSS functions, like gradients, filters,\n  `calc` (especially useful when working with CSS variables), etc.\n* rich SVG support\n* utility methods around saving files to / loading files from the disk\n* utility methods and classes built on top\n  of [`window.fetch`](https://kotlinlang.org/api/latest/jvm/stdlib/org.w3c.dom/-window-or-worker-global-scope/fetch.html)\n  (for example, making it easier to use the most common HTTP verbs like GET, POST, etc.,\n  as well as providing `suspend fun` versions of fetch)\n* additions for the missing [transition events](https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent)\n* implementations of resize and intersection observers\n* utility methods for getting a sequence of descendant/ancestor HTML elements, useful for walking the DOM tree in a\n  Kotlin-idiomatic way\n* a utility composable, `GenericTag`, which is an easy-to-use API wrapping Compose HTML's `TagElement` composable, with\n  additional namespacing support if needed (for example, required when implementing SVG elements)\n* a utility class for working with CSS variables, `StyleVariable`, allows specifying a default value, provides\n  first-class number/string variable support, and\n  fixes [a bug in Compose HTML's `CSSStyleVariable`class](https://github.com/JetBrains/compose-multiplatform/issues/2763)\n  where it can accept invalid values.\n* `setTimeout` and `setInterval` methods that are more Kotlin-idiomatic (e.g. the lambdas are the last parameter)\n\n> [!NOTE]\n> Some users have mentioned we should have opened PRs for the Compose HTML team instead of maintaining a separate\n> codebase. However, after observing that JetBrains was focusing more and more of its energy on Compose Multiplatform\n> for Web, we decided to implement the features we needed in our own project. This way, we could maintain our velocity\n> while allowing their team to pick and choose what they agreed with at some point in the future at their leisure.\n> There's so much code here, especially around CSS APIs, that getting mired down in PR discussions would have ground our\n> progress to a halt.\n\nIf you want to use Compose HTML but *not* Kobweb, or Kotlin/JS but *not* Compose HTML, you can still use and benefit\nfrom `compose-html-ext` or `browser-ext` in your own project. An example build script could look like this (here, for a\nnon-Kobweb Compose HTML project):\n\n```kotlin\n// build.gradle.kts\nplugins {\n  kotlin(\"multiplatform\") version \"...\"\n}\n\nrepositories {\n  mavenCentral()\n  google()\n}\n\nkotlin {\n  js().browser()\n  sourceSets {\n    jsMain.dependencies {\n      implementation(compose.html.core)\n      implementation(compose.runtime)\n      implementation(\"com.varabyte.kobweb:compose-html-ext:...\") // IMPORTANT!!!\n    }\n  }\n}\n```\n\n> [!NOTE]\n> The `compose-html-ext` dependency automatically provides the `browser-ext` dependency.\n>\n> And of course, if you use Kobweb, it provides both.\n\n<!-- Some sites link to this section before I changed its name, so adding a span here so they can still find it. -->\n### <span id=\"what-about-multiplatform-widgets\"><span id=\"what-about-compose-for-web-canvas\">What about Compose Multiplatform for Web?</span></span>\n\nJetbrains is working on the \"Compose Multiplatform UI Framework\", which allows developers to use the same codebase\nacross Android, iOS, Desktop, and the Web. And it may seem like the Kobweb + Silk approach is obsoleted by it.\n\nIt's first worth understanding the core difference between the two approaches. With Compose Multiplatform, the framework\nowns its own rendering pipeline, drawing to a buffer. In contrast, Compose HTML modifies an HTML / CSS DOM tree and\nleaves it up to the browser to do the final rendering.\n\nThis has major implications on how similar the two APIs can get. For example, in Compose Multiplatform, the order you\napply modifiers matters. However, in Compose HTML, this action simply sets html style properties under the hood, where\norder does not matter.\n\nDue to its reputation, ditching HTML / CSS entirely at first can seem like a total win, but this approach has several\nlimitations:\n\n* robots would lose the ability to crawl and index your site, hurting SEO.\n* your initial render may take longer (as nothing will be rendered until your site's logic is downloaded and run for one\n  frame).\n* your site will need to allocate a large canvas buffer, which could be *very* expensive on high-res, wide-screen\n  desktops.\n* your UI will be opaque to the powerful suite of devtools that come bundled with browsers.\n* you won't have the ability to style unvisited vs visited links differently (this information is hidden from you by\n  the browser for security reasons and can only be set through HTML / CSS).\n* you won't have the ability to turn elements on / off when printing the page.\n* accessibility tools for browsers might not work.\n* the download size of the rendering components is not insignificant and apparently not very compressible, often\n  resulting in a site's basic footprint being 4-6x larger total (e.g. 200-400K vs. 2-3MB for small sites).\n\nIt would also prevent a developer from making use of the rich ecosystem of Javascript libraries out there.\n\nFinally, Kobweb is more than just Kotlin-ifying HTML / CSS. It also provides rich integration with powerful web\ntechnologies like [web workers](https://kobweb.varabyte.com/docs/concepts/foundation/workers)\nand [websockets](https://kobweb.varabyte.com/docs/concepts/server/fullstack#api-streams).\n\nFor now, I am making a bet that there will always be value in embracing the web, providing a framework that sticks to\nHTML / CSS but offers a growing suite of UI widgets, layouts, and other features that make it a more comfortable\nexperience for the Kotlin developer.\n\nFor example, [the flexbox layout](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) is a very powerful concept,\nbut it can be very tricky to use. In most cases, you'll find it's much easier to compose `Row`s and `Column`s together\nthan trying to remember if you should be justifying your items or aligning your content, even if `Row`s and `Column`s\nare just configuring the correct HTML / CSS for you behind the scenes.\n\nUltimately, I believe there is room for both Compose Multiplatform *and* Kobweb. If you want to make an app experience\nthat feels the same on Android, iOS, Desktop, and Web, then Compose Multiplatform could be the right choice for you.\nHowever, if you just want to make a traditional website but want to use Kotlin instead of TypeScript, Kobweb can provide\nan excellent development experience for that case.\n\n### Can We Kobweb Yet\n\nCurrent state: **Foundations are in place! You may encounter API gaps.**\n\nYou may wish to refer to our [Kobweb 1.0 roadmap document](https://docs.google.com/document/d/1n2Jd02yzuxaatpT7gOhEuijzfaSu9UIaQTV2t4EPcPk/preview).\n\nKobweb is becoming quite functional. We are already using it to build https://kobweb.varabyte.com and\nhttps://bitspittle.dev. Several users have created working portfolio sites already, and I'm aware of at least two cases\nwhere Kobweb was used in a project for a client.\n\nAt this point:\n\n* It is easy to set up a new project and get things running quickly.\n* The live reloading flow is pretty nice, and you'll miss it when you switch to projects that don't have it.\n* It supports generating pages from Markdown that can reference your Composable code.\n* While it's not quite a server-side rendering, you can export static pages which will get hydrated on load.\n* A huge range of CSS properties are supported, along with support for style variables and animations.\n* You can use the `Modifier` builder for a significant number of CSS properties.\n* Silk components are color-mode aware and support responsive behavior.\n* There are quite a few widgets available, and it's easy to create your own.\n\nHowever, there's always more to do.\n\n* I'm trying to add support for every stabilized CSS property, but some are still missing, especially less\n  common ones. (You can use a fallback for such cases in the meantime).\n* There are still a handful of widgets planned to be added.\n* A lot of detailed documentation is planned to go into the Kobweb site (linked just above) but it isn't done yet.\n\nI think there's enough here now to let you do almost anything you'd want to do, as either Kobweb supports it or you can\nescape hatch to underlying Compose HTML / Kotlin/JS approaches, but there might be some areas where it's still a bit\nDIY. It would be great to get real-world experience to hear what issues users are actually running into.\n\nIn general, please understand that we are still pre-1.0, and as such, there is an expectation that you'll be a little\nmore tolerant to occasional API migrations, unlike if you were using a more stable library.\n\nWe strive hard to ensure that any code we deprecate is kept around for *at least* 6 months, but after that, we are\nlikely to remove it. This allows our very lean team to stay nimble as we focus on getting to a 1.0 release.\n\nSo, should you use Kobweb at this point? If you are...\n\n* playing around with Compose HTML for the first time and want to get up and running quickly on a toy project:\n  * **YES!!!** Please see the [connecting with us▼](#connecting-with-us) section\n    below, we'd definitely love to hear from you. It's still a good time if you want to have a voice in the\n    direction of this project.\n* a Kotlin developer who wants to write a small web app or create a new blog from scratch:\n  * **Probably!** I hope if you evaluate Kobweb at this point, you'll find a lot to like. You can get in touch\n    with us at our Discord if you try it and have questions or run into missing features.\n* someone who already has an existing project in progress and wants to integrate Kobweb into it:\n  * **Maybe not?** Depending on how much work you've done, it may not be a trivial refactor. You can review\n    [this guide on adding Kobweb to an existing project](https://kobweb.varabyte.com/docs/guides/existing-project) if\n    you want to try anyway.\n* a company:\n  * **Probably not?** I'm assuming most companies are so risk-averse they would not even use Compose HTML, which Kobweb\n    is built on top of. If you *were* considering Compose HTML, however, Kobweb is worth a look.\n\nOn the fence but not sure? Connect with us, and I'd be happy to help you assess your situation.\n\n## Community\n\n### Testimonials\n\nI'm pleased to mention that Kobweb has received feedback from some satisfied users. Here are a few:\n\n* \"This is a pretty bloody amazing technology you've created here. I have been dreading upgrading [my] website for ages because I didn't want to go back to html and css 🫤 now I can stay with Kotlin 😀\"\n* \"Kobweb looks fantastic and I've been [trying] to use Kotlin in all parts of [my] hobby stuff and work, so I got real excited when I saw Kobweb, [even though] I hadn't been satisfied with a web framework in a long time. Incredible work.\"\n* \"I started using Kobweb last week and I have to say this [...] reinvented web development for me. [...] I used to hate html css. After getting my hands on kobweb I’m in love with it.\"\n* \"Finally got paid -- all thanks to kobweb 🎉💥\"\n* \"I didn't wanna learn any JS framework so when I first learned about kobweb it felt like a no-brainer; having built 2 Android apps with compose already and a backend with ktor. One could argue Android developers are the best target audience since the additional knowledge needed to move an app to the web with Kobweb is minimal. I love it! 🤩\"\n\n### Connecting with us\n\n* [Join my Discord!](https://discord.gg/5NZ2GKV5Cs)\n* [GitHub Discussions](https://github.com/varabyte/kobweb/discussions) for this project\n* The [Kobweb channel](https://kotlinlang.slack.com/archives/C04RTD72RQ8) on the Kotlin Slack\n* You can send direct queries to [my email](mailto:bitspittle@gmail.com)\n\nIf you're comfortable with it, using Discord is recommended, because there's a growing community of users in there who\ncan offer help even when I'm not around.\n\n### Filing issues and leaving feedback\n\nIt is still early days, and while we believe we've proven the feasibility of this approach at this point, there's still\nplenty of work to do to get to a 1.0 launch! We are hungry for the community's feedback, so please don't hesitate to:\n\n* [Open an issue](https://github.com/varabyte/kobweb/issues/new/choose)\n* Contact us (using any of the ways mentioned above) telling us what features you want\n* Ask us for guidance, especially as there are no tutorials yet (your questions can help us know what to write first!)\n\nThank you for your support and interest in Kobweb!\n\n### Supporting the project\n\nYou should feel no obligation to pay anything to use Kobweb -- it is licensed liberally quite intentionally and\ngiven to the community without any strings attached.\n\nHowever, if you like what we are doing and are determined to support our efforts financially, we would gratefully accept\na donation at [ko-fi.com/bitspittle](https://ko-fi.com/bitspittle). Money will go towards development fees and rewarding\ncontributors.\n\nAlternately, there are countless non-financial ways to support this project, such as:\n\n* Just use Kobweb and spread the word!\n* Consider tagging your website with a \"Made with [Kobweb](https://github.com/varabyte/kobweb)\" blurb in the footer.\n* Write articles about Kobweb / share your experience using it.\n* Send us feedback, be it appreciative or critical. Please don't be shy about letting us know if there are things you\n  feel are missing. If you have ideas that you think can make Kobweb better, please share them.\n* Join our community on Discord and/or Slack and answer questions.\n* Pick up a bug or feature to work on.\n\nUltimately, I want Kobweb to be known for having a kind, patient, and welcoming community. As long as you are helping\nus accomplish that, then please consider yourself already supporting our efforts.\n","size":7835,"stargazers_count":0,"topics":[],"updated_at":"2026-02-18T12:35:28Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":2,"contributors_count":0,"created_at":"2020-10-31T16:47:40Z","default_branch":"main","description":"This is just a bot for testing kotlin that I made.","fork":false,"forks_count":0,"full_name":"Ayfri/kotlin-little-bot","homepage":null,"html_url":"https://github.com/Ayfri/kotlin-little-bot","id":308928148,"is_template":false,"language":"Kotlin","name":"kotlin-little-bot","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2020-10-31T16:51:19Z","readme_content":"# kotlin-little-bot\nThis is just a bot for testing kotlin that I made.\n","size":71,"stargazers_count":2,"topics":[],"updated_at":"2020-11-01T09:09:26Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":2954,"contributors_count":42,"created_at":"2021-03-16T13:58:02Z","default_branch":"master","description":"JetBrains theme of Material Theme","fork":true,"forks_count":0,"full_name":"Ayfri/material-theme-jetbrains","homepage":null,"html_url":"https://github.com/Ayfri/material-theme-jetbrains","id":348368064,"is_template":false,"language":null,"name":"material-theme-jetbrains","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-03-16T15:31:06Z","readme_content":"<div align=\"center\">\n  <a href=\"https://www.material-theme.com\">\n<img src=\"logo.svg\" width=\"320\" height=\"320\" alt=\"logo\"></img>\n</a>\n</div>\n\n# Material Theme UI for Jetbrains\n\nThis is a port of the famous [Material Theme](https://github.com/equinusocio/vsc-material-theme) for Jetbrains IDEs, allowing a total customization of the IDE including Themes, Color Schemes, Icons and many other features.\n\n### Important Note: Pricing\n\nSince version 6.0.0 the plugin is now a paid plugin. Previous versions are still available for free, but further updates will only be available on the Paid Version.\n\nThe plugin is priced at 5$ USD monthly, or 50$ annually for individuals, and 30$ monthly/150$ annually for enterprises.\nAcademics, open-source and user groups are free of charge, and non-profit organizations, educational organizations and students can get a discount. There's also a 30-days trial.\n\nAlso, people that have contributed more than 1$ in the past, and code contributors can get a **free lifetime license**! Contact me with your contact information at <elior@material-theme.com> to apply.\n\n**Thanks for your support for all this time!!! You guys are the best!!!**\n\nIn any case, there is a free version available for everyone here but with limited features: [Material Theme UI Lite](https://plugins.jetbrains.com/plugin/12124-material-theme-ui-lite)\n\n##### Feature Comparison:\n\n\n| Feature                    | Premium Version | Lite Version           |\n|:---------------------------|:----------------|:-----------------------|\n| Built-in Themes            | Yes             | Yes                    |\n| Color Schemes              | Yes             | Yes                    |\n| Fonts                      | Yes             | Yes                    |\n| Wallpapers                 | Yes             | Yes                    |\n| File Status Colors         | Yes             | Yes                    |\n| Accent Colors              | Yes             | Yes (not configurable) |\n| Material Components        | Yes             | Yes (partial support)  |\n| Support                    | Yes             | Yes (limited)          |\n| Custom Themes              | Yes             | No                     |\n| Tab Customization          | Yes             | No                     |\n| Compact Customization      | Yes             | No                     |\n| Project View Customization | Yes             | No                     |\n| Component Customization    | Yes             | No                     |\n| Language Additions         | Yes             | No                     |\n| External Themes            | Yes             | No                     |\n| Update rate                | High            | Medium                 |\n\n----\n\n[![GitHub issues](https://img.shields.io/github/issues/ChrisRM/material-theme-jetbrains.svg)](https://github.com/ChrisRM/material-theme-jetbrains/issues) [![GitHub stars](https://img.shields.io/github/stars/ChrisRM/material-theme-jetbrains.svg)](https://github.com/ChrisRM/material-theme-jetbrains/stargazers)\n[![Twitter](https://img.shields.io/twitter/url/https/github.com/ChrisRM/material-theme-jetbrains.svg?style=social)](https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2FChrisRM%2Fmaterial-theme-jetbrains)\n\n\n![GitHub tag](https://img.shields.io/github/tag/ChrisRM/material-theme-jetbrains.svg)\n![JetBrains IntelliJ Plugins](https://img.shields.io/jetbrains/plugin/v/8006-material-theme-ui.svg)\n\n\n![Github All Releases](https://img.shields.io/github/downloads/ChrisRM/material-theme-jetbrains/total.svg)\n![JetBrains IntelliJ plugins](https://img.shields.io/jetbrains/plugin/d/8006-material-theme-ui.svg?label=plugin%20downloads)\n\n\n#### Plugin pages:\n\n<https://plugins.jetbrains.com/plugin/8006-material-theme-ui>\n<https://plugins.jetbrains.com/plugin/10044-atom-material-icons>\n\n## Documentation:\n<https://www.material-theme.com>\n\n![laptop-full](laptop-full.png)\n\n#### Donate via Paypal:\n\n_@ChrisRM_:\n[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=LSF7K29JBPMWU&lc=US&item_name=Material%20Theme%20JetBrains%20Development&item_number=m1&currency_code=NOK&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted)\n\n_@Mallowigi_:\n[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/mallowigi)\n\n#### OpenCollective Backers\n\n<img src=\"https://opencollective.com/atom-material-themes-and-plugins/tiers/backer/badge.svg?label=Backers&color=brightgreen\" />\n\n<object type=\"image/svg+xml\" data=\"https://opencollective.com/atom-material-themes-and-plugins/tiers/backer.svg?avatarHeight=36&width=600\"></object>\n\n[![Sponsors on Open Collective](https://opencollective.com/atom-material-themes-and-plugins/sponsors/badge.svg)](#sponsors)\n\n#### Sponsors\n\nThe Material Theme plugin is sponsored by [CodeStream](https://codestream.com/?utm_source=jbmarket&utm_medium=banner&utm_campaign=jbmaterialtheme) and [Codota](https://www.codota.com/?url=https://www.codota.com&device=c&keyword=codota&country={country}&campaign={campaign}&gclid=EAIaIQobChMI0MTRrsS55gIVQrDtCh2Reg7FEAAYASAAEgK0QfD_BwE).\n\n[![https://codestream.com](https://alt-images.codestream.com/codestream_logo_jbmaterialtheme.png)](https://sponsorlink.codestream.com/?utm_source=jbmarket&utm_campaign=jbmaterialtheme&utm_medium=banner)\n\nEliminate context switching and costly distractions. Create and merge PRs and perform code reviews from inside your IDE while using jump-to-definition, your keybindings, and other IDE favorites. [Learn more](https://sponsorlink.codestream.com/?utm_source=jbmarket&utm_campaign=jbmaterialtheme&utm_medium=banner)!\n\n[![https://www.codota.com](https://d3ftmdkezac6rp.cloudfront.net/plugins/assets/logo.b81d20edb7ae4d8ff43b886ae5cde1dd.svg)](https://www.codota.com/?url=https://www.codota.com&device=c&keyword=codota&country={country}&campaign={campaign}&gclid=EAIaIQobChMI0MTRrsS55gIVQrDtCh2Reg7FEAAYASAAEgK0QfD_BwE)\n\nCode faster and smarter using code completions learned from millions of programs directly in IntelliJ, Android Studio or Eclipse. [Get Codota](https://www.codota.com/?url=https://www.codota.com&device=c&keyword=codota&country={country}&campaign={campaign}&gclid=EAIaIQobChMI0MTRrsS55gIVQrDtCh2Reg7FEAAYASAAEgK0QfD_BwE)\n\n--------------------\n\n## Contribution\n\nPull requests are appreciated! I can use some help on bugs and features listed in \n<https://github.com/ChrisRM/material-theme-jetbrains/issues>, or you can send me some new ideas!\n\n--------------------\n\n# Authors:\n \nTwitter: [@crmag](https://twitter.com/crmag)\n[@mallowigi](https://twitter.com/mallowigi)\n\nOfficial page: [@MJetbrains](https://twitter.com/MJetbrains)\n\nGithub: [@ChrisRM](https://github.com/chrisrm) [@Mallowigi](https://github.com/mallowigi)\n\n**Thanks to [@equinusocio](https://github.com/equinusocio) and his original [Material Theme](https://github.com/equinusocio/vsc-material-theme) for the inspiration.**\n\n# Contact\nYou can contact us or ask questions via [Gitter](https://gitter.im/Material-Theme-Jetbrains/Lobby#) or our brand new\n[Slack community!](https://join.slack.com/t/material-theme-ui/shared_invite/zt-4w78iblt-cHXYRYERpuGNbD~TqsD8rg)\n\nCome say hello!\n\n## Other portings\n\nThe Material Theme has been ported to many other editors, applications, websites and other platforms:\n- [Visual Studio Code](https://github.com/equinusocio/vsc-material-theme/) (by [@equinusocio](https://github.com/equinusocio)\n- [Sublime Text](https://github.com/equinusocio/material-theme/) (also by [@equinusocio](https://github.com/equinusocio)\n- [Hyper](https://github.com/equinusocio/hyper-material-theme) (also by [@equinusocio](https://github.com/equinusocio).\n- [Atom](https://github.com/silvestreh/atom-material-ui) (by [@silvestreh](https://github.com/silvestreh))\n- [Vim](https://github.com/kristijanhusak/vim-hybrid-material) (by [@kristijanhusak](https://github.com/kristijanhusak)).\n- [Terminal OSX](https://gist.github.com/mvaneijgen/4c56701215847dd5ddcf) (by [@mvaneijgen](https://github.com/mvaneijgen)).\n- [iTerm2](https://gist.github.com/Revod/3f3115f8d4b90fc986fd4b61441c2567) (by [@Revod](https://github.com/Revod)) and [iTerm2 Palenight](https://github.com/JonathanSpeek/palenight-iterm2) (by [@jonathanspeek](https://github.com/jonathanspeek)).\n- [ConEmu](https://gist.github.com/rajadain/b306b2ba71bd58a1df41) (by [@rajadain](https://github.com/rajadain)).\n- [Slack Sidebar](https://slack.com/) (`#263238`, `#2E3A40`, `#80CBC4`, `#FFFFFF`, `#13191C`, `#FFFFFF`, `#50FA7B`, `#FF5555`)\n- [Nylas N1](https://github.com/jackiehluo/n1-material) (thanks to [@jackiehluo](https://github.com/jackiehluo))\n- [Base16](https://github.com/ntpeters/base16-materialtheme-scheme) (by [@ntpeters](https://github.com/ntpeters))\n- [Notepad++](https://github.com/Codextor/npp-material-theme) (by [@Codextor](https://github.com/Codextor))\n- [Chrome Devtools](https://chrome.google.com/webstore/detail/material-devtools-theme-c/jmefikbdhgocdjeejjnnepgnfkkbpgjo)\n- [Bear](https://github.com/r3volution11/material-theme-bear-notes) (by [Doug C. Hardester](https://github.com/r3volution11))\n- [Slack Themes](https://github.com/mallowigi/slack-themes) - Porting of the Material Theme to Slack\n- [Gmail](https://userstyles.org/styles/174257/material-dark-gmail) (by [@Charlie Etienne](https://github.com/CharlieEtienne))\n- [Google Calendar](https://userstyles.org/styles/174228/material-dark-google-calendar) (by [@Charlie Etienne](https://github.com/CharlieEtienne))\n- [Google Keep](https://userstyles.org/styles/174291/material-dark-google-keep) (by [@Charlie Etienne](https://github.com/CharlieEtienne))\n- [Trello](https://userstyles.org/styles/167605/material-dark-trello) (by [@Charlie Etienne](https://github.com/CharlieEtienne))\n- [GitHub](https://github.com/CharlieEtienne/material-github) (by [@Charlie Etienne](https://github.com/CharlieEtienne))\n- [Google](https://github.com/CharlieEtienne/material-google) (by [@Charlie Etienne](https://github.com/CharlieEtienne))\n\n## Icon Reference\n\n- All file icons have been built using the tools provided by [A File Icon](https://github.com/SublimeText/AFileIcon). Great thanks to them!\n- And of course many thanks to the SVG creators:\n* [**File-Icons**](https://github.com/file-icons/source/blob/master/charmap.md) \n* [**FontAwesome 4.7.0**](http://fontawesome.io/cheatsheet/)\n* [**Mfizz**](https://github.com/file-icons/MFixx/blob/master/charmap.md)\n* [**Devicons**](https://github.com/file-icons/DevOpicons/blob/master/charmap.md)\n* [**Octicons**](https://octicons.github.com)\n* [**Material Design Icons**](https://materialdesignicons.com/)\n* [**Many FlatIcons authors**](https://www.flaticon.com/)\n* [**Philipp Kief**](https://github.com/PKief/vscode-material-icon-theme)\n\nThanks also for [@yonnyz](https://twitter.com/yonnyz) for the theme icons!\n\nAlso many thanks to other plugin developers for helping me solving A LOT of issues:\n* [Nyan Progress Bar](https://plugins.jetbrains.com/plugin/8575-nyan-progress-bar)\n* [Afterglow Theme](https://plugins.jetbrains.com/plugin/8066-afterglow-theme)\n* [Git Toolbox](https://plugins.jetbrains.com/plugin/7499-gittoolbox)\n* [Browse Word At Caret](https://plugins.jetbrains.com/plugin/201-browsewordatcaret)\n* [GitIgnore](https://github.com/hsz/idea-gitignore)\n* [Project Label](https://github.com/drinchev/project-label)\n\nThanks to all [original plugin contributors](https://github.com/ChrisRM/material-theme-jetbrains/graphs/contributors), \n[EAP contributors](https://github.com/mallowigi/material-theme-jetbrains-docs/graphs/contributors)\nand a special thanks to the guys at [JetBrains](https://www.jetbrains.com/) for contributing and showing interest in the project!\n\n## Other Projects\n\nCheck out my other projects:\n- [Image Icon Plugin](https://plugins.jetbrains.com/plugin/11096-image-icon-viewer) - A previewer for small images and svgs directly in the Project View\n- [Atom Material Icons](https://plugins.jetbrains.com/plugin/10044-atom-material-icons) - A mix of the Atom File Icons and the Material Icons, or if you prefer, the Icons component of this plugin :)\n- [Custom Syntax Highlighter](https://github.com/mallowigi/Custom-Syntax-Highlighter) - Proof of concept for defining custom keywords highlighting.\n- [Material Theme UI for Chrome](https://chrome.google.com/webstore/detail/material-devtools-theme-c/jmefikbdhgocdjeejjnnepgnfkkbpgjo) - Porting of the Material Theme for Chrome\n- [Slack Themes](https://github.com/mallowigi/slack-themes) - Porting of the Material Theme to Slack\n\n\n\n## Contributors\n\nThis project exists thanks to all the people who contribute. \n<a href=\"graphs/contributors\"><img src=\"https://opencollective.com/atom-material-themes-and-plugins/contributors.svg?width=890&button=false\" /></a>\n\n\n## Backers\n\nThank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/atom-material-themes-and-plugins#backer)]\n\n<a href=\"https://opencollective.com/atom-material-themes-and-plugins#backers\" target=\"_blank\"><img src=\"https://opencollective.com/atom-material-themes-and-plugins/backers.svg?width=890\"></a>\n\nCheck also : <https://www.material-theme.com/docs/support-us/>\n\n## Sponsors\n\nSupport this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/atom-material-themes-and-plugins#sponsor)]\n\n<a href=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/atom-material-themes-and-plugins/sponsor/9/avatar.svg\"></a>\n\n\n","size":148733,"stargazers_count":0,"topics":[],"updated_at":"2021-03-16T13:58:04Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":96,"contributors_count":14,"created_at":"2026-01-12T08:38:32Z","default_branch":"main","description":"An online Minecraft source code viewer","fork":true,"forks_count":0,"full_name":"Ayfri/mcsrc","homepage":"https://mcsrc.dev/","html_url":"https://github.com/Ayfri/mcsrc","id":1132635768,"is_template":false,"language":"TypeScript","name":"mcsrc","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-22T18:08:37Z","readme_content":"# [https://mcsrc.dev/](https://mcsrc.dev/)\n\nNote: This project is not affiliated with Mojang or Microsoft in any way. It does NOT redistribute any Minecraft code or compiled bytecode. The minecraft jar is downloaded directly from Mojang's servers to your browser.\n\n## How to build locally\n\nFirst you must build the java project using Gradle.\n\n- `cd java`\n- `./gradlew build`\n\nThen you can run the web app:\n\n- `nvm use` (or ensure you have the correct Node version, see `.nvmrc`)\n- `npm install`\n- `npm run dev`\n\n## Credits\n\nLibraries and tools used:\n\n- Decompiler: [Vineflower](https://github.com/Vineflower/vineflower)\n- Wasm compilation of Vineflower: [@run-slicer/vf](https://www.npmjs.com/package/@run-slicer/vf)","size":257,"stargazers_count":1,"topics":[],"updated_at":"2026-02-03T20:57:04Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":9,"contributors_count":0,"created_at":"2021-06-23T13:35:11Z","default_branch":"master","description":"My minecraft mod that I'm making on twitch, better name will come later.","fork":false,"forks_count":0,"full_name":"Ayfri/minecraft-mod","homepage":null,"html_url":"https://github.com/Ayfri/minecraft-mod","id":379614382,"is_template":false,"language":"Kotlin","name":"minecraft-mod","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-07-01T16:09:52Z","readme_content":"# Stream-Mod\r\n\r\nA simple mod that I'm making on stream on Twitch.\r\n","size":29,"stargazers_count":0,"topics":[],"updated_at":"2021-07-01T16:09:55Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":53,"contributors_count":2,"created_at":"2021-12-04T03:15:46Z","default_branch":"master","description":"A scrapper to get data on all the versions of Minecraft using its fandom wiki.","fork":false,"forks_count":0,"full_name":"Ayfri/minecraft-wiki-scrapper","homepage":null,"html_url":"https://github.com/Ayfri/minecraft-wiki-scrapper","id":434795035,"is_template":false,"language":"Kotlin","name":"minecraft-wiki-scrapper","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-03-11T00:30:32Z","readme_content":"# minecraft-wiki-scrapper\nA scrapper to get data on all the versions of Minecraft using its fandom wiki.\n","size":384,"stargazers_count":0,"topics":[],"updated_at":"2022-01-07T00:23:34Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":34,"contributors_count":0,"created_at":"2025-03-29T22:59:50Z","default_branch":"main","description":"A nostalgic Pokémon card shop website straight from the year 2000! ","fork":false,"forks_count":0,"full_name":"Ayfri/pokestore-2000","homepage":"https://pokestore-2000.ayfri.com/","html_url":"https://github.com/Ayfri/pokestore-2000","id":957254438,"is_template":false,"language":"Vue","name":"pokestore-2000","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-04-29T21:41:14Z","readme_content":"# ★★★ POKÉSTORE 2000 ★★★\n\n<p align=\"center\">\n  <img src=\"public/pokestore.webp\" alt=\"Pokéstore Logo\" width=\"400\">\n</p>\n\n## WELCOME TRAINERS!!! ^_^\n\nTHIS IS THE **OFFICIAL** REPOSITORY FOR POKÉSTORE 2000 - THE #1 POKÉMON CARD SHOP ON THE INTERNET!!!\n\n### ~~~~~ HOW TO USE: ~~~~~\n\n1) DOWNLOAD the files to your COMPUTER\n2) Make sure you have NETSCAPE NAVIGATOR or INTERNET EXPLORER installed!\n3) Put files on your WEBSERVER\n4) ENJOY!!! :-)\n\n### ~~~~~ FEATURES: ~~~~~\n\n- [X] AWESOME animated GIFs!!!\n- [X] Shop for RARE Pokémon cards!!!\n- [X] Sign our GUESTBOOK!!!\n- [X] Working SHOPPING CART system!!!\n- [X] View our AWARDS!!!\n- [X] NO FRAMES or JAVA REQUIRED!!!\n\n### ~~~~~ SYSTEM REQUIREMENTS: ~~~~~\n\n- 486 DX2/66 or PENTIUM processor\n- 16 MB RAM (32 MB RECOMMENDED)\n- Mouse\n- Sound Card (for MUSIC)\n- 800x600 screen resolution (1024x768 RECOMMENDED)\n- Node.js v22+\n- Vue 3\n- Vite\n\n### ~~~~~ INSTALLATION: ~~~~~\n\n```\nnpm install\n```\n\n### ~~~~~ RUN THE SERVER: ~~~~~\n\n```\nnpm run dev\n```\n\n### ~~~~~ MAKE A PRODUCTION BUILD: ~~~~~\n\n```\nnpm run build\n```\n\n### ~~~~~ CONTACT THE WEBMASTER: ~~~~~\n\nEMAIL: webmaster@pokéstore-2000.com\nICQ: 12345678\nAIM: PokeStore2000\n\n### ~~~~~ LEGAL DISCLAIMER: ~~~~~\nPOKÉMON and all related CHARACTERS are property of NINTENDO. This is a FAN SITE and is not affiliated with Nintendo in any way.\n\n![VALID HTML!](public/gifs/pokemon/greatball.gif) ![UNDER CONSTRUCTION](public/gifs/pokemon/construction.gif) ![VALID CSS!](public/gifs/pokemon/ultraball.gif)\n\n-------------------------------\n© 2000 POKÉSTORE. ALL RIGHTS RESERVED.\nVERSION 1.8.5 BETA - LAST UPDATED: 08/27/2000\n","size":342,"stargazers_count":1,"topics":["2000s","pokemon","website"],"updated_at":"2026-04-29T21:41:18Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":12,"contributors_count":0,"created_at":"2020-08-23T02:39:38Z","default_branch":"master","description":"Generate custom profile activity for your profile README","fork":true,"forks_count":0,"full_name":"Ayfri/profile-activity-generator","homepage":"https://omidnikrah.github.io/profile-activity-generator/","html_url":"https://github.com/Ayfri/profile-activity-generator","id":289602888,"is_template":false,"language":null,"name":"profile-activity-generator","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2020-08-15T13:44:25Z","readme_content":"# Profile Activity Generator\n\nGenerate custom profile activity for your profile READMEs\n\n🚧 Work In Progress \n\n## How To Use\n\n- Click on the squares to change the colors\n- Press Ctrl key and hover on the squares to change the colors\n\n<div align=\"center\">\n    <img src=\"https://raw.githubusercontent.com/omidnikrah/profile-activity-generator/master/demo.png\" />\n</div>\n","size":22,"stargazers_count":1,"topics":[],"updated_at":"2020-08-24T22:07:50Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":284,"contributors_count":11,"created_at":"2020-09-19T15:40:47Z","default_branch":"master","description":"(Tout langage) API compatible Pronote 2020/2021","fork":true,"forks_count":0,"full_name":"Ayfri/pronote-api","homepage":"","html_url":"https://github.com/Ayfri/pronote-api","id":296899850,"is_template":false,"language":null,"name":"pronote-api","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2020-09-19T15:45:01Z","readme_content":"# Pronote API - LISEZ MOI ABSOLUMENT\n\n![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/Litarvan/pronote-api/Node.js%20linting%20and%20testing/master?label=tests&logo=github&style=flat-square)\n[![MIT license](https://img.shields.io/badge/license-MIT-lightgray?style=flat-square)](LICENSE)\n[![Latest release](https://img.shields.io/github/v/release/Litarvan/pronote-api?color=darkgreen&include_prereleases&label=Latest%20release&style=flat-square)](https://github.com/Litarvan/pronote-api/releases)\n[![NPM release](https://img.shields.io/npm/v/pronote-api?style=flat-square)](https://npmjs.org/package/pronote-api)\n\nAPI Pronote **2020/2021** complète et plutôt stable avec intégration de nombreux CAS (connexion avec comptes spéciaux pour les régions).\n\nDisponible en tant que :\n- Librairie Node.JS [via NPM](https://www.npmjs.com/package/pronote-api) (note : **support TypeScript** complet)\n- Serveur GraphQL (donc depuis **n'importe que langage**), [voir instructions](#serveur-graphql)\n\n**Nouveauté 2020/2021 : [Session conservable](#conserver-la-session)**\n\n## Données récupérables\n\n- Infos Pronote, établissement et utilisateur\n- Emploi du temps\n- Devoirs\n- Notes\n- Compétences/évaluations\n- Absences/punitions/retenues\n- Informations\n- Menu de la cantine\n\nÀ chaque fois, il est possible de choisir quelle période voire quel intervalle de jours récupérer précisément.\n\n## Comptes région supportés\n\n**Uniquement dans le cas où vous ne pouvez PAS vous connecter directement par Pronote, mais devez passer par une interface régionale spéciale**\n\n**Si vous pouvez vous connecter directement sur l'interface de Pronote, l'API devrait fonctionner PEU IMPORTE VOTRE ACADÉMIE**\n\nSinon, l'API propose de se connecter à Pronote avec des comptes des académies suivantes :\n\n- Académie de Lyon (CAS : `ac-lyon`)\n- Académie de Montpellier (CAS : `ac-montpellier`)\n- Académie de Toulouse (CAS : `ac-toulouse`)\n- Académie de Grenoble (CAS : `ac-grenoble`)\n- Académie de Rouen (CAS : `ac-rouen`)\n- Académie de Rouen (Arsene76) (CAS : `arsene76`)\n- Académie de Lille (CAS : `ac-lille`)\n- Académie de Clermont-Ferrand (CAS : `ac-clermont`)\n- Académie de Reims (CAS : `ac-reims`)\n- Académie de Nancy-Metz (CAS : `ac-nancy-metz`)\n- Académie de Strasbourg (CAS : `ac-strasbourg`)\n- Académie de Caen (CAS : `ac-caen`)\n- Académie d'Orleans-Tours (CAS : `ac-orleans-tours`)\n- Académie de Besançon (CAS : `ac-besancon`)\n- Académie de Nantes (CAS : `ac-nantes`)\n- Académie de Bordeaux (CAS : `ac-bordeaux`)\n- Académie de Limoges (CAS : `ac-limoges`)\n- Académie de Poitiers (CAS : `ac-poitiers`)\n- Académie de Dijon (CAS : `ac-dijon`)\n- ENT \"Île de France\" (CAS : `iledefrance`)\n- ENT \"Hauts-de-France\" (CAS : `hdf`)\n- ENT \"Seine-et-Marne\" (CAS : `seine-et-marne`)\n- ENT \"Toutatice\" (Rennes) (CAS : `toutatice`)\n- ENT \"Haute-Garonne\" (CAS : `haute-garonne`)\n- ENT \"Somme\" (CAS : `somme`)\n- ENT \"Agora 06\" (Nice) (CAS : `agora06`)\n- ENT \"Lycee Connecte\" (Nouvelle-Aquitaine) (CAS : `lyceeconnecte`)\n- ENT \"La Classe\" (Lyon) (CAS : `laclasse`)\n\n## Utilisation\n\n### Librairie\n\n```\n$ npm i --save pronote-api\n```\n\n```javascript\nconst pronote = require('pronote-api');\n\n// Exemple\nconst url = 'https://demo.index-education.net/pronote/';\nconst username = 'demonstration';\nconst password = 'pronotevs';\n\nasync function main()\n{\n    const session = await pronote.login(url, username, password/*, cas*/);\n    \n    console.log(session.user.name); // Affiche le nom de l'élève\n    console.log(session.user.studentClass.name); // Affiche la classe de l'élève\n    \n    const timetable = await session.timetable(); // Récupérer l'emploi du temps d'aujourd'hui\n    const marks = await session.marks(); // Récupérer les notes du trimestre\n    \n    console.log(`L'élève a ${timetable.length} cours aujourd'hui`); \n    console.log(`et a pour l'instant une moyenne de ${marks.averages.student} ce trimestre.`);\n    \n    // etc. les fonctions utilisables sont 'timetable', 'marks', 'contents', 'evaluations', 'absences',\n    // 'infos', et 'menu', sans oublier les champs 'user' et 'params' qui regorgent d'informations.\n}\n\nmain().catch(err => {\n    if (err.code === pronote.errors.WRONG_CREDENTIALS.code) {\n        console.error('Mauvais identifiants');    \n    } else {\n        console.error(err);\n    }\n});\n```\n\n#### TypeScript\n\n```typescript\nimport { login } from 'pronote-api';\n\nasync function main()\n{\n    const session = await login(url, username, password/*, cas*/);\n    // ... Voir l'exemple JavaScript\n}\n```\n\n### Serveur GraphQL\n\n```\n$ npm i -g pronote-api\n$ pronote-api-server\n```\n\n**Note : Toutes les requêtes nécessitent la présence du header `Content-Type: application/json`**\n\nPour commencer, il faut se connecter avec une requête `POST` sur `/auth/login` contenant :\n```json\n{\n    \"url\": \"URL de l'instance Pronote\",\n    \"username\": \"Nom d'utilisateur\",\n    \"password\": \"Mot de passe\",\n    \"cas\": \"CAS (facultatif)\"\n}\n```\n\nLe serveur renverra alors une réponse de cette forme :\n```json\n{\n    \"token\": \"UN TOKEN DE SESSION\"  \n}\n```\n\nRetenez le Token, et vous pourrez appeler `POST /auth/logout` et `POST /graphql` **avec en Header `Token: LETOKEN`**,\npour cette dernière le contenu doit être un JSON avec un field `query` contenant votre requête GraphQL.\n\nExemple, pour récupérer les salles des cours du Mercredi 2 Septembre :\n```graphql\n{\n    timetable(from: \"2020-09-02\") {\n        room   \n    }\n}\n```\n\nLe schéma complet des requêtes et mutations se trouve [à cet endroit](https://github.com/Litarvan/pronote-api/blob/master/src/server/schema.graphql) \n\n### Au secours je n'arrive pas à m'y connecter\n\nPar défaut le serveur est ouvert sur `127.0.0.1`, vous ne pouvez donc vous y connecter que depuis la même machine\net avec cette adresse. Pour le lancer le serveur sur une autre adresse ou un autre port, utilisez\n`pronote-api-server PORT HOST`\n\n**ATTENTION : Il n'est pas prévu et probablement peu sécurisé d'ouvrir le serveur sur l'extérieur**\n\n## Conserver la session\n\nUne des nouvelles fonctionnalités de l'API est le fait de pouvoir garder la session envie indéfiniment.\nIl suffit pour ça d'utiliser la fonction `session.setKeepAlive(true);` (ou la mutation `mutation { setKeepAlive(enabled: true) }`).\n\n**ATTENTION : Les sessions dureront à l'infini tant que `session.setKeepAlive(false);` ne sera pas appelé ou le programme arrêté\n(dans le cas du serveur, `mutation { setKeepAlive(enabled: false) }` appelé, `/auth/logout` exécuté ou le serveur arrêté).**\n\n## API bas niveau\n\nIl est très possible que quelque chose dont vous ayez besoin ne soit pas renvoyé par l'API, pas de panique. L'API bas\nniveau permet d'accéder à tout : Les fonctions 'fetch' exportées (fetchHomeworks, fetchTimetable, etc.) permettent\nde récupérer la réponse complète de Pronote simplement traduite sans traitement supplémentaire.\n\nSi jamais une requête dont vous avez besoin n'est pas exportée, vous pouvez utiliser la fonction 'request' qui permet\nde faire facilement une requête à Pronote. Et si vous voulez outrepasser/modifier la partie authentification, vous\npouvez manuellement créer une session.\n","size":448,"stargazers_count":0,"topics":[],"updated_at":"2020-09-19T15:40:50Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":1,"contributors_count":0,"created_at":"2020-10-14T12:10:38Z","default_branch":"main","description":"A little bot made for my friends to display/send cool informations from the french website pronote.","fork":false,"forks_count":0,"full_name":"Ayfri/pronote-bot","homepage":null,"html_url":"https://github.com/Ayfri/pronote-bot","id":304003806,"is_template":false,"language":null,"name":"pronote-bot","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2020-10-14T12:10:41Z","readme_content":"# pronote-bot\nA little bot made for my friends to display/send cool informations from the french website pronote.\n","size":15,"stargazers_count":1,"topics":[],"updated_at":"2020-10-14T13:26:32Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":779,"contributors_count":94,"created_at":"2021-10-27T17:04:53Z","default_branch":"master","description":"Tracking ECMAScript Proposals","fork":true,"forks_count":0,"full_name":"Ayfri/proposals","homepage":"https://tc39.github.io/process-document/","html_url":"https://github.com/Ayfri/proposals","id":421904984,"is_template":false,"language":null,"name":"proposals","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-10-27T14:00:37Z","readme_content":"# [ECMAScript](https://github.com/tc39/ecma262) proposals\n\n* [Stage 1 Proposals](stage-1-proposals.md)\n* [Stage 0 Proposals](stage-0-proposals.md)\n* [Finished Proposals](finished-proposals.md)\n* [Inactive Proposals](inactive-proposals.md)\n\n[ECMAScript Internationalization API Specification](ecma402/README.md) proposals\n\n## Contributing new proposals\n\nPlease see [Contributing to ECMAScript](https://github.com/tc39/ecma262/blob/HEAD/CONTRIBUTING.md) for the most up-to-date information on contributing proposals to this standard.\n\n## Active proposals\n\nProposals follow [this process document](https://tc39.es/process-document/).\nThis list contains only stage 2 proposals and higher that have not yet been withdrawn/rejected, or become finished.\nStage 2 indicates that the committee expects these features to be developed and eventually included in the standard.\n\n### Stage 3\n\n| Proposal                                                                       | Author                                                                  | Champion                                                                | Tests                                            | <sub>Last Presented</sub>                                  |\n| ------------------------------------------------------------------------------ | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------ | ---------------------------------------------------------- |\n| [Legacy RegExp features in JavaScript][regexp-legacy]                          | Claude Pache                                                            | Mark Miller<br />Claude Pache                                           | [:white_check_mark:][tests-regexp-legacy]        | <sub>[May&nbsp;2017][regexp-legacy-notes]</sub>            |\n| [Hashbang Grammar][hashbang-grammar]                                           | Bradley Farias                                                          | Bradley Farias                                                          | [:white_check_mark:][tests-hashbang-grammar]     | <sub>[November&nbsp;2018][hashbang-notes]</sub>            |\n| [`Atomics.waitAsync`][nonblocking]                                             | Lars Hansen                                                             | Shu-yu Guo<br />Lars Hansen                                             | [:white_check_mark:][tests-nonblocking]          | <sub>[December&nbsp;2019][nonblocking-notes]</sub>         |\n| [Import Assertions][import-assertions]                                         | Myles Borins<br />Sven Sauleau<br />Dan Clark<br />Daniel Ehrenberg     | Myles Borins<br />Sven Sauleau<br />Dan Clark<br />Daniel Ehrenberg     | [:white_check_mark:][import-assertions-tests]    | <sub>[November&nbsp;2020][import-assertions-notes]</sub>   |\n| [JSON Modules][json-modules]                                                   | Myles Borins<br />Sven Sauleau<br />Dan Clark<br />Daniel Ehrenberg     | Myles Borins<br />Sven Sauleau<br />Dan Clark<br />Daniel Ehrenberg     | [:white_check_mark:][json-modules-tests]         | <sub>[January&nbsp;2021][json-modules-notes]</sub>         |\n| [Temporal][temporal]                                                           | Philipp Dunkel<br />Maggie Johnson-Pint<br />Matt Johnson-Pint<br />Brian Terlson<br />Shane Carr<br />Ujjwal Sharma<br />Philip Chimento<br />Jason Williams<br />Justin Grant | Philipp Dunkel<br />Maggie Johnson-Pint<br />Matt Johnson-Pint<br />Brian Terlson<br />Shane Carr<br />Ujjwal Sharma<br />Philip Chimento<br />Jason Williams<br />Justin Grant| [:white_check_mark:][temporal-tests] | <sub>[March&nbsp;2021][temporal-notes]</sub> |\n| [Resizable and growable ArrayBuffers][resizable]                               | Shu-yu Guo                                                              | Shu-yu Guo                                                              | [:white_check_mark:][resizable-tests]            | <sub>[May&nbsp;2021][resizable-notes]</sub>                |\n| [Array find from last][find-last]                                              | Wenlu Wang                                                              | Wenlu Wang<br />Daniel Rosenwasser                                      | [:white_check_mark:][find-last-tests]            | <sub>[July&nbsp;2021][find-last-notes]</sub>               |\n| [ShadowRealm][shadowrealm]                                                     | Caridy Patiño<br />Jean-Francois Paradis              | Dave Herman<br />Mark Miller<br />Caridy Patiño<br />Leo Balter                           | [:white_check_mark:][realms-tests]               | <sub>[August&nbsp;2021][realms-notes]</sub>                |\n\n### Stage 2\n\n| Proposal                                                                       | Author                                                | Champion                                                                          | <sub>Last Presented</sub>                                             |\n| ------------------------------------------------------------------------------ | ----------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------- |\n| [`function.sent` metaproperty][function-sent]                                  | Allen Wirfs-Brock                                     | HE Shi-Jun                                                                        | <sub>[July&nbsp;2019][function-sent-notes]</sub>                      |\n| [Decorators][decorators]                                                       | Daniel Ehrenberg                                      | Yehuda Katz<br />Brian Terlson<br />Daniel Ehrenberg<br />Chris Garrett           | <sub>[July&nbsp;2021][decorators-notes]</sub>                         |\n| [`throw` expressions][throw-expressions]                                       | Ron Buckton                                           | Ron Buckton                                                                       | <sub>[January&nbsp;2018][throw-expressions-notes]</sub>               |\n| [Function implementation hiding][censorship]                                   | Domenic Denicola<br />Michael Ficarra                 | Michael Ficarra                                                                   | <sub>[June&nbsp;2020][censorship-notes]</sub>                         |\n| [New Set methods][set-methods]                                                 | Michał Wadas<br />Sathya Gunasekaran                  | Sathya Gunasekaran                                                                | <sub>[January&nbsp;2019][set-methods-notes]</sub>                     |\n| [Sequence properties in Unicode property escapes][unicode-sequence-properties] | Mathias Bynens                                        | Mathias Bynens                                                                    | <sub>[October&nbsp;2019][unicode-sequence-properties-notes]</sub>     |\n| [collection normalization][collection-rekey]                                   | Bradley Farias                                        | Bradley Farias                                                                    | <sub>[January&nbsp;2019][richer-keys-notes]</sub>                     |\n| [Array.isTemplateObject][isTemplateObject]                                     | Mike Samuel, Krzysztof Kotowicz                       | Krzysztof Kotowicz                                                                | <sub>[December&nbsp;2019][isTemplateObject-notes]</sub>               |\n| [Iterator helpers][iterator-helpers]                                           | Gus Caplan                                            | Michael Ficarra<br />Jonathan Keslin                                              | <sub>[July&nbsp;2020][iterator-helpers-notes]</sub>                   |\n| [Explicit Resource Management][resource-management]                            | Ron Buckton                                           | Ron Buckton                                                                       | <sub>[February&nbsp;2020][resource-management-notes]</sub>            |\n| [`Map.prototype.emplace`][map-emplace]                                         | Bradley Farias                                        | Erica Pramer                                                                      | <sub>[July&nbsp;2020][map-emplace-notes]</sub>                        |\n| [Dynamic Import Host Adjustment][]                                             | Mike Samuel, Krzysztof Kotowicz                       | Krzysztof Kotowicz                                                                | <sub>[December&nbsp;2019][Dynamic Import Host Adjustment notes]</sub> |\n| [WeakRefs `cleanupSome`][cleanup-some]                                         | Yulia Startsev<br />Daniel Ehrenberg                  | Yulia Startsev<br />Daniel Ehrenberg                                              | <sub>[July&nbsp;2020][cleanup-some-notes]</sub>                       |\n| [Record & Tuple][record-tuple]                                                 | Robin Ricard<br />Richard Button                      | Robin Ricard<br />Richard Button                                                  | <sub>[September&nbsp;2020][record-tuple-notes]</sub>                  |\n| [JSON.parse source text access][json-parse-source]                             | Richard Gibson                                        | Richard Gibson                                                                    | <sub>[July&nbsp;2020][json-parse-source-notes]</sub>                  |\n| [Module Blocks][module-blocks]                                                 | Surma<br />Daniel Ehrenberg                           | Surma                                                                             | <sub>[January&nbsp;2021][module-blocks-notes]</sub>                   |\n| [Symbols as WeakMap keys][symbols-weakmap]                                     | Daniel Ehrenberg<br />Richard Button<br />Robin Ricard<br />Leo Balter<br />Rick Waldron<br />Caridy Patiño | Daniel Ehrenberg<br />Richard Button<br />Robin Ricard<br />Leo Balter<br />Rick Waldron<br />Caridy Patiño | <sub>[April&nbsp;2021][symbols-weakmap-notes]</sub> |\n| [Adopting Unicode behavior for set notation in regular expressions][regex-set-notation] | Markus Scherer<br />Mathias Bynens           | Mathias Bynens                                                                    | <sub>[May&nbsp;2021][regex-set-notation-notes]</sub>                  |\n| [Change Array by copy][change-array-by-copy]                                   | Robin Ricard                                          | Robin Ricard                                                                      | <sub>[August&nbsp;2021][change-array-by-copy-notes]</sub>             |\n| [Pipeline Operator][pipeline]                                                  | J. S. Choi<br />James DiGioia<br />Ron Buckton<br />Tab Atkins | J. S. Choi<br />Ron Buckton<br />Tab Atkins                              | <sub>[August&nbsp;2021][pipe-notes]</sub>                             |\n| [Destructure Private Fields][destructure-private]                              | Justin Ridgewell                                      | Justin Ridgewell                                                                  | <sub>October 2021</sub>                                               |\n| [Array Grouping][array-grouping]                                               | Justin Ridgewell                                      | Justin Ridgewell                                                                  | <sub>October&nbsp;2021</sub>                                          |\n\n:white_check_mark: means a pull request for tests was merged.\n\n:question: means there is no pull request for tests yet.\n\n:construction: means a pull request for tests was created, but not merged yet.\n\n### Onboarding existing proposals\n\nProposals that are Stage 1 and above must be transferred to [the TC39 GitHub organization](https://github.com/tc39) for discoverability and archival purposes. To onboard a proposal that lives outside the TC39 organization:\n\n1. Transfer your repository to the [@tc39-transfer](http://github.com/tc39-transfer) organization\n  - if you are a TC39 delegate, but not a member of that organization, please contact [@LJHarb](https://github.com/ljharb)\n2. One of the chairs ([@bterlson](https://github.com/bterlson), [@gesa](https://github.com/gesa), [@MylesBorins](https://github.com/MylesBorins), or [@robpalme](https://github.com/robpalme)) will transfer your repository to the TC39 organization the next chance they get.\n\nNote that as part of the onboarding process your repository name may be normalized. Don't worry, repo redirects will continue to work **as long as** you never create a fork, or a new repository, with the same name - although Github Pages redirects will be broken (please update your links!).\n\n[regexp-legacy]: https://github.com/tc39/proposal-regexp-legacy-features\n[regexp-legacy-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2017-05/may-25.md#15ia-regexp-legacy-features-for-stage-3\n[tests-regexp-legacy]: https://github.com/tc39/test262/pull/2650\n[function-sent]: https://github.com/tc39/proposal-function.sent\n[function-sent-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2019-07/july-23.md#making-functionsent-inactive\n[decorators]: https://github.com/tc39/proposal-decorators\n[decorators-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2021-07/july-14.md#decorators-update\n[shadowrealm]: https://github.com/tc39/proposal-shadowrealm\n[realms-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2021-08/aug-31.md#realms-renaming-bikeshedding-thread\n[realms-tests]: https://github.com/tc39/test262/pull/3046\n[temporal]: https://github.com/tc39/proposal-temporal\n[temporal-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2021-03/mar-10.md#temporal-pt-2\n[temporal-tests]: https://github.com/tc39/test262/pulls?q=is%3Apr+is%3Amerged+temporal+in%3Atitle+\n[nonblocking]: https://github.com/tc39/proposal-atomics-wait-async\n[nonblocking-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2019-12/december-4.md#atomicswaitasync-for-stage-3\n[tests-nonblocking]: https://github.com/tc39/test262/issues/2511\n[throw-expressions]: https://github.com/tc39/proposal-throw-expressions\n[throw-expressions-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2018-01/jan-24.md#13iiii-throw-expressions-for-stage-3\n[censorship]: https://github.com/tc39/proposal-function-implementation-hiding\n[censorship-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2020-06/june-2.md#function-implementation-hiding-for-stage-3\n[set-methods]: https://github.com/tc39/proposal-set-methods\n[set-methods-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2019-01/jan-29.md#update-on-set-methods\n[hashbang-grammar]: https://github.com/tc39/proposal-hashbang\n[tests-hashbang-grammar]: https://github.com/tc39/test262/pull/2065\n[hashbang-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2018-11/nov-28.md#hash-bang-grammar\n[richer-keys]: https://github.com/tc39/proposal-richer-keys\n[richer-keys-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2019-01/jan-30.md#richer-keys-for-stage-2\n[unicode-sequence-properties]: https://github.com/tc39/proposal-regexp-unicode-sequence-properties\n[unicode-sequence-properties-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2019-10/october-2.md#update-on-sequence-property-escapes-in-unicode-regular-expressions\n[resource-management]: https://github.com/tc39/proposal-explicit-resource-management\n[resource-management-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2020-02/february-5.md#updates-on-explicit-resource-management\n[standard-library]: https://github.com/tc39/proposal-javascript-standard-library\n[standard-library-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2018-07/july-26.md#javascript-standard-library\n[collection-rekey]: https://github.com/tc39/proposal-collection-normalization\n[iterator-helpers]: https://github.com/tc39/proposal-iterator-helpers\n[iterator-helpers-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2020-07/july-21.md#iterator-helpers-update\n[private-declarations]: https://github.com/tc39/proposal-private-declarations\n[isTemplateObject]: https://github.com/tc39/proposal-array-is-template-object\n[isTemplateObject-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2019-12/december-4.md#arrayistemplateobject-update\n[resource-management-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2018-07/july-24.md#explicit-resource-management\n[map-emplace]: https://github.com/tc39/proposal-upsert\n[map-emplace-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2020-07/july-22.md#upsert-now-renamed-emplace-updates--for-stage-3\n[Dynamic Import Host Adjustment]: https://github.com/tc39/dynamic-import-host-adjustment\n[Dynamic Import Host Adjustment notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2019-12/december-5.md#dynamic-import-host-adjustment-for-stage-2\n[cleanup-some]: https://github.com/tc39/proposal-cleanup-some\n[cleanup-some-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2020-07/july-21.md#weakrefs-for-stage-4--cleanupsome-for-stage-23\n[json-modules]: https://github.com/tc39/proposal-json-modules\n[json-modules-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2021-01/jan-25.md#json-modules-for-stage-3\n[json-modules-tests]: https://github.com/tc39/test262/pull/2999\n[record-tuple]: https://github.com/tc39/proposal-record-tuple\n[record-tuple-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2020-09/sept-22.md#records--tuples\n[json-parse-source]: https://github.com/tc39/proposal-json-parse-with-source\n[json-parse-source-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2020-07/july-22.md#jsonparse-source-text-access-for-stage-2\n[import-assertions]: https://github.com/tc39/proposal-import-assertions\n[import-assertions-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2020-11/nov-17.md#import-assertions-status-update\n[import-assertions-tests]: https://github.com/tc39/test262/pull/2980\n[resizable]: https://github.com/tc39/proposal-resizablearraybuffer\n[resizable-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2021-05/may-25.md#resizable-arraybuffers-for-stage-3\n[resizable-tests]: https://github.com/tc39/test262/pulls?q=is%3Apr+is%3Amerged+resizable+in%3Atitle+\n[module-blocks]: https://github.com/tc39/proposal-js-module-blocks\n[module-blocks-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2021-01/jan-25.md#js-module-blocks\n[find-last]: https://github.com/tc39/proposal-array-find-from-last\n[find-last-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2021-07/july-14.md#array-find-from-last\n[find-last-tests]: https://github.com/tc39/test262/pull/3045\n[symbols-weakmap]: https://github.com/tc39/proposal-symbols-as-weakmap-keys\n[symbols-weakmap-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2021-04/apr-21.md#symbols-as-weakmap-keys-for-stage-2\n[regex-set-notation]: https://github.com/tc39/proposal-regexp-set-notation\n[regex-set-notation-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2021-05/may-26.md#regexp-unicode-set-notation--properties-of-strings-for-stage-2\n[change-array-by-copy]: https://github.com/tc39/proposal-change-array-by-copy\n[change-array-by-copy-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2021-08/aug-31.md#change-array-by-copy\n[pipeline]: https://github.com/tc39/proposal-pipeline-operator\n[pipe-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2021-08/aug-31.md#pipeline-operator-for-stage-2\n[destructure-private]: https://github.com/jridgewell/proposal-destructuring-private\n[array-grouping]: https://github.com/tc39/proposal-array-grouping\n[array-grouping-notes]: https://github.com/tc39/notes/blob/HEAD/meetings/2021-07/july-14.md#array-filtering--grouping-for-stage-2\n","size":1162,"stargazers_count":0,"topics":[],"updated_at":"2021-10-27T17:04:54Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":1,"contributors_count":0,"created_at":"2021-02-16T00:53:02Z","default_branch":"master","description":"A library to get the scale in string or suffix of a bigfloat from the bigfloat.js npm library.","fork":false,"forks_count":0,"full_name":"Ayfri/scale-bigfloat","homepage":null,"html_url":"https://github.com/Ayfri/scale-bigfloat","id":339248901,"is_template":false,"language":null,"name":"scale-bigfloat","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-02-16T00:53:03Z","readme_content":"# scale-bigfloat\nA library to get the scale in string or suffix of a bigfloat from the bigfloat.js npm library.\n","size":14,"stargazers_count":0,"topics":[],"updated_at":"2021-02-16T00:53:07Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":150,"contributors_count":0,"created_at":"2026-02-22T16:33:45Z","default_branch":"main","description":"Quick website for doing shaders tests.","fork":false,"forks_count":0,"full_name":"Ayfri/shayders","homepage":"https://shayders.ayfri.com","html_url":"https://github.com/Ayfri/shayders","id":1164099831,"is_template":false,"language":"TypeScript","name":"shayders","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-03-26T18:07:06Z","readme_content":"# Shayders\n\nA modern, web-based GLSL shader editor for creating and experimenting with fragment shaders in real-time. Built with SvelteKit, featuring multi-buffer rendering, texture channels, and community shader sharing.\n\nCheck out the live demo: [shayders.ayfri.com](https://shayders.ayfri.com)\n\n## Features\n\n### 🎨 Shader Editing\n- **Real-time GLSL editing** with Monaco Editor (same as VS Code)\n- **Syntax highlighting** and error detection for GLSL\n- **Multi-buffer rendering** - create complex effects with up to 4 render passes\n- **Live preview** with WebGL canvas\n\n### 🎯 Built-in Uniforms\nAccess these uniforms in your shaders:\n- `uAspect` (float) - Canvas aspect ratio\n- `uDate` (vec4) - Current date (year, month, day, timeOfDay)\n- `uDeltaTime` (float) - Time since last frame\n- `uFrameCount` (int) - Total frames rendered\n- `uFrameRate` (float) - Current FPS\n- `uMouse` (vec3) - Mouse position (x, y) and button state\n- `uResolution` (vec2) - Canvas resolution\n- `uTime` (float) - Current time in seconds\n\n### 🖼️ Texture Channels\n- **4 texture channels** (uChannel0-uChannel3) for images and videos\n- Direct-to-R2 uploads for authenticated users with worker-based image optimization and client-side validation\n- Support for PNG, JPG, GIF, WebP, AVIF, MP4, and WebM files\n- Automatic texture binding and sampling\n\n### 🌐 Community Features\n- **Shader sharing** - Publish and discover community shaders\n- **User profiles** - View shaders by author\n- **Live previews** on shader cards\n- **Authentication** with email verification\n\n### 🚀 Performance\n- **WebGL optimized** rendering\n- **Thumbnail generation** for quick previews\n- **Efficient multi-pass** rendering pipeline\n- **Cloudflare Workers** deployment for global CDN\n\n\n## Technologies Used\n\n- Built with [SvelteKit](https://svelte.dev/docs/kit/introduction) and [Svelte 5](https://svelte.dev/blog/svelte-5)\n- Uses [Monaco Editor](https://microsoft.github.io/monaco-editor/) for code editing\n- [PocketBase](https://pocketbase.io/) for database/backend services\n- [Tailwind CSS](https://tailwindcss.com/) for styling\n- [Lucide](https://lucide.dev/) for icons\n- Inspired by Shadertoy\n\n### Key Components\n\n- **ShaderCanvas**: Handles WebGL rendering, uniform binding, and multi-buffer pipeline\n- **GlslEditor**: Monaco-based editor with GLSL syntax highlighting\n- **ChannelsPanel**: Texture channel management\n- **BuiltinsPanel**: Uniform documentation and controls\n- **ShaderPreview**: Live thumbnail generation for shader cards\n\n### Environment Setup\n\nMake sure to configure these environment variables in your Cloudflare Workers environment:\n\n- `PUBLIC_POCKETBASE_URL` - Your PocketBase instance URL\n- Database connection settings for PocketBase\n\nFor direct shader asset uploads through Cloudflare R2, add these variables as well:\n\n- `R2_ACCOUNT_ID` - Your Cloudflare account ID\n- `R2_ACCESS_KEY_ID` - R2 access key ID with write access to the bucket\n- `R2_SECRET_ACCESS_KEY` - Matching R2 secret access key\n- `R2_BUCKET_NAME` - Bucket that stores image and video shader assets\n- `R2_PUBLIC_BASE_URL` - Public asset domain or bucket domain served with CORS enabled\n- `R2_S3_ENDPOINT` - Optional override for the S3-compatible endpoint\n\n### R2 Asset Limits\n\nThe editor enforces these defaults for authenticated uploads:\n\n- Images: `2 MB` max, `2048x2048` max, optimized/compressed in a worker before upload\n- Videos: `10 MB` max, `1920x1080` max, `30 seconds` max\n- Per-user storage quota: `50 MB`\n\n### R2 Bucket CORS\n\nWebGL texture uploads require permissive cross-origin reads on the public asset domain. A working baseline for the R2 bucket is:\n\n```json\n[\n\t{\n\t\t\"AllowedOrigins\": [\n\t\t\t\"http://localhost:5173\",\n\t\t\t\"https://shayders.example.com\"\n\t\t],\n\t\t\"AllowedMethods\": [\"GET\", \"HEAD\", \"PUT\"],\n\t\t\"AllowedHeaders\": [\"*\"],\n\t\t\"ExposeHeaders\": [\"ETag\"],\n\t\t\"MaxAgeSeconds\": 3600\n\t}\n]\n```\n\nUse a dedicated public domain such as `assets.your-domain.com` for `R2_PUBLIC_BASE_URL`, and keep the bucket private except for that public asset route.\n\n## License\n\nThis project is licensed under the GNU General Public License v3.0 - see the [LICENSE](LICENSE) file for details.\n","size":771,"stargazers_count":1,"topics":["glsl","shader","shaders","shadertoy","webgl"],"updated_at":"2026-03-26T18:07:11Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":18,"contributors_count":2,"created_at":"2021-02-17T20:22:16Z","default_branch":"master","description":null,"fork":true,"forks_count":0,"full_name":"Ayfri/ts-pixi","homepage":"","html_url":"https://github.com/Ayfri/ts-pixi","id":339846085,"is_template":true,"language":"TypeScript","name":"ts-pixi","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-06-05T12:11:29Z","readme_content":"# ESBuild Template for pixi.js\n\n- Gulp\n- TypeScript\n- Browser reloading\n\n[Use this template](https://github.com/ESBuildTemplates/ts-pixi/generate)","size":1644,"stargazers_count":0,"topics":[],"updated_at":"2021-06-05T12:11:31Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":72,"contributors_count":0,"created_at":"2020-10-01T19:53:36Z","default_branch":"master","description":"A public Discord bot to test TypeScript on Discord.","fork":false,"forks_count":1,"full_name":"Ayfri/tsc","homepage":null,"html_url":"https://github.com/Ayfri/tsc","id":300407087,"is_template":false,"language":"TypeScript","name":"tsc","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-03-24T17:33:12Z","readme_content":"![GitHub repo size](https://img.shields.io/github/repo-size/Ayfri/tsc)\n![deno version](https://img.shields.io/badge/deno-1.8.1-grey?logo=deno)\n\n![Banner](./assets/TSC-Bot%20banner.png)\n\n# TSC Bot\n\nTSC-Bot is a discord bot made in TypeScript using Deno and the [Harmony](https://github.com/harmonyland/harmony) module.\n\nIts purpose is to offer fun and utils commands for TypeScript/JavaScript/other developers on Discord.\n\n## How to use it\n\nI recommend you to clone the project and put your own token & owners, so you will be able to use all the commands.\nBecause some, like the `eval` command, can damage your machine if anyone can use it.\nSo most of the commands are private in the bot I use.<br>\nYou can see an example of what to put into the `.env` file into the [.env.example file](./.env.example);\n\nHowever, you can still invite the bot with [this link](https://discord.com/oauth2/authorize?client_id=801974521133269053&scope=bot&permissions=289856).\n","size":299,"stargazers_count":2,"topics":[],"updated_at":"2021-06-12T22:46:42Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":291,"contributors_count":34,"created_at":"2021-01-23T12:44:13Z","default_branch":"master","description":"A simple darker theme for typedoc, with also white icons.","fork":true,"forks_count":0,"full_name":"Ayfri/typedoc-darker-theme","homepage":"","html_url":"https://github.com/Ayfri/typedoc-darker-theme","id":332208026,"is_template":false,"language":"Handlebars","name":"typedoc-darker-theme","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-06-14T09:02:59Z","readme_content":"# Typedoc Darker Theme\n\nThis is a simple darker theme for [typedoc](https://github.com/TypeStrong/typedoc).\n","size":2018,"stargazers_count":0,"topics":["dark","dark-theme","documentation","typedoc"],"updated_at":"2021-06-17T16:37:40Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":38,"contributors_count":0,"created_at":"2021-06-05T12:30:05Z","default_branch":"master","description":"A shooter game like the old arcade ones.","fork":false,"forks_count":0,"full_name":"Ayfri/void-shooter","homepage":null,"html_url":"https://github.com/Ayfri/void-shooter","id":374109083,"is_template":false,"language":"TypeScript","name":"void-shooter","open_issues_count":1,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-09-01T04:25:01Z","readme_content":"# Void Shooter\n\nVoid shooter is a little arcade shooter game I'm making for fun.<br>\nThere is no place to test it for now, but you can still clone the repo and build it !\n\n## How to build\n\n1. Clone the repo.\n2. Make sure to have at least Node.js v16 installed on your system.\n3. Run `npm run start`.\n","size":61,"stargazers_count":0,"topics":[],"updated_at":"2021-06-17T17:17:00Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":38,"contributors_count":0,"created_at":"2026-03-19T20:36:21Z","default_branch":"main","description":"Another voxel game, made with Kool in Kotlin.","fork":false,"forks_count":0,"full_name":"Ayfri/voxel-game","homepage":null,"html_url":"https://github.com/Ayfri/voxel-game","id":1186629034,"is_template":false,"language":"Kotlin","name":"voxel-game","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2026-03-20T00:17:24Z","readme_content":"# Voxel\n\nA simple Minecraft-like voxel engine built with Kotlin and the Kool Engine, using Vulkan (via JVM).\n\n## Features\n\n- **Voxel Rendering**: Efficiently renders large chunks of voxels using a custom shader and texture arrays.\n- **Infinite Generation**: Procedural world generation using Simplex noise.\n- **Player Physics**: Includes walking, jumping, collision detection, and step assistance.\n- **Noclip Mode**: Fly through the world with adjustable speed.\n- **Dynamic Loading**: Chunks are loaded and generated around the player based on render distance.\n\n## Controls\n\n- **W, A, S, D**: Move forward, left, backward, and right.\n- **Space**: Jump (or fly up in noclip).\n- **Shift**: Descend (in noclip).\n- **N**: Toggle Noclip mode.\n- **R**: Regenerate world with a new random seed.\n- **Enter**: Respawn at the center of the world.\n- **Esc**: Unlock cursor.\n- **Left/Right/Middle Click**: Lock cursor to control camera.\n- **Mouse Scroll**: Adjust flight speed (when in noclip).\n\n## Prerequisites\n\n- **Java 25**: This project uses the latest Java features (like foreign function access for Vulkan).\n- **Vulkan Compatible Hardware**: Ensure your drivers support Vulkan.\n\n## Getting Started\n\nTo run the project, use the Gradle wrapper:\n\n```bash\n./gradlew run\n```\n\n## Project Structure\n\n- `src/main/kotlin/main.kt`: Entry point and scene setup.\n- `src/main/kotlin/world.kt`: World and chunk management, procedural generation logic.\n- `src/main/kotlin/player.kt`: Player state, physics, and collision logic.\n- `src/main/kotlin/PlayerControls.kt`: Input handling and camera control.\n- `src/main/kotlin/WorldManager.kt`: Bridges the world data and the rendering engine (mesh generation).\n- `src/main/kotlin/noise.kt`: Simplex noise implementation.\n\n## Dependencies\n\n- [Kool Engine](https://github.com/fabmax/kool): A high-performance multi-platform game engine for Kotlin.\n\n## License\n\nThis project is licensed under the terms of the LICENSE file included in the repository.\n","size":151,"stargazers_count":0,"topics":[],"updated_at":"2026-03-20T00:17:28Z","visibility":"public","watchers_count":0},{"archived":true,"commits_count":223,"contributors_count":4,"created_at":"2020-06-28T20:46:17Z","default_branch":"master","description":"A TypeScript game made with the PIXI.js library and WebPack.","fork":false,"forks_count":1,"full_name":"Ayfri/2d-minecraft","homepage":"","html_url":"https://github.com/Ayfri/2d-minecraft","id":275665392,"is_template":false,"language":"TypeScript","name":"2d-minecraft","open_issues_count":13,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2022-04-08T22:15:21Z","readme_content":"<!-- Badges-->\n\n![Codacy grade](https://img.shields.io/codacy/grade/1abacd35dbe04806bf5c54192874930e?logo=codacy&style=for-the-badge)\n![GitHub repo size](https://img.shields.io/github/repo-size/ayfri/2d-minecraft?style=for-the-badge)\n![GitHub top language](https://img.shields.io/github/languages/top/ayfri/2d-minecraft?logo=typescript&logoColor=%2329f&style=for-the-badge)\n![Website](https://img.shields.io/website?style=for-the-badge&url=http%3A%2F%2F51.91.39.85%3A8080%2F)\n\n# 2d-Minecraft\n\nThis is a 2d-game made in TypeScript with the PIXI.js library and WebPack.\n\nThis game does not have a site where to play it although you can download the files and launch it locally.\n\n# Important :\n\nI'm remaking this game in Kotlin and archiving this repo, for now there's [this repo with the new game](https://github.com/Ayfri/Minekraft-2D).\n\n## Contributing\n\nTo start the game with the code, do this :\n1. Clone the repo with this command : `git clone https://github.com/Ayfri/2d-minecraft.git`.\n2. Then install the dependencies using the `npm i` command.\n3. Then run the `start` script (in the `package.json`) using the `npm run start` command.\n4. Finally, open [this link](http://localhost:3000/index.html).\n\n## Features\n\nYou can place blocks with the left click.\n\nYou can reset the world with the `reset` button on the up left corner.\n\n| Key          | Block        |\n| ------------ | ------------ |\n| `&` (or `1`) | First Slot   |\n| `é` (or `2`) | Second Slot  |\n| `\"` (or `3`) | Third Slot   |\n| `'` (or `4`) | Fourth Slot  |\n| `(` (or `5`) | Fifth Slot   |\n| `-` (or `6`) | Sixth Slot   |\n| `è` (or `7`) | Seventh Slot |\n| `_` (or `8`) | Eighth Slot  |\n| `ç` (or `9`) | Ninth Slot   |\n","size":15132,"stargazers_count":11,"topics":["2d-minecraft","game","minecraft","pixi-library","pixijs","typescript","webpack"],"updated_at":"2023-01-28T01:44:54Z","visibility":"public","watchers_count":0},{"archived":true,"commits_count":139,"contributors_count":3,"created_at":"2019-02-01T22:34:43Z","default_branch":"master","description":"La deuxième version de mon bot discord.","fork":false,"forks_count":0,"full_name":"Ayfri/AyBot-2","homepage":"https://aybot.tk","html_url":"https://github.com/Ayfri/AyBot-2","id":168768965,"is_template":false,"language":"JavaScript","name":"AyBot-2","open_issues_count":13,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-08-02T11:20:14Z","readme_content":"# AyBot 2\nAyBot 2 est un bot Discord francophonne développé par Ayfri.\n\nIl a diverses fonctions dont : modération/administration/divers/fun et bien d'autres.\n\nIl est développé avec Discord.js depuis le 23 janvier 2019.\n\nIl est hébergé par Skariie_.\n\nCE BOT EST ENTIÈREMENT EN FRANÇAIS !\nIl sera plus tard potentiellement disponible en anglais.\n\nElle fonctionne grâce à un command handler, le fichier index est chargé au lancement du bot, ensuite il charge chaques évènements puis chaques commandes séparéments.\n\nCela me permet d'avoir un bon contrôle sur le bot, de pouvoir exports plusieurs modules (comme l'aide, la config etc...) et d'avoir des commandes tel le reload.\n\n\n\n#### TOUTE COPIE NON AUTORISÉE DE CES FICHIERS DANS UN BOT VOUS FERA AJOUTER DANS LA BLACKLIST DU BOT + UNE MAUVAISE RÉPUTATION\n","size":3579,"stargazers_count":0,"topics":[],"updated_at":"2024-01-21T11:44:37Z","visibility":"public","watchers_count":0},{"archived":true,"commits_count":247,"contributors_count":3,"created_at":"2020-03-28T15:52:01Z","default_branch":"master","description":"A Minecraft like made with p5.js in TypeScript.","fork":false,"forks_count":0,"full_name":"Ayfri/TypeCraft","homepage":null,"html_url":"https://github.com/Ayfri/TypeCraft","id":250834838,"is_template":false,"language":"TypeScript","name":"TypeCraft","open_issues_count":13,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2021-02-03T13:54:24Z","readme_content":"# TypeCraft\n\nThis is a Minecraft-Like made in TypeScript.\n\n## Controls\n\n| Key | Action       |\n| --- | ------------ |\n| Z   | Go toward.   |\n| S   | Go backward. |\n| Q   | Go left.     |\n| D   | Go right.    |\n\n## Where to play it ?\n\nHere : https://ayfri.github.io/TypeCraft/\n","size":2729,"stargazers_count":1,"topics":["minecraft","typescript","webpack"],"updated_at":"2023-01-28T10:44:56Z","visibility":"public","watchers_count":0},{"archived":true,"commits_count":232,"contributors_count":2,"created_at":"2021-02-12T23:13:57Z","default_branch":"master","description":"[DEPRECATED] A simple clicker game with the theme of atoms.","fork":false,"forks_count":3,"full_name":"Ayfri/atom-clicker-pixi","homepage":"https://atom-clicker.ayfri.com","html_url":"https://github.com/Ayfri/atom-clicker-pixi","id":338455394,"is_template":false,"language":"TypeScript","name":"atom-clicker-pixi","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2025-12-23T13:53:16Z","readme_content":"# [Deperecated] Check the new version here : [Atom-Clicker](https://github.com/Ayfri/Atom-Clicker)\n\n# atom-clicker-pixi\n\nA simple clicker game with the theme of atoms.\n","size":282,"stargazers_count":4,"topics":["clicker-game","game","idle-game","pixi","typescript"],"updated_at":"2025-12-23T13:53:32Z","visibility":"public","watchers_count":0},{"archived":true,"commits_count":2,"contributors_count":0,"created_at":"2023-07-05T09:56:20Z","default_branch":"master","description":null,"fork":false,"forks_count":0,"full_name":"Ayfri/kotlin-js-esmodules-bug","homepage":null,"html_url":"https://github.com/Ayfri/kotlin-js-esmodules-bug","id":662517701,"is_template":false,"language":"Kotlin","name":"kotlin-js-esmodules-bug","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2023-07-05T12:27:53Z","readme_content":null,"size":113,"stargazers_count":0,"topics":[],"updated_at":"2025-09-30T13:10:50Z","visibility":"public","watchers_count":0},{"archived":true,"commits_count":73,"contributors_count":3,"created_at":"2020-07-16T22:24:27Z","default_branch":"master","description":"A discord bot for parsing the MDN documentation.","fork":false,"forks_count":0,"full_name":"Ayfri/mdn-bot-parser","homepage":"","html_url":"https://github.com/Ayfri/mdn-bot-parser","id":280271070,"is_template":false,"language":"JavaScript","name":"mdn-bot-parser","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2020-12-14T02:47:17Z","readme_content":"[![Codacy Badge](https://api.codacy.com/project/badge/Grade/4e8ced46b44844a7a4f71911551c5428)](https://app.codacy.com/gh/Ayfri/mdn-bot-parser?utm_source=github.com&utm_medium=referral&utm_content=Ayfri/mdn-bot-parser&utm_campaign=Badge_Grade)\n![GitHub last commit](https://img.shields.io/github/last-commit/Ayfri/mdn-bot-parser)\n![Lines of code](https://img.shields.io/tokei/lines/github/Ayfri/mdn-bot-parser?label=total%20lines%20of%20code)\n\n# MDN-Bot-Parser\n\nMDN Bot Parser is a Discord French bot (it will be translated) made in Javascript using the `discord.js` library.\n\nIts purpose is to send information about a native classes or a native function from the MDN Documentation.\n\n## Links\n\nInvite it with [this link](https://discord.com/oauth2/authorize?client_id=742373313199866009&scope=bot&permissions=388160).\n","size":285,"stargazers_count":5,"topics":["discord-bot","documentation","javascript","mdn"],"updated_at":"2023-01-28T11:28:54Z","visibility":"public","watchers_count":0},{"archived":true,"commits_count":55,"contributors_count":0,"created_at":"2021-01-15T13:01:07Z","default_branch":"master","description":"A portal game made in TypeScript using PIXI.","fork":false,"forks_count":1,"full_name":"Ayfri/portal-2d","homepage":null,"html_url":"https://github.com/Ayfri/portal-2d","id":329913275,"is_template":false,"language":"TypeScript","name":"portal-2d","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34159136?v=4","events_url":"https://api.github.com/users/Ayfri/events{/privacy}","followers_url":"https://api.github.com/users/Ayfri/followers","following_url":"https://api.github.com/users/Ayfri/following{/other_user}","gists_url":"https://api.github.com/users/Ayfri/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Ayfri","id":34159136,"login":"Ayfri","node_id":"MDQ6VXNlcjM0MTU5MTM2","organizations_url":"https://api.github.com/users/Ayfri/orgs","received_events_url":"https://api.github.com/users/Ayfri/received_events","repos_url":"https://api.github.com/users/Ayfri/repos","site_admin":false,"starred_url":"https://api.github.com/users/Ayfri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ayfri/subscriptions","type":"User","url":"https://api.github.com/users/Ayfri"},"private":false,"pushed_at":"2025-01-20T04:16:09Z","readme_content":"# portal-2d\n\nA portal game made in TypeScript using PIXI.\n","size":2948,"stargazers_count":1,"topics":[],"updated_at":"2026-02-21T23:32:37Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":430,"contributors_count":3,"created_at":"2022-11-14T09:05:24Z","default_branch":"main","description":"Social network made in PHP","fork":false,"forks_count":1,"full_name":"Bahsiik/Instachat","homepage":null,"html_url":"https://github.com/Bahsiik/Instachat","id":565755915,"is_template":false,"language":"PHP","name":"Instachat","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/91200603?v=4","events_url":"https://api.github.com/users/Bahsiik/events{/privacy}","followers_url":"https://api.github.com/users/Bahsiik/followers","following_url":"https://api.github.com/users/Bahsiik/following{/other_user}","gists_url":"https://api.github.com/users/Bahsiik/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Bahsiik","id":91200603,"login":"Bahsiik","node_id":"MDQ6VXNlcjkxMjAwNjAz","organizations_url":"https://api.github.com/users/Bahsiik/orgs","received_events_url":"https://api.github.com/users/Bahsiik/received_events","repos_url":"https://api.github.com/users/Bahsiik/repos","site_admin":false,"starred_url":"https://api.github.com/users/Bahsiik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Bahsiik/subscriptions","type":"User","url":"https://api.github.com/users/Bahsiik"},"private":false,"pushed_at":"2022-12-18T22:27:22Z","readme_content":"<p align=\"center\">\n    <a href=\"https://www.gnu.org/licenses/gpl-3.0.html\"><img src=\"https://img.shields.io/github/license/Bahsiik/Instachat?style=flat-square\" alt=\"GitHub\"></a>\n    <a href=\"https://github.com/Bahsiik/Instachat/commits/main\"><img src=\"https://flat.badgen.net/github/commits/Bahsiik/Instachat/main?color=green&amp;icon=github\" alt=\"commits\"></a>\n</p>\n<p align=\"center\">\n    <img alt=\"Instachat-Icon\" src=\"https://github.com/Bahsiik/Instachat/blob/main/static/images/logo-orange.png?raw=true\" width=\"150\"/><br>\n</p>\n\n# Instachat\n\n* [Instachat](#instachat)\n* [Setup](#setup)\n    * [Requirements](#requirements)\n    * [Installation](#installation)\n* [Contributing](#contributing)\n    * [Coding standards](#coding-standards)\n    * [Documentation](#documentation)\n* [Testing](#testing)\n* [License](#license)\n* [Authors](#authors)\n\nInstachat is a social network made in PHP and MySQL. It is a simple social network that allows you to create an account, add friends, send messages, and more.\n\n# Setup\n\n## Requirements\n\n- PHP 8.1\n- MySQL 8.0\n- Composer 2.4.4\n\n## Installation\n\nLaunch composer to install the dependencies:\n\n```bash\ncomposer install\n```\n\nCreate a database named `instachat` and import the `dump.sql` file.\n\nRun the following command to start the server:\n\n```bash\nphp -S localhost:port -t public\n```\n\n# Contributing\n\nWe welcome contributions to Instachat! If you would like to contribute, please follow these steps:\n\n1. Fork the repository.\n2. Create a new branch for your changes.\n3. Make your changes and test them thoroughly.\n4. Submit a pull request to the main repository with a description of the changes you made and any relevant information.\n   Before submitting your pull request, please make sure that your code follows our [coding standards](#coding-standards).\n\nWe use GitHub for our version control and pull request workflow. However, we are not using any GitHub Actions.\n\nThank you for considering contributing to Instachat!\n\n## Coding standards\n\n- 4 tab indentation\n- 160 characters per line maximum\n- Multiple classes per file.\n- Following the rules of PSR-4 for naming conventions and other standards\n- Use of PHPDoc for documentation\n- Use of the `@var` tag for variables.\n- Short array syntax.\n- Short echo tags.\n- Use of new features from our version of PHP like null coalescing operator, match expression, enum etc.\n\n## Documentation\n\nWe document every function and class in our code. We use PHPDoc for this.\nEvery function and class should have a description of what it does, what parameters it takes, and what it returns (or nothing if it returns `void`).\n\n# Testing\n\nWe do not have any tests for Instachat.<br>\nEvery tests are made manually, if you are contributing to Instachat, please make sure that your code works before submitting a pull request.\n\n# License\n\n[GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.html)\n\n# Authors\n\n- [**@Ayfri**](https://github.com/Ayfri) - Lead developer\n- [**@antaww**](https://github.com/antaww) - Developer\n- [**@Bahsiik**](https://github.com/Bahsiik) - Developer\n","size":1203,"stargazers_count":3,"topics":[],"updated_at":"2023-01-31T20:56:50Z","visibility":"public","watchers_count":2},{"archived":false,"commits_count":124,"contributors_count":3,"created_at":"2023-04-17T07:37:51Z","default_branch":"main","description":null,"fork":false,"forks_count":1,"full_name":"Bahsiik/Slicer-n-Sprinkles","homepage":null,"html_url":"https://github.com/Bahsiik/Slicer-n-Sprinkles","id":628890452,"is_template":false,"language":"ASP.NET","name":"Slicer-n-Sprinkles","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/91200603?v=4","events_url":"https://api.github.com/users/Bahsiik/events{/privacy}","followers_url":"https://api.github.com/users/Bahsiik/followers","following_url":"https://api.github.com/users/Bahsiik/following{/other_user}","gists_url":"https://api.github.com/users/Bahsiik/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Bahsiik","id":91200603,"login":"Bahsiik","node_id":"MDQ6VXNlcjkxMjAwNjAz","organizations_url":"https://api.github.com/users/Bahsiik/orgs","received_events_url":"https://api.github.com/users/Bahsiik/received_events","repos_url":"https://api.github.com/users/Bahsiik/repos","site_admin":false,"starred_url":"https://api.github.com/users/Bahsiik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Bahsiik/subscriptions","type":"User","url":"https://api.github.com/users/Bahsiik"},"private":false,"pushed_at":"2023-05-22T21:17:45Z","readme_content":"﻿# Slicer & Sprinkles\n<!-- TOC -->\n* [Slicer & Sprinkles](#slicer--sprinkles)\n  * [Engine](#engine)\n  * [Standards](#standards)\n    * [Code](#code)\n    * [Files & Folders](#files--folders)\n    * [Git](#git)\n    * [License](#license)\n    * [Authors](#authors)\n<!-- TOC -->\nA fruit-ninja-like in the theme of bakery. You cut ingredients to make a cake at the end of the round.\n\n## Engine\n\nThe game is made with [Unity 3D](https://unity.com/).\n\n## Standards\n\n### Code\n\nC# code is formatted with Rider settings.\nBraces are on a new line.\n140 characters per line.\nTab size is 4 and is used for indentation.\n\nUse `var` when possible.\nDo not use explicit types when it can be inferred.\nUse short syntax for getters.\nUse LINQ when possible.\n\n\n**Naming conventions:**\n\n- Automatic properties: `PascalCase`\n- Classes: `PascalCase`\n- Constants: `PascalCase`\n- Delegates: `PascalCase`\n- Enum values: `PascalCase`\n- Enums: `PascalCase`\n- Events: `PascalCase`\n- Fields: `PascalCase`\n- Interfaces: `PascalCase`\n- Methods: `PascalCase`\n- Namespaces: `PascalCase`\n- Private fields: `_camelCase`\n- Private static fields: `_camelCase`\n- Properties: `PascalCase`\n- Structs: `PascalCase`\n- Type parameters: `PascalCase`\n- Variables: `camelCase`\n\n**Example:**\n\n```csharp\npublic class MyClass : MonoBehaviour\n{\n    private int _myField;\n    public int MyProperty { get; set; }\n    public int MyMethod(int myParameter) => myParameter.ToString();\n    \n    private void Start()\n    {\n        _myField = 0;\n        MyProperty = 0;\n        MyMethod(0);\n        \n        var myVariable = 0;\n        // LINQ\n        var myLinqVariable = myVariable\n            .Where(x => x > 0)\n            .Select(x => x * 2)\n            .ToList();\n    }\n}\n```\n\n### Files & Folders\n\n- Folders are `PascalCase`\n- Files are `PascalCase`\n- Files are named after the class they contain\n\nAssets are organized in folders by type.\n- `Animations`\n- `Audio`\n- `Fonts`\n- `Materials`\n- `Models`\n- `Prefabs`\n- `Scenes`\n- `Scripts`\n- `Shaders`\n- `Sprites`\n- `Textures`\n- `UI`\n- `Video`\n\n### Git\n\n- Commit messages are in English\n- Commit messages are in the present tense\n\nStructure of a commit message:\n```\ntype(scope): subject\n\nCloses #issue-number[..., closes #other-issue-number]\n```\n\nTypes :\n- `chore` : updating build tasks, package manager configs, etc; no production code change\n- `docs` : changes to documentation\n- `feat` : new feature\n- `fix` : bug fix\n- `perf` : performance improvement*\n- `refactor` : refactoring production code\n- `style` : formatting, missing semi colons, etc; no code change\n- `tweak` : small change to existing feature, like changing a color or a value\n\nScope is in one or two words, describing the part of the code that is affected by the commit, with a space between the two words and everything lowercase.\n\nSubject is a short description of the change, with a capital letter and no dot at the end.\n\nCloses is used to close issues automatically when the commit is merged, each commit should close at least one issue appart if it is tiny.\n\nCommit regexp:\n```regexp\n(chore|docs|feat|fix|perf|refactor|style|tweak)(\\(.*\\)): [A-Z].*\\.(\\s+Closes #\\d+(, closes #\\d+)*)?\n```\n\n**Example:**\n\n```\nfeat(ingredients): Add new ingredient.\n\nCloses #42\n```\n\n```\ntweak(bombs): Change time before explosion.\n```\n\n### License\n\nThis project is licensed under the GNU General Public License v3.0 - see the [LICENSE](LICENSE) file for details.\n\n### Authors\n\n- [@Bahsiik](https://github.com/Bahsiik)\n- [@Ayfri](https://github.com/Ayfri)\n- [@xhmyjae](https://github.com/xhmyjae)\n","size":142598,"stargazers_count":3,"topics":[],"updated_at":"2023-11-05T01:10:16Z","visibility":"public","watchers_count":2},{"archived":false,"commits_count":9,"contributors_count":0,"created_at":"2019-04-20T00:37:02Z","default_branch":"master","description":"A discord bot that translate words, sentences and all that.","fork":false,"forks_count":0,"full_name":"Bethoth/TradBot","homepage":null,"html_url":"https://github.com/Bethoth/TradBot","id":182341562,"is_template":false,"language":"JavaScript","name":"TradBot","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/45798269?v=4","events_url":"https://api.github.com/users/Bethoth/events{/privacy}","followers_url":"https://api.github.com/users/Bethoth/followers","following_url":"https://api.github.com/users/Bethoth/following{/other_user}","gists_url":"https://api.github.com/users/Bethoth/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Bethoth","id":45798269,"login":"Bethoth","node_id":"MDQ6VXNlcjQ1Nzk4MjY5","organizations_url":"https://api.github.com/users/Bethoth/orgs","received_events_url":"https://api.github.com/users/Bethoth/received_events","repos_url":"https://api.github.com/users/Bethoth/repos","site_admin":false,"starred_url":"https://api.github.com/users/Bethoth/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Bethoth/subscriptions","type":"User","url":"https://api.github.com/users/Bethoth"},"private":false,"pushed_at":"2019-05-24T14:13:03Z","readme_content":"## Welcome to GitHub Pages\n\nYou can use the [editor on GitHub](https://github.com/ThePizzaDu62/TradBot/edit/master/README.md) to maintain and preview the content for your website in Markdown files.\n\nWhenever you commit to this repository, GitHub Pages will run [Jekyll](https://jekyllrb.com/) to rebuild the pages in your site, from the content in your Markdown files.\n\n### Markdown\n\nMarkdown is a lightweight and easy-to-use syntax for styling your writing. It includes conventions for\n\n```markdown\nSyntax highlighted code block\n\n# Header 1\n## Header 2\n### Header 3\n\n- Bulleted\n- List\n\n1. Numbered\n2. List\n\n**Bold** and _Italic_ and `Code` text\n\n[Link](url) and ![Image](src)\n```\n\nFor more details see [GitHub Flavored Markdown](https://guides.github.com/features/mastering-markdown/).\n\n### Jekyll Themes\n\nYour Pages site will use the layout and styles from the Jekyll theme you have selected in your [repository settings](https://github.com/ThePizzaDu62/TradBot/settings). The name of this theme is saved in the Jekyll `_config.yml` configuration file.\n\n### Support or Contact\n\nHaving trouble with Pages? Check out our [documentation](https://help.github.com/categories/github-pages-basics/) or [contact support](https://github.com/contact) and we’ll help you sort it out.\n","size":10,"stargazers_count":1,"topics":[],"updated_at":"2020-01-15T17:37:17Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":58,"contributors_count":3,"created_at":"2024-10-11T15:58:51Z","default_branch":"main","description":null,"fork":false,"forks_count":0,"full_name":"Cat-aclsym/documentation","homepage":"https://cat-aclsym.github.io/documentation/docs/dashboard","html_url":"https://github.com/Cat-aclsym/documentation","id":871273270,"is_template":false,"language":"TypeScript","name":"documentation","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/148934081?v=4","events_url":"https://api.github.com/users/Cat-aclsym/events{/privacy}","followers_url":"https://api.github.com/users/Cat-aclsym/followers","following_url":"https://api.github.com/users/Cat-aclsym/following{/other_user}","gists_url":"https://api.github.com/users/Cat-aclsym/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Cat-aclsym","id":148934081,"login":"Cat-aclsym","node_id":"O_kgDOCOCNwQ","organizations_url":"https://api.github.com/users/Cat-aclsym/orgs","received_events_url":"https://api.github.com/users/Cat-aclsym/received_events","repos_url":"https://api.github.com/users/Cat-aclsym/repos","site_admin":false,"starred_url":"https://api.github.com/users/Cat-aclsym/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Cat-aclsym/subscriptions","type":"Organization","url":"https://api.github.com/users/Cat-aclsym"},"private":false,"pushed_at":"2026-04-12T14:00:59Z","readme_content":"# Website\n\nThis website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator.\n\n### Installation\n\n```\n$ bun install\n```\n\n### Local Development\n\n```\n$ bun run start\n```\n\nThis command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.\n\n### Build\n\n```\n$ bun run build\n```\n\nThis command generates static content into the `build` directory and can be served using any static contents hosting service.\n\n### Deployment\n\nDeployment is handled automatically by GitHub Actions on pushes to `main`.\nThe workflow lives in [.github/workflows/upload-pages-artifact.yml](.github/workflows/upload-pages-artifact.yml).\n\nFor local validation, use `bun run build` before pushing.\n","size":1957,"stargazers_count":0,"topics":[],"updated_at":"2026-04-12T14:01:04Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":150,"contributors_count":4,"created_at":"2019-10-30T12:17:19Z","default_branch":"master","description":"Repo du projet Galileo Bot","fork":false,"forks_count":0,"full_name":"Galileo-Bot/galileo-legacy","homepage":"","html_url":"https://github.com/Galileo-Bot/galileo-legacy","id":218520478,"is_template":false,"language":"JavaScript","name":"galileo-legacy","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/72460170?v=4","events_url":"https://api.github.com/users/Galileo-Bot/events{/privacy}","followers_url":"https://api.github.com/users/Galileo-Bot/followers","following_url":"https://api.github.com/users/Galileo-Bot/following{/other_user}","gists_url":"https://api.github.com/users/Galileo-Bot/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Galileo-Bot","id":72460170,"login":"Galileo-Bot","node_id":"MDEyOk9yZ2FuaXphdGlvbjcyNDYwMTcw","organizations_url":"https://api.github.com/users/Galileo-Bot/orgs","received_events_url":"https://api.github.com/users/Galileo-Bot/received_events","repos_url":"https://api.github.com/users/Galileo-Bot/repos","site_admin":false,"starred_url":"https://api.github.com/users/Galileo-Bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Galileo-Bot/subscriptions","type":"Organization","url":"https://api.github.com/users/Galileo-Bot"},"private":false,"pushed_at":"2025-07-25T14:09:37Z","readme_content":"# Galileo\n\n**Galileo était un bot Discord francophone** développé par  **[Ayfri](https://github.com/Ayfri)**  et géré par  **[Antow](https://github.com/Antoww)**.\n\nCe bot **résulte de la fusion** entre __AyBot__ et __Bot'O'Matic__, Ayfri et Antow étant amis, ils ont **décidé de réunir les deux bots** en un pour unir leur force.\n\nVous pourrez trouver dessus de nombreuses commandes de tout genre, par exemple vous pouvez générer des mèmes, avoir plein d'informations sur Discord, ses utilisateurs et ses serveurs, modérer votre serveur ou encore des utilitaires pour développeurs.\n\nLe bot est pour l'instant écrit en JavaScript avec son propre handler et pleins d'outils codés spécialement pour.\n\n## **Le projet est arrêté depuis le 17 septembre 2021.**\n\n## Badges\n\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/0aa0d7d84b314b3480fbafd044c5aa88)](https://www.codacy.com?utm_source=github.com&utm_medium=referral&utm_content=Galileo-Bot/galileo&utm_campaign=Badge_Grade)\n![GitHub release (latest by date)](https://img.shields.io/github/v/release/Galileo-Bot/galileo?label=Version)\n![GitHub code size](https://img.shields.io/github/languages/code-size/Galileo-Bot/galileo?logo=github&label=Code%20size)\n![GitHub search hit counter](https://img.shields.io/github/search/Galileo-Bot/Galileo/todo?label=Todo%20counter&logo=webstorm)\n![GitHub commits since tagged version](https://img.shields.io/github/commits-since/Galileo-Bot/galileo/1.1.0?logo=github&label=Commits%20since%20last%20release)\n","size":327,"stargazers_count":2,"topics":["disccord-bot","discordjs","galileo"],"updated_at":"2024-09-14T21:02:10Z","visibility":"public","watchers_count":2},{"archived":true,"commits_count":23,"contributors_count":3,"created_at":"2025-02-11T11:24:05Z","default_branch":"main","description":"Machine learning repository for Master 1 project ","fork":false,"forks_count":0,"full_name":"HerySon/teaching_ml_bis_2025","homepage":null,"html_url":"https://github.com/HerySon/teaching_ml_bis_2025","id":930885715,"is_template":true,"language":"Jupyter Notebook","name":"teaching_ml_bis_2025","open_issues_count":61,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/25180765?v=4","events_url":"https://api.github.com/users/HerySon/events{/privacy}","followers_url":"https://api.github.com/users/HerySon/followers","following_url":"https://api.github.com/users/HerySon/following{/other_user}","gists_url":"https://api.github.com/users/HerySon/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/HerySon","id":25180765,"login":"HerySon","node_id":"MDQ6VXNlcjI1MTgwNzY1","organizations_url":"https://api.github.com/users/HerySon/orgs","received_events_url":"https://api.github.com/users/HerySon/received_events","repos_url":"https://api.github.com/users/HerySon/repos","site_admin":false,"starred_url":"https://api.github.com/users/HerySon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/HerySon/subscriptions","type":"User","url":"https://api.github.com/users/HerySon"},"private":false,"pushed_at":"2025-03-27T10:12:44Z","readme_content":"# Project description\n\nThis is the final project for my machine learning class\n\n## Content directories\n\n- data: store here your small additional datasets (<50Mo)\n- models : store your trained models\n- tests: store here your code dedicated to small tests \n- notebooks: store here your notebooks dedicated to analyses\n- scripts: store here your code structured as python packages for automation of your workflow\n- results : store here your results (pictures, model performance, ... )\n\n## Steps to start working on the project\n\n### 0. Initialize conda\n\nwith powershell (for widows users) : \n\n```zsh\nconda init powershell\n```\n\nor bash-like shells (linux & macOS users):\n\n```zsh\nconda init\n```\n### 1. Create a new virtual environment and activate it \nwith pyenv virtualenv:\n```bash\n\tpyenv virtualenv clustering_OFF && pyenv activate clustering_OFF\n```\nor conda:\n```bash\n\tconda clustering_OFF && conda activate clustering_OFF\n```\n### 2. Install required librairies \n\n```bash\n  \tpip install -r requirements\n```\n\nWhile you work on the project, don't forget to update the`requirements.txt`\n\n### 3. Start coding\nYou can look at `notebooks/project_starter.ipynb` for your first steps : \n- load data set \n","size":5380,"stargazers_count":1,"topics":[],"updated_at":"2026-03-04T18:07:15Z","visibility":"public","watchers_count":2},{"archived":false,"commits_count":22,"contributors_count":0,"created_at":"2024-05-11T22:48:05Z","default_branch":"main","description":"A template repository for creating a Kore project. ","fork":false,"forks_count":2,"full_name":"Kore-Minecraft/Kore-Template","homepage":null,"html_url":"https://github.com/Kore-Minecraft/Kore-Template","id":799361700,"is_template":true,"language":"Kotlin","name":"Kore-Template","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/204369550?v=4","events_url":"https://api.github.com/users/Kore-Minecraft/events{/privacy}","followers_url":"https://api.github.com/users/Kore-Minecraft/followers","following_url":"https://api.github.com/users/Kore-Minecraft/following{/other_user}","gists_url":"https://api.github.com/users/Kore-Minecraft/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Kore-Minecraft","id":204369550,"login":"Kore-Minecraft","node_id":"O_kgDODC5ujg","organizations_url":"https://api.github.com/users/Kore-Minecraft/orgs","received_events_url":"https://api.github.com/users/Kore-Minecraft/received_events","repos_url":"https://api.github.com/users/Kore-Minecraft/repos","site_admin":false,"starred_url":"https://api.github.com/users/Kore-Minecraft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Kore-Minecraft/subscriptions","type":"Organization","url":"https://api.github.com/users/Kore-Minecraft"},"private":false,"pushed_at":"2026-04-28T12:51:39Z","readme_content":"# Kore Datapack Template for Minecraft\n\nWelcome to the Kore Datapack Template project! This repository is designed to be a starting point for Minecraft enthusiasts and developers\nlooking to create custom datapacks with ease. By leveraging the power of the [Kore](https://kore.ayfri.com) library, you can streamline your\ndevelopment workflow and bring your creative Minecraft ideas to life.\n\n## Getting Started\n\nBefore you begin, ensure you have the following prerequisite installed on your system:\n\n- Java Development Kit (JDK) version 21 or higher\n\n## Setting Up Your Development Environment\n\nTo set up your development environment, follow these simple steps:\n\n1. Clone the repository to your local machine:\n    ```shell\n    git clone https://github.com/Ayfri/Kore-Template.git\n    ```\n2. Change directory to the newly cloned repository:\n    ```shell\n    cd yourreponame\n    ```\n3. Execute the project to generate your datapack:\n    ```shell\n    ./gradlew run\n    ```\n\nAfter running the project, you'll find the generated datapack in the `out` directory, ready to be used in your Minecraft world.\n\n## Making Changes to Your Datapack\n\nWhen you're ready to make changes or updates to your datapack:\n\n- Edit the `Main.kt` file with your desired changes, then rerun the project to apply them.\n- If you need to update the Kore library or Kotlin version, adjust the `libs.versions.toml` file as needed, and rerun the project to ensure\n  the changes take effect.\n\n## Frequently Asked Questions (FAQ)\n\n- **Q:** How do I add a new function to the datapack?\n- **A:** Use the `function` keyword to create a new function and write your code within it.\n\n- **Q:** How do I add a new tag to the datapack?\n- **A:** Use the `tag` keyword to create a new tag and include your elements within it.\n\nFor detailed instructions and best practices on using the Kore library, refer to\nthe [official Kore documentation](https://kore.ayfri.com/docs/home).\n\n## Contributing to the Project\n\nYour contributions are what make the community great. We encourage you to contribute to the project by forking the repository, making your\nimprovements, and submitting a pull request with your changes. Together, we can make the Kore Datapack Template even better!\n\nThank you for supporting the project, and happy Datapacking!\n","size":125,"stargazers_count":4,"topics":["datapacks","kore","kore-minecraft","templates"],"updated_at":"2026-04-28T12:51:43Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":25,"contributors_count":4,"created_at":"2025-03-24T08:36:32Z","default_branch":"main","description":null,"fork":false,"forks_count":0,"full_name":"Mkheir13/Openfoodfacts","homepage":null,"html_url":"https://github.com/Mkheir13/Openfoodfacts","id":953887082,"is_template":false,"language":"Jupyter Notebook","name":"Openfoodfacts","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/91200651?v=4","events_url":"https://api.github.com/users/Mkheir13/events{/privacy}","followers_url":"https://api.github.com/users/Mkheir13/followers","following_url":"https://api.github.com/users/Mkheir13/following{/other_user}","gists_url":"https://api.github.com/users/Mkheir13/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Mkheir13","id":91200651,"login":"Mkheir13","node_id":"MDQ6VXNlcjkxMjAwNjUx","organizations_url":"https://api.github.com/users/Mkheir13/orgs","received_events_url":"https://api.github.com/users/Mkheir13/received_events","repos_url":"https://api.github.com/users/Mkheir13/repos","site_admin":false,"starred_url":"https://api.github.com/users/Mkheir13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Mkheir13/subscriptions","type":"User","url":"https://api.github.com/users/Mkheir13"},"private":false,"pushed_at":"2025-04-14T09:55:33Z","readme_content":"# Open Food Facts - Analyse de Données et Clustering\n\nCe projet fournit une application web Streamlit pour analyser et appliquer des algorithmes de clustering sur les données de produits alimentaires d'Open Food Facts. Il permet aux utilisateurs de téléverser un jeu de données (ou d'utiliser un échantillon), de le prétraiter et d'appliquer divers algorithmes de clustering.\n\n## ✨ Fonctionnalités Principales\n\n*   **Chargement et Prétraitement Interactif :** Chargez vos données CSV ou utilisez un échantillon. Appliquez des étapes de nettoyage et de préparation configurables.\n*   **Clustering Avancé :** Appliquez K-Means, DBSCAN, ou GMM avec optimisation des hyperparamètres et sélection des caractéristiques.\n*   **Visualisation Intuitive :** Explorez les clusters via des graphiques PCA 2D et 3D, et analysez les caractéristiques distinctives de chaque groupe.\n*   **Export et Sauvegarde :** Téléchargez les données prétraitées et sauvegardez les modèles de clustering entraînés.\n\n## 🚀 Installation et Configuration\n\n**Prérequis :**\n\n*   Python (version 3.8+ recommandée)\n*   pip (gestionnaire de paquets Python)\n*   Git (pour cloner le dépôt)\n\n**Étapes :**\n\n1.  **Cloner le dépôt :**\n    ```bash\n    git clone <url_du_depot>\n    cd <repertoire_du_projet>\n    ```\n\n2.  **Créer un Environnement Virtuel et Installer les Dépendances :**\n    Il est fortement recommandé d'utiliser un environnement virtuel pour isoler les dépendances.\n    *   **Création :**\n        ```bash\n        python -m venv .venv\n        ```\n    *   **Activation :**\n        *   Windows (PowerShell/CMD) : `.\\.venv\\Scripts\\activate`\n        *   Linux/macOS (bash/zsh) : `source .venv/bin/activate`\n        *(L'invite de commande indiquera que l'environnement `.venv` est actif)*\n    *   **Installation des dépendances :**\n        ```bash\n        pip install -r requirements.txt\n        ```\n    *   **Désactivation (quand terminé) :** `deactivate`\n    *(N'oubliez pas de réactiver l'environnement pour utiliser le projet)*\n\n3.  **Préparer les Données :**\n    *   **Option A : Télécharger le jeu de données complet :** Le fichier `config.yaml` pointe vers le jeu de données anglais (`https://static.openfoodfacts.org/data/en.openfoodfacts.org.products.csv`). Téléchargez-le et placez-le dans un dossier `data/`.\n    *   **Option B : Créer un échantillon :** Pour un démarrage rapide, utilisez le script `create_reduced_file.py` sur le fichier complet téléchargé.\n        ```bash\n        # Crée data/reduced/full_datas_100000.csv (100 000 lignes)\n        python create_reduced_file.py data/en.openfoodfacts.org.products.csv 100000\n        ```\n        L'application proposera d'utiliser cet échantillon s'il est trouvé.\n\n## ▶️ Utilisation de l'Application Streamlit\n\n1.  **Lancer l'application :**\n    Assurez-vous que votre environnement virtuel est activé, puis exécutez :\n    ```bash\n    streamlit run app.py\n    ```\n    L'application s'ouvrira dans votre navigateur web (généralement `http://localhost:8501`).\n\n2.  **Interface Utilisateur :**\n    L'application est divisée en deux onglets principaux :\n    *   `📊 Preprocessing`\n    *   `🧠 Clustering`\n\n3.  **Onglet `📊 Preprocessing` :**\n    *   **Chargement :**\n        *   Utilisez le bouton \"Browse files\" pour téléverser votre propre fichier CSV (séparateur tabulation `\\t` attendu).\n        *   Si un fichier échantillon (`data/reduced/full_datas_100000.csv`) existe, un bouton \"Utiliser le fichier échantillon par défaut\" apparaîtra. Cliquez dessus pour le charger.\n        *   Un aperçu (`.head()`) des données chargées s'affiche.\n    *   **Nettoyage et Prétraitement :**\n        *   Ajustez les paramètres de prétraitement dans la barre latérale (Sidebar) si nécessaire :\n            *   *Nombre max de catégories* : Pour la conversion des variables catégorielles.\n            *   *Ratio min de valeurs uniques* : Pour la sélection de caractéristiques.\n        *   Cliquez sur le bouton \"Lancer le Preprocessing\".\n        *   Le processus effectue plusieurs étapes (extraction numérique, préparation des caractéristiques pour le clustering) avec des indicateurs de progression (`spinner`).\n        *   Un **Résumé du Nettoyage** s'affiche (dimensions avant/après, colonnes/lignes supprimées).\n        *   **Sauvegarder les données :** Les données prétraitées sont automatiquement sauvegardées dans `data/preprocessed/` (ex: `full_datas_100000_preprocessed.csv`).\n        *   Un bouton **\"Télécharger le CSV Prétraité\"** apparaît pour récupérer ce fichier.\n    *   Un aperçu des données prétraitées est affiché. Vous pouvez maintenant passer à l'onglet Clustering.\n\n4.  **Onglet `🧠 Clustering` :**\n    *   **Chargement des données prétraitées :**\n        *   Si vous venez de terminer le prétraitement dans l'onglet précédent, les données sont déjà chargées.\n        *   Sinon, un avertissement apparaît. Vous pouvez téléverser un fichier CSV **prétraité** existant via le bouton \"Browse files\".\n    *   **Configuration :**\n        *   **Sélection des Colonnes :** Choisissez les colonnes numériques (préalablement nettoyées et mises à l'échelle implicitement par la suite) à utiliser pour le clustering dans la liste déroulante `multiselect`.\n        *   **Choix de l'Algorithme :** Sélectionnez \"K-Means\", \"DBSCAN\", ou \"GMM\" dans la liste déroulante `selectbox`.\n        *   **Configuration de l'Algorithme :** Des options spécifiques apparaissent en fonction de l'algorithme choisi :\n            *   **K-Means/GMM :**\n                *   *Optimisation du nombre de clusters/composantes :* Définissez une plage (`min`/`max`) et une méthode d'évaluation (`scoring_method` : silhouette, etc.). Cochez/décochez la case pour activer/désactiver la recherche automatique du nombre optimal.\n                *   *Configuration de l'entraînement :* Définissez le nombre de clusters/composantes (si l'optimisation est désactivée), la méthode d'optimisation des paramètres (`optimize_method`), et d'autres hyperparamètres (max_iter, init, etc.).\n                *   *Sauvegarde :* Cochez la case pour sauvegarder le modèle entraîné et spécifiez le chemin (`.pkl`).\n            *   **DBSCAN :**\n                *   Ajustez `eps` et `min_samples` via les sliders.\n    *   **Lancer le Clustering :** Cliquez sur le bouton \"Lancer le Clustering [Nom de l'Algo]\".\n    *   **Résultats :**\n        *   Le temps d'entraînement est affiché.\n        *   Les métriques de performance (Score Silhouette, Calinski-Harabasz, Davies-Bouldin) sont présentées.\n        *   Le nombre de clusters trouvés (et de points de bruit pour DBSCAN) est indiqué.\n        *   **Visualisations :** Des graphiques PCA en 2D et 3D montrent la répartition des points colorés par cluster.\n        *   **Aperçu des Données :** Un tableau (`dataframe`) montre les premières lignes des données avec la colonne `cluster` assignée.\n        *   **Analyse des Clusters :** Pour chaque cluster trouvé, les caractéristiques ayant les moyennes les plus élevées et les plus distinctives (par rapport à la moyenne globale) sont listées pour aider à interpréter les groupes.\n\n## 📂 Structure du Projet\n\n```\n├── .venv/           # Environnement virtuel Python (si créé ici)\n├── .streamlit/      # Configuration Streamlit (si existante)\n├── data/            # Fichiers de données (brutes, réduites, prétraitées)\n│   ├── reduced/       # Jeux de données échantillonnés\n│   └── preprocessed/  # Jeux de données prétraités sauvegardés\n├── models/          # Modèles de clustering sauvegardés\n├── notebooks/       # Notebooks Jupyter pour l'exploration (si existants)\n├── results/         # Résultats d'analyse (si sauvegardés)\n├── scripts/         # Modules Python principaux\n│   ├── data/        # Scripts de chargement, nettoyage, échantillonnage des données\n│   ├── features/    # Scripts d'ingénierie des caractéristiques (scaling, etc.)\n│   └── models/      # Implémentations des algorithmes de clustering\n├── tests/           # Tests unitaires et d'intégration\n├── .gitignore       # Fichiers/dossiers ignorés par Git\n├── app.py           # Fichier principal de l'application Streamlit\n├── config.yaml      # Configuration (ex: chemins des données)\n├── create_reduced_file.py # Script pour créer des échantillons de données\n├── MANIFEST.in      # Fichier manifeste pour le packaging\n├── README.md        # Ce fichier\n├── requirements.txt # Dépendances Python\n├── setup.py         # Script pour packager le projet\n└── ...              # Autres fichiers de configuration\n```\n","size":1756,"stargazers_count":1,"topics":[],"updated_at":"2025-05-13T14:44:36Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":5,"contributors_count":2,"created_at":"2025-06-18T09:45:42Z","default_branch":"main","description":null,"fork":false,"forks_count":0,"full_name":"Mkheir13/Planeas","homepage":null,"html_url":"https://github.com/Mkheir13/Planeas","id":1004219011,"is_template":false,"language":"Jupyter Notebook","name":"Planeas","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/91200651?v=4","events_url":"https://api.github.com/users/Mkheir13/events{/privacy}","followers_url":"https://api.github.com/users/Mkheir13/followers","following_url":"https://api.github.com/users/Mkheir13/following{/other_user}","gists_url":"https://api.github.com/users/Mkheir13/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Mkheir13","id":91200651,"login":"Mkheir13","node_id":"MDQ6VXNlcjkxMjAwNjUx","organizations_url":"https://api.github.com/users/Mkheir13/orgs","received_events_url":"https://api.github.com/users/Mkheir13/received_events","repos_url":"https://api.github.com/users/Mkheir13/repos","site_admin":false,"starred_url":"https://api.github.com/users/Mkheir13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Mkheir13/subscriptions","type":"User","url":"https://api.github.com/users/Mkheir13"},"private":false,"pushed_at":"2025-07-01T12:57:07Z","readme_content":null,"size":7177,"stargazers_count":0,"topics":[],"updated_at":"2025-07-01T12:57:11Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":25,"contributors_count":4,"created_at":"2025-06-18T07:10:14Z","default_branch":"master","description":null,"fork":false,"forks_count":0,"full_name":"Trit0on/projet-hackathon","homepage":null,"html_url":"https://github.com/Trit0on/projet-hackathon","id":1004137761,"is_template":false,"language":"Svelte","name":"projet-hackathon","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/121338916?v=4","events_url":"https://api.github.com/users/Trit0on/events{/privacy}","followers_url":"https://api.github.com/users/Trit0on/followers","following_url":"https://api.github.com/users/Trit0on/following{/other_user}","gists_url":"https://api.github.com/users/Trit0on/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/Trit0on","id":121338916,"login":"Trit0on","node_id":"U_kgDOBzt8JA","organizations_url":"https://api.github.com/users/Trit0on/orgs","received_events_url":"https://api.github.com/users/Trit0on/received_events","repos_url":"https://api.github.com/users/Trit0on/repos","site_admin":false,"starred_url":"https://api.github.com/users/Trit0on/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Trit0on/subscriptions","type":"User","url":"https://api.github.com/users/Trit0on"},"private":false,"pushed_at":"2025-06-18T10:16:24Z","readme_content":"","size":25992,"stargazers_count":0,"topics":[],"updated_at":"2025-06-18T10:16:27Z","visibility":"public","watchers_count":0},{"archived":false,"commits_count":6,"contributors_count":2,"created_at":"2023-12-08T14:49:51Z","default_branch":"main","description":"Spotify X Deezer","fork":false,"forks_count":0,"full_name":"antaww/Spotizer","homepage":null,"html_url":"https://github.com/antaww/Spotizer","id":729156052,"is_template":false,"language":null,"name":"Spotizer","open_issues_count":10,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/37218401?v=4","events_url":"https://api.github.com/users/antaww/events{/privacy}","followers_url":"https://api.github.com/users/antaww/followers","following_url":"https://api.github.com/users/antaww/following{/other_user}","gists_url":"https://api.github.com/users/antaww/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/antaww","id":37218401,"login":"antaww","node_id":"MDQ6VXNlcjM3MjE4NDAx","organizations_url":"https://api.github.com/users/antaww/orgs","received_events_url":"https://api.github.com/users/antaww/received_events","repos_url":"https://api.github.com/users/antaww/repos","site_admin":false,"starred_url":"https://api.github.com/users/antaww/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/antaww/subscriptions","type":"User","url":"https://api.github.com/users/antaww"},"private":false,"pushed_at":"2023-12-08T15:15:28Z","readme_content":"# Spotizer\nSpotify X Deezer\n2K24\n","size":16,"stargazers_count":2,"topics":[],"updated_at":"2024-04-13T19:18:32Z","visibility":"public","watchers_count":3},{"archived":false,"commits_count":172,"contributors_count":2,"created_at":"2025-01-17T11:13:54Z","default_branch":"main","description":"A modern, reactive todo list application with real-time updates, multiple lists support, and a beautiful glassmorphism design.","fork":false,"forks_count":0,"full_name":"antaww/todo-list","homepage":"https://realtime-todolist.pages.dev","html_url":"https://github.com/antaww/todo-list","id":918159269,"is_template":false,"language":"Svelte","name":"todo-list","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/37218401?v=4","events_url":"https://api.github.com/users/antaww/events{/privacy}","followers_url":"https://api.github.com/users/antaww/followers","following_url":"https://api.github.com/users/antaww/following{/other_user}","gists_url":"https://api.github.com/users/antaww/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/antaww","id":37218401,"login":"antaww","node_id":"MDQ6VXNlcjM3MjE4NDAx","organizations_url":"https://api.github.com/users/antaww/orgs","received_events_url":"https://api.github.com/users/antaww/received_events","repos_url":"https://api.github.com/users/antaww/repos","site_admin":false,"starred_url":"https://api.github.com/users/antaww/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/antaww/subscriptions","type":"User","url":"https://api.github.com/users/antaww"},"private":false,"pushed_at":"2025-07-17T12:54:36Z","readme_content":"# ✨ Svelte Todo List\n\n[![Live Demo](https://img.shields.io/badge/Live%20Demo-realtime--todolist.pages.dev-brightgreen)](https://realtime-todolist.pages.dev/)\n\nA modern, reactive todo list application built with Svelte, TypeScript, and Supabase. Features real-time updates, multiple lists support, and a beautiful\nglassmorphism design.\n\n## 🚀 Features\n\n- ✅ Real-time updates with Supabase\n- 📝 Multiple todo lists support\n- 🎨 Modern glassmorphism UI design\n- 🔄 Smooth animations and transitions\n- ⚡ Optimistic updates for instant feedback\n- 🔼 Task reordering with up/down arrows\n- 📱 Fully responsive design\n- 🔄 Automatic polling fallback for real-time updates\n- 🖊️ Inline editing for todos and list titles\n- 🎯 Focus mode while editing\n- 🗑️ Automatic cleanup of empty lists\n\n## 🛠️ Tech Stack\n\n- [Svelte](https://svelte.dev/) - Frontend framework\n- [TypeScript](https://www.typescriptlang.org/) - Type safety\n- [Tailwind CSS](https://tailwindcss.com/) - Styling\n- [Supabase](https://supabase.com/) - Backend and real-time updates\n- [Vite](https://vitejs.dev/) - Build tool\n- [PNPM](https://pnpm.io/) - Package manager\n\n## 🏗️ Project Structure\n\n```\ntodo-list/\n├── src/\n│   ├── lib/\n│   │   ├── TodoList.svelte    # Main todo list component\n│   │   ├── supabase.ts        # Supabase client configuration\n│   │   └── types.ts           # TypeScript interfaces\n│   ├── App.svelte             # Root component\n│   ├── app.css                # Global styles\n│   └── main.ts                # Application entry point\n└── supabase/                  # Supabase configuration and migrations\n```\n\n## 🚦 Getting Started\n\n1. Clone the repository:\n\n```bash\ngit clone https://github.com/antaww/todo-list.git\ncd todo-list\n```\n\n2. Install dependencies:\n\n```bash\npnpm install\n```\n\n3. Create a `.env` file with your Supabase credentials:\n\n```env\nVITE_SUPABASE_URL=your_supabase_url\nVITE_SUPABASE_ANON_KEY=your_supabase_anon_key\n```\n\n4. Start the development server:\n\n```bash\npnpm run dev\n```\n\n## 📝 Database Schema\n\n### Todos Table\n\n```sql\nCREATE TABLE todos (\n  id TEXT PRIMARY KEY,\n  title TEXT NOT NULL,\n  completed BOOLEAN DEFAULT FALSE,\n  order INTEGER,\n  list_id TEXT NOT NULL,\n  created_at TIMESTAMPTZ DEFAULT NOW()\n);\n```\n\n### Lists Table\n\n```sql\nCREATE TABLE lists (\n  id TEXT PRIMARY KEY,\n  title TEXT NOT NULL DEFAULT 'Untitled List',\n  created_at TIMESTAMPTZ DEFAULT NOW()\n);\n\n-- Enable Row Level Security\nALTER TABLE lists ENABLE ROW LEVEL SECURITY;\n\n-- Allow public access\nCREATE POLICY \"Allow public access on lists\"\n  ON lists\n  FOR ALL\n  TO public\n  USING (true)\n  WITH CHECK (true);\n```\n\n## 🔄 Real-time Updates\n\nThe application uses Supabase's real-time functionality to keep todos synchronized across all clients. As a fallback mechanism, it also implements polling to\nensure updates are received even if the real-time connection is interrupted.\n\n## 🧹 Automatic Cleanup\n\nEmpty lists (lists without any todos) are automatically cleaned up from the database to maintain data consistency. This is handled by a SQL trigger that removes\nlists when their last todo is deleted.\n\n## 🤝 Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n","size":856,"stargazers_count":1,"topics":[],"updated_at":"2025-07-17T12:54:40Z","visibility":"public","watchers_count":2},{"archived":false,"commits_count":50,"contributors_count":0,"created_at":"2021-06-15T15:07:01Z","default_branch":"master","description":"The plugin for WesterosRP","fork":false,"forks_count":0,"full_name":"loockeeer/westerosrp","homepage":"","html_url":"https://github.com/loockeeer/westerosrp","id":377204014,"is_template":false,"language":"Kotlin","name":"westerosrp","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/34001773?v=4","events_url":"https://api.github.com/users/loockeeer/events{/privacy}","followers_url":"https://api.github.com/users/loockeeer/followers","following_url":"https://api.github.com/users/loockeeer/following{/other_user}","gists_url":"https://api.github.com/users/loockeeer/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/loockeeer","id":34001773,"login":"loockeeer","node_id":"MDQ6VXNlcjM0MDAxNzcz","organizations_url":"https://api.github.com/users/loockeeer/orgs","received_events_url":"https://api.github.com/users/loockeeer/received_events","repos_url":"https://api.github.com/users/loockeeer/repos","site_admin":false,"starred_url":"https://api.github.com/users/loockeeer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/loockeeer/subscriptions","type":"User","url":"https://api.github.com/users/loockeeer"},"private":false,"pushed_at":"2021-06-30T18:23:08Z","readme_content":"# Westeros RP\n\n**Westeros RP** is a french private role-play minecraft server\n The game is similar to Fallen Kingdoms but lasts longer.\n\n## Build\n\nYou need 2 requirements to build the plugin :\n```\nKotlin 1.15.10\nGradle 7.0.2\n```\n\nOnce you have them, you can build it using the gradle script `build`\n\n## Usage\n\nThis plugin uses Spigot 1.17, but you can also use it with Paper \n\nAlso, the plugins depends on :\n```\nWorldGuard\nWorldEdit\nLuckperms\nProtocolLib\n```\n\nOnce you have them in your ``plugin`` folder, you can launch the server and start playing with your friends !\n","size":95,"stargazers_count":1,"topics":[],"updated_at":"2021-06-30T18:23:11Z","visibility":"public","watchers_count":2},{"archived":false,"commits_count":56,"contributors_count":2,"created_at":"2024-01-26T10:36:19Z","default_branch":"main","description":"Cat In Space UPDATED NEW VERSION 2.0 /!\\/!\\/!\\","fork":false,"forks_count":0,"full_name":"xhmyjae/stats-in-space","homepage":null,"html_url":"https://github.com/xhmyjae/stats-in-space","id":748595836,"is_template":false,"language":"Jupyter Notebook","name":"stats-in-space","open_issues_count":0,"owner":{"avatar_url":"https://avatars.githubusercontent.com/u/91200733?v=4","events_url":"https://api.github.com/users/xhmyjae/events{/privacy}","followers_url":"https://api.github.com/users/xhmyjae/followers","following_url":"https://api.github.com/users/xhmyjae/following{/other_user}","gists_url":"https://api.github.com/users/xhmyjae/gists{/gist_id}","gravatar_id":"","html_url":"https://github.com/xhmyjae","id":91200733,"login":"xhmyjae","node_id":"MDQ6VXNlcjkxMjAwNzMz","organizations_url":"https://api.github.com/users/xhmyjae/orgs","received_events_url":"https://api.github.com/users/xhmyjae/received_events","repos_url":"https://api.github.com/users/xhmyjae/repos","site_admin":false,"starred_url":"https://api.github.com/users/xhmyjae/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xhmyjae/subscriptions","type":"User","url":"https://api.github.com/users/xhmyjae"},"private":false,"pushed_at":"2024-02-16T08:50:44Z","readme_content":null,"size":31194,"stargazers_count":1,"topics":[],"updated_at":"2024-02-16T10:11:39Z","visibility":"public","watchers_count":2}]}