├── .npmrc
├── apps
├── api
│ ├── src
│ │ ├── assets
│ │ │ └── .gitkeep
│ │ ├── auth
│ │ │ ├── decorators
│ │ │ │ ├── index.ts
│ │ │ │ └── auth.decorator.ts
│ │ │ ├── services
│ │ │ │ └── index.ts
│ │ │ ├── strategies
│ │ │ │ └── index.ts
│ │ │ ├── repositories
│ │ │ │ ├── index.ts
│ │ │ │ └── user.repository.ts
│ │ │ ├── serializers
│ │ │ │ ├── index.ts
│ │ │ │ └── auth.serializer.ts
│ │ │ ├── exceptions
│ │ │ │ ├── index.ts
│ │ │ │ └── invalid-token.exception.ts
│ │ │ ├── guards
│ │ │ │ ├── index.ts
│ │ │ │ └── twitch-auth.guard.ts
│ │ │ └── auth.module.ts
│ │ ├── admin
│ │ │ ├── gateways
│ │ │ │ └── index.ts
│ │ │ ├── repositories
│ │ │ │ ├── index.ts
│ │ │ │ ├── skin.repository.ts
│ │ │ │ ├── action.repository.ts
│ │ │ │ └── skin-collection.repository.ts
│ │ │ ├── twitch
│ │ │ │ └── token-revoked.exception.ts
│ │ │ ├── controllers
│ │ │ │ ├── index.ts
│ │ │ │ ├── action.controller.ts
│ │ │ │ ├── user.controller.ts
│ │ │ │ └── session.controller.ts
│ │ │ ├── services
│ │ │ │ ├── index.ts
│ │ │ │ ├── chat-message.service.ts
│ │ │ │ └── sprite.service.ts
│ │ │ ├── exceptions
│ │ │ │ └── twitch-http.exception.ts
│ │ │ └── filters
│ │ │ │ └── twitch-http-exception.filter.ts
│ │ ├── app
│ │ │ └── controllers
│ │ │ │ ├── index.ts
│ │ │ │ └── app.controller.ts
│ │ ├── constants.ts
│ │ ├── database
│ │ │ ├── seed
│ │ │ │ ├── skins
│ │ │ │ │ ├── dudes.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── actions
│ │ │ │ │ ├── resurrect.ts
│ │ │ │ │ ├── add_jump_hits.ts
│ │ │ │ │ ├── color.ts
│ │ │ │ │ ├── sprite.ts
│ │ │ │ │ ├── dash.ts
│ │ │ │ │ ├── grow.ts
│ │ │ │ │ ├── jump.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── commands
│ │ │ │ │ └── index.ts
│ │ │ │ └── seed.ts
│ │ │ ├── database.module.ts
│ │ │ └── prisma.service.ts
│ │ ├── instruments.ts
│ │ ├── pipes
│ │ │ └── zod.pipe.ts
│ │ └── filters
│ │ │ └── zod.filter.ts
│ ├── eslint.config.mjs
│ ├── tsconfig.build.json
│ ├── prisma
│ │ └── migrations
│ │ │ ├── migration_lock.toml
│ │ │ ├── 20240121195332_add_action_data_command_data
│ │ │ └── migration.sql
│ │ │ ├── 20240117143624_add_settings_table
│ │ │ └── migration.sql
│ │ │ └── 20240411135958_chatter
│ │ │ └── migration.sql
│ ├── nest-cli.json
│ ├── .env.example
│ └── tsconfig.json
├── admin
│ ├── src
│ │ ├── assets
│ │ │ └── .gitkeep
│ │ ├── vite-env.d.ts
│ │ ├── lib
│ │ │ └── utils.ts
│ │ ├── components
│ │ │ ├── common
│ │ │ │ └── Loader.tsx
│ │ │ ├── Auth
│ │ │ │ └── use-auth.tsx
│ │ │ ├── Layout
│ │ │ │ ├── Layout.tsx
│ │ │ │ └── Footer.tsx
│ │ │ └── ui
│ │ │ │ ├── label.tsx
│ │ │ │ ├── textarea.tsx
│ │ │ │ ├── separator.tsx
│ │ │ │ ├── input.tsx
│ │ │ │ └── toaster.tsx
│ │ ├── main.tsx
│ │ ├── queries
│ │ │ ├── actions.ts
│ │ │ ├── rewards.ts
│ │ │ ├── chatters.ts
│ │ │ ├── commands.ts
│ │ │ ├── settings.ts
│ │ │ └── user-skins.ts
│ │ └── i18n.ts
│ ├── public
│ │ └── favicon.ico
│ ├── eslint.config.mjs
│ ├── .env.example
│ ├── tsconfig.json
│ ├── index.html
│ └── vite.config.ts
├── client
│ ├── src
│ │ ├── vite-env.d.ts
│ │ ├── utils
│ │ │ └── utils.ts
│ │ ├── style.css
│ │ └── main.ts
│ ├── eslint.config.mjs
│ ├── public
│ │ └── favicon.ico
│ ├── .env.example
│ ├── tsconfig.json
│ ├── index.html
│ ├── package.json
│ └── vite.config.ts
└── website
│ ├── public
│ ├── google1fdca509a6189f25.html
│ ├── favicon.ico
│ ├── robots.txt
│ ├── assets
│ │ ├── obs.png
│ │ ├── admin.png
│ │ ├── setup1.png
│ │ ├── setup2.png
│ │ └── twitch.svg
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── apple-touch-icon.png
│ ├── android-chrome-192x192.png
│ ├── android-chrome-512x512.png
│ ├── sitemap.xml
│ ├── yandex_dd1696715a134c06.html
│ └── site.webmanifest
│ ├── postcss.config.mjs
│ ├── src
│ ├── app
│ │ ├── page.tsx
│ │ ├── terms
│ │ │ └── layout.tsx
│ │ └── privacy
│ │ │ └── layout.tsx
│ ├── mdx-components.tsx
│ ├── utils
│ │ └── index.ts
│ ├── lib
│ │ └── i18n
│ │ │ ├── settings.ts
│ │ │ └── index.ts
│ └── components
│ │ └── Card.tsx
│ ├── next.config.ts
│ ├── eslint.config.mjs
│ ├── .gitignore
│ └── tsconfig.json
├── .dockerignore
├── packages
├── database
│ ├── .gitignore
│ ├── tsconfig.json
│ ├── prisma
│ │ └── migrations
│ │ │ ├── migration_lock.toml
│ │ │ ├── 20240121195332_add_action_data_command_data
│ │ │ └── migration.sql
│ │ │ ├── 20240117143624_add_settings_table
│ │ │ └── migration.sql
│ │ │ └── 20240411135958_chatter
│ │ │ └── migration.sql
│ └── src
│ │ ├── seed
│ │ ├── skins
│ │ │ ├── dudes.ts
│ │ │ └── index.ts
│ │ ├── actions
│ │ │ ├── resurrect.ts
│ │ │ ├── add_jump_hits.ts
│ │ │ ├── color.ts
│ │ │ ├── sprite.ts
│ │ │ ├── dash.ts
│ │ │ ├── grow.ts
│ │ │ ├── jump.ts
│ │ │ └── index.ts
│ │ ├── seed.ts
│ │ └── commands
│ │ │ └── index.ts
│ │ └── client.ts
├── types
│ ├── src
│ │ ├── index.ts
│ │ ├── dto
│ │ │ ├── message.ts
│ │ │ ├── settings.ts
│ │ │ ├── user.ts
│ │ │ ├── user-skin.ts
│ │ │ ├── index.ts
│ │ │ ├── user-skin-collection.ts
│ │ │ ├── command.ts
│ │ │ ├── raid.ts
│ │ │ ├── chatter.ts
│ │ │ ├── reward.ts
│ │ │ └── socket.ts
│ │ └── schema
│ │ │ ├── index.ts
│ │ │ ├── user-skin.ts
│ │ │ ├── user-skin-collection.ts
│ │ │ ├── chatter.ts
│ │ │ ├── settings.ts
│ │ │ └── command.ts
│ ├── tsconfig.json
│ └── package.json
├── typescript-config
│ ├── package.json
│ ├── vite.json
│ ├── base-nestjs.json
│ ├── base.json
│ └── nestjs.json
└── eslint-config
│ ├── package.json
│ └── index.js
├── .prettierrc
├── pnpm-workspace.yaml
├── .prettierignore
├── static
├── poof.png
├── rip1.png
├── rip2.png
├── skull.png
├── weight.png
├── skins
│ ├── tech
│ │ ├── C.png
│ │ ├── Go.png
│ │ ├── JS.png
│ │ ├── R-.png
│ │ ├── TS.png
│ │ ├── V8.png
│ │ ├── APL.png
│ │ ├── AWS.png
│ │ ├── Akka.png
│ │ ├── Atom.png
│ │ ├── Awk.png
│ │ ├── Bash.png
│ │ ├── Bun.png
│ │ ├── C++.png
│ │ ├── CSS3.png
│ │ ├── Dart.png
│ │ ├── Deno.png
│ │ ├── Elm.png
│ │ ├── GCC.png
│ │ ├── GIMP.png
│ │ ├── Git.png
│ │ ├── Haxe.png
│ │ ├── Helm.png
│ │ ├── Hugo.png
│ │ ├── JSON.png
│ │ ├── Java.png
│ │ ├── Jeet.png
│ │ ├── Jest.png
│ │ ├── Jira.png
│ │ ├── Jule.png
│ │ ├── K3OS.png
│ │ ├── K3s.png
│ │ ├── Ktor.png
│ │ ├── LLVM.png
│ │ ├── Lua.png
│ │ ├── MODX.png
│ │ ├── MobX.png
│ │ ├── NPM.png
│ │ ├── Nano.png
│ │ ├── Nim.png
│ │ ├── Okta.png
│ │ ├── PHP.png
│ │ ├── Perl.png
│ │ ├── Qwik.png
│ │ ├── Ruby.png
│ │ ├── Rust.png
│ │ ├── SSH.png
│ │ ├── Sass.png
│ │ ├── TeX.png
│ │ ├── UNIX.png
│ │ ├── Vala.png
│ │ ├── Vim.png
│ │ ├── Vite.png
│ │ ├── XML.png
│ │ ├── YAML.png
│ │ ├── Yarn.png
│ │ ├── Zig.png
│ │ ├── tech.png
│ │ ├── AArch64.png
│ │ ├── Algolia.png
│ │ ├── Android.png
│ │ ├── Angular.png
│ │ ├── Ansible.png
│ │ ├── Apache.png
│ │ ├── Apple.png
│ │ ├── Arduino.png
│ │ ├── Argo-CD.png
│ │ ├── Astro.png
│ │ ├── Azios.png
│ │ ├── Azure.png
│ │ ├── Babel.png
│ │ ├── Bamboo.png
│ │ ├── Behance.png
│ │ ├── Blender.png
│ │ ├── Bower.png
│ │ ├── Bulma.png
│ │ ├── CLion.png
│ │ ├── CMake.png
│ │ ├── CSharp.png
│ │ ├── CakePHP.png
│ │ ├── Canva.png
│ │ ├── CentOS.png
│ │ ├── Chrome.png
│ │ ├── Clarity.png
│ │ ├── Clojure.png
│ │ ├── CodePen.png
│ │ ├── Codeac.png
│ │ ├── Codecov.png
│ │ ├── Consul.png
│ │ ├── Contao.png
│ │ ├── Core-js.png
│ │ ├── CouchDB.png
│ │ ├── Crystal.png
│ │ ├── Cypress.png
│ │ ├── D3.js.png
│ │ ├── DBeaver.png
│ │ ├── Debian.png
│ │ ├── Devicon.png
│ │ ├── Django.png
│ │ ├── Docker.png
│ │ ├── Drupal.png
│ │ ├── ESLint.png
│ │ ├── Elixir.png
│ │ ├── Envoy.png
│ │ ├── Erlang.png
│ │ ├── Express.png
│ │ ├── FSharp.png
│ │ ├── FastAPI.png
│ │ ├── Fastify.png
│ │ ├── Fauna.png
│ │ ├── Fedora.png
│ │ ├── Figma.png
│ │ ├── Firefox.png
│ │ ├── Flask.png
│ │ ├── Flutter.png
│ │ ├── Fortran.png
│ │ ├── Gatling.png
│ │ ├── Gatsby.png
│ │ ├── Gazebo.png
│ │ ├── Gentoo.png
│ │ ├── Ghost.png
│ │ ├── GitBook.png
│ │ ├── GitHub.png
│ │ ├── GitLab.png
│ │ ├── Gitpod.png
│ │ ├── Gitter.png
│ │ ├── GoLand.png
│ │ ├── Google.png
│ │ ├── Gradle.png
│ │ ├── Grafana.png
│ │ ├── Grails.png
│ │ ├── GraphQL.png
│ │ ├── Gulp.js.png
│ │ ├── HTML5.png
│ │ ├── Hardhat.png
│ │ ├── Haskell.png
│ │ ├── Heroku.png
│ │ ├── IFTTT.png
│ │ ├── Ionic.png
│ │ ├── JUnit.png
│ │ ├── Jasmine.png
│ │ ├── Jekyll.png
│ │ ├── Jenkins.png
│ │ ├── Julia.png
│ │ ├── Jupyter.png
│ │ ├── Kaggle.png
│ │ ├── Karma.png
│ │ ├── Keras.png
│ │ ├── Kibana.png
│ │ ├── Knex.js.png
│ │ ├── Kotlin.png
│ │ ├── LaTeX.png
│ │ ├── LabVIEW.png
│ │ ├── Laravel.png
│ │ ├── Less.js.png
│ │ ├── Linux.png
│ │ ├── Lumen.png
│ │ ├── MATLAB.png
│ │ ├── MS-DOS.png
│ │ ├── Minitab.png
│ │ ├── Mocha.png
│ │ ├── MongoDB.png
│ │ ├── Moodle.png
│ │ ├── MySQL.png
│ │ ├── NGINX.png
│ │ ├── Nerog.png
│ │ ├── Nest.js.png
│ │ ├── New4j.png
│ │ ├── Next.js.png
│ │ ├── Nimble.png
│ │ ├── NixOS.png
│ │ ├── Node.js.png
│ │ ├── Nodemon.png
│ │ ├── NuGet.png
│ │ ├── NumPy.png
│ │ ├── Nuxt-JS.png
│ │ ├── OCaml.png
│ │ ├── OpenAL.png
│ │ ├── OpenAPI.png
│ │ ├── OpenCL.png
│ │ ├── OpenCV.png
│ │ ├── OpenGL.png
│ │ ├── Opera.png
│ │ ├── Oracle.png
│ │ ├── Packer.png
│ │ ├── Pandas.png
│ │ ├── Phalcon.png
│ │ ├── Ploty.png
│ │ ├── Podman.png
│ │ ├── Polygon.png
│ │ ├── PostCSS.png
│ │ ├── Postman.png
│ │ ├── PuTTY.png
│ │ ├── PyCharm.png
│ │ ├── PyTorch.png
│ │ ├── Python.png
│ │ ├── Qodana.png
│ │ ├── Quarkus.png
│ │ ├── Quasar.png
│ │ ├── RSpec.png
│ │ ├── RStudio.png
│ │ ├── Rancher.png
│ │ ├── Reach.png
│ │ ├── React.png
│ │ ├── Realm.png
│ │ ├── Red-Hat.png
│ │ ├── Redis.png
│ │ ├── Redux.png
│ │ ├── Ren'Py.png
│ │ ├── Rider.png
│ │ ├── RocksDB.png
│ │ ├── SQLite.png
│ │ ├── Sanity.png
│ │ ├── Scala.png
│ │ ├── Sketch.png
│ │ ├── Slack.png
│ │ ├── Splunk.png
│ │ ├── Spring.png
│ │ ├── Stata.png
│ │ ├── Stylus.png
│ │ ├── Svelte.png
│ │ ├── Swagger.png
│ │ ├── Swift.png
│ │ ├── Symfony.png
│ │ ├── TYPO3.png
│ │ ├── Tauri.png
│ │ ├── Tower.png
│ │ ├── Trello.png
│ │ ├── Twitter.png
│ │ ├── Ubuntu.png
│ │ ├── Unity.png
│ │ ├── Vercel.png
│ │ ├── Veutify.png
│ │ ├── Vite.js.png
│ │ ├── Vue.js.png
│ │ ├── Vyper.png
│ │ ├── Webflow.png
│ │ ├── Weblate.png
│ │ ├── Webpack.png
│ │ ├── Xamarin.png
│ │ ├── Xcode.png
│ │ ├── jQuery.png
│ │ ├── p5-JS.png
│ │ ├── pfSense.png
│ │ ├── pytest.png
│ │ ├── uWSGI.png
│ │ ├── vSphere.png
│ │ ├── Adobe-XD.png
│ │ ├── AdonisJS.png
│ │ ├── Alpine.js.png
│ │ ├── Anaconda.png
│ │ ├── AngularJS.png
│ │ ├── Appwrite.png
│ │ ├── Ballerina.png
│ │ ├── BitBucket.png
│ │ ├── Bootstrap.png
│ │ ├── Capacitor.png
│ │ ├── CircleCI.png
│ │ ├── Composer.png
│ │ ├── Cosmos-BD.png
│ │ ├── Cucumber.png
│ │ ├── DataGrip.png
│ │ ├── DataSpell.png
│ │ ├── Doctrine.png
│ │ ├── Electron.png
│ │ ├── Ember.js.png
│ │ ├── Facebook.png
│ │ ├── Feathers.png
│ │ ├── FileZilla.png
│ │ ├── Firebase.png
│ │ ├── GNU-Emacs.png
│ │ ├── Grunt.js.png
│ │ ├── Harvester.png
│ │ ├── Hibernate.png
│ │ ├── Homebrew.png
│ │ ├── InfluxDB.png
│ │ ├── Inkscape-.png
│ │ ├── Insomnia.png
│ │ ├── Jamstack.png
│ │ ├── JetBrains.png
│ │ ├── Knockout.png
│ │ ├── Krakenjs.png
│ │ ├── LinkedIn.png
│ │ ├── Liquibase.png
│ │ ├── Livewire.png
│ │ ├── Logstash.png
│ │ ├── Markdown.png
│ │ ├── Meteor.js.png
│ │ ├── Moleculer.png
│ │ ├── NetworkX.png
│ │ ├── Oh-my-zsh.png
│ │ ├── OpenStack.png
│ │ ├── PhpStorm.png
│ │ ├── Playwrite.png
│ │ ├── Portainer.png
│ │ ├── PyScript.png
│ │ ├── RabbitMQ.png
│ │ ├── Rollup.js.png
│ │ ├── RubyMine.png
│ │ ├── Scalingo.png
│ │ ├── Selenium.png
│ │ ├── Sequelize.png
│ │ ├── Shopware.png
│ │ ├── Socket.io.png
│ │ ├── Solid.js.png
│ │ ├── Solidity.png
│ │ ├── SonarQube.png
│ │ ├── Storybook.png
│ │ ├── Streamlit.png
│ │ ├── Three.js.png
│ │ ├── Travis-CI.png
│ │ ├── WebStorm.png
│ │ ├── Windows-8.png
│ │ ├── WordPress.png
│ │ ├── Yuno-Host.png
│ │ ├── openSUSE.png
│ │ ├── Ant-Design.png
│ │ ├── Apache-Kafka.png
│ │ ├── Apache-Maven.png
│ │ ├── Apache-Spark.png
│ │ ├── Appcelerator.png
│ │ ├── Apple-Safari.png
│ │ ├── Arch-Linux.png
│ │ ├── Azure-Devops.png
│ │ ├── Backbone.js.png
│ │ ├── BrowserStack.png
│ │ ├── Cloudflare.png
│ │ ├── CodeIgniter.png
│ │ ├── CoffeeScript.png
│ │ ├── Confluence.png
│ │ ├── Discord.js.png
│ │ ├── Django-REST.png
│ │ ├── Dropwizard.png
│ │ ├── Eclipse-IDE.png
│ │ ├── Embedded-C.png
│ │ ├── Foundation.png
│ │ ├── Godot-Engine.png
│ │ ├── Google-Cloud.png
│ │ ├── Handlebars.png
│ │ ├── JavaScript.png
│ │ ├── Jira-Align.png
│ │ ├── Karate-Labs.png
│ │ ├── Kubernetes.png
│ │ ├── Material-UI.png
│ │ ├── Materialize.png
│ │ ├── Matplotlib.png
│ │ ├── Mongoose.js.png
│ │ ├── NHibernate.png
│ │ ├── Objective-C.png
│ │ ├── PostgresSQL.png
│ │ ├── Powershell.png
│ │ ├── Processing.png
│ │ ├── Prometheus.png
│ │ ├── PureScript.png
│ │ ├── Qt-Framework.png
│ │ ├── Raspberry-Pi.png
│ │ ├── SQLAlchemy.png
│ │ ├── Salesforce.png
│ │ ├── Sourcetree.png
│ │ ├── Tailwind-CSS.png
│ │ ├── TensorFlow.png
│ │ ├── Titanium-SDK.png
│ │ ├── TortoiseGit.png
│ │ ├── Traefik-Mesh.png
│ │ ├── TypeScript.png
│ │ ├── WebAssembly.png
│ │ ├── Windows-11.png
│ │ ├── WooCommerce.png
│ │ ├── scikit-learn.png
│ │ ├── After-Effects.png
│ │ ├── Android-Studio.png
│ │ ├── Apache-Airflow.png
│ │ ├── Apache-Groovy.png
│ │ ├── Apache-Hadoop.png
│ │ ├── Apache-Tomcat.png
│ │ ├── Autodesk-Maya.png
│ │ ├── Cairo-Graphics.png
│ │ ├── ClojureScript.png
│ │ ├── Digital-Ocean.png
│ │ ├── Eclipse-Ceylon.png
│ │ ├── Eclipse-Vert.x.png
│ │ ├── Elastic-Beats.png
│ │ ├── Elastic-Search.png
│ │ ├── GitHub-Actions.png
│ │ ├── IntelliJ-IDEA.png
│ │ ├── Jaeger-Tracing.png
│ │ ├── OpenTelemetry.png
│ │ ├── Photon-Engine-.png
│ │ ├── Python-Poetry.png
│ │ ├── Read-the-Docs.png
│ │ ├── Ruby-on-Rails.png
│ │ ├── SQL-Developer.png
│ │ ├── Sema-Software.png
│ │ ├── Stack-Overflow.png
│ │ ├── The-Algorithms.png
│ │ ├── Traefik-Proxy.png
│ │ ├── Unreal-Engine.png
│ │ ├── Visual-Studio.png
│ │ ├── Vue-Storefront.png
│ │ ├── Yii-Framework.png
│ │ ├── Zend-Framework.png
│ │ ├── Adobe-Illustrator.png
│ │ ├── Adobe-Photoshop.png
│ │ ├── Apache-Cassandra.png
│ │ ├── Apache-Subversion.png
│ │ ├── Autodesk-ShotGrid.png
│ │ ├── Eleventy-(11ty).png
│ │ ├── GitHub-Codespaces.png
│ │ ├── HashiCorp-Vagrant.png
│ │ ├── HashiCorp-Vault.png
│ │ ├── Phoenix-Framework.png
│ │ ├── Protractor-Test.png
│ │ ├── React-Bootstrap.png
│ │ ├── Adobe-Premiere-Pro.png
│ │ ├── Azure-SQL-Database.png
│ │ ├── Cloudflare-Workers.png
│ │ ├── HashiCorp-Terraform.png
│ │ ├── IBM-SPSS-Statistics.png
│ │ ├── NW.js-(node-webkit).png
│ │ ├── Microsoft-SQL-Server.png
│ │ ├── Adobe-Commerce-(Magneto).png
│ │ ├── Internet-Explorer-10-(ie10).png
│ │ ├── Robot-Operating-System-(ROS).png
│ │ ├── Visual-Studio-Code-(VS-Code).png
│ │ ├── Simple-DirectMedia-Layer-(SDL).png
│ │ ├── Unified-Modelling-Language-(UML).png
│ │ ├── RedCube's-epic-Compiler-Thingy-programming-(ReCT).png
│ │ └── data.json
│ └── dudes
│ │ ├── cat
│ │ ├── sprite.png
│ │ └── data.json
│ │ ├── duck
│ │ ├── sprite.png
│ │ └── data.json
│ │ ├── dude
│ │ ├── sprite.png
│ │ └── data.json
│ │ ├── girl
│ │ ├── sprite.png
│ │ └── data.json
│ │ ├── nerd
│ │ ├── sprite.png
│ │ └── data.json
│ │ ├── nyan
│ │ ├── sprite.png
│ │ └── data.json
│ │ ├── owl
│ │ ├── sprite.png
│ │ └── data.json
│ │ ├── sith
│ │ ├── sprite.png
│ │ └── data.json
│ │ ├── agent
│ │ ├── sprite.png
│ │ └── data.json
│ │ ├── senior
│ │ ├── sprite.png
│ │ └── data.json
│ │ ├── sponge
│ │ ├── sprite.png
│ │ └── data.json
│ │ └── duck_evil
│ │ ├── sprite.png
│ │ └── data.json
├── sounds
│ └── jump.mp3
└── fonts
│ ├── Rubik-VariableFont_wght.ttf
│ └── Rubik-Italic-VariableFont_wght.ttf
├── .devcontainer
├── Dockerfile
└── devcontainer.extend.yml
├── .editorconfig
├── components.json
├── .github
└── dependabot.yml
├── compose.dev.yaml
├── package.json
└── .gitignore
/.npmrc:
--------------------------------------------------------------------------------
1 | save-exact=true
2 |
--------------------------------------------------------------------------------
/apps/api/src/assets/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
--------------------------------------------------------------------------------
/apps/admin/src/assets/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/packages/database/.gitignore:
--------------------------------------------------------------------------------
1 | generated
2 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true
3 | }
4 |
--------------------------------------------------------------------------------
/apps/admin/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/apps/client/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/pnpm-workspace.yaml:
--------------------------------------------------------------------------------
1 | packages:
2 | - "apps/*"
3 | - "packages/*"
4 |
--------------------------------------------------------------------------------
/apps/api/src/auth/decorators/index.ts:
--------------------------------------------------------------------------------
1 | export { Auth } from './auth.decorator';
2 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | # Add files here to ignore them from prettier formatting
2 | /dist
3 |
--------------------------------------------------------------------------------
/apps/api/src/auth/services/index.ts:
--------------------------------------------------------------------------------
1 | export { AuthService } from './auth.service';
2 |
--------------------------------------------------------------------------------
/packages/types/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './dto';
2 | export * from './schema';
3 |
--------------------------------------------------------------------------------
/static/poof.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/poof.png
--------------------------------------------------------------------------------
/static/rip1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/rip1.png
--------------------------------------------------------------------------------
/static/rip2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/rip2.png
--------------------------------------------------------------------------------
/static/skull.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skull.png
--------------------------------------------------------------------------------
/apps/api/src/admin/gateways/index.ts:
--------------------------------------------------------------------------------
1 | export { EventsGateway } from './events.gateway';
2 |
--------------------------------------------------------------------------------
/apps/api/src/auth/strategies/index.ts:
--------------------------------------------------------------------------------
1 | export { TwitchStrategy } from './twitch.strategy';
2 |
--------------------------------------------------------------------------------
/static/weight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/weight.png
--------------------------------------------------------------------------------
/apps/api/src/auth/repositories/index.ts:
--------------------------------------------------------------------------------
1 | export { UserRepository } from './user.repository';
2 |
--------------------------------------------------------------------------------
/apps/api/src/auth/serializers/index.ts:
--------------------------------------------------------------------------------
1 | export { AuthSerializer } from './auth.serializer';
2 |
--------------------------------------------------------------------------------
/apps/website/public/google1fdca509a6189f25.html:
--------------------------------------------------------------------------------
1 | google-site-verification: google1fdca509a6189f25.html
--------------------------------------------------------------------------------
/static/skins/tech/C.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/C.png
--------------------------------------------------------------------------------
/static/skins/tech/Go.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Go.png
--------------------------------------------------------------------------------
/static/skins/tech/JS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/JS.png
--------------------------------------------------------------------------------
/static/skins/tech/R-.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/R-.png
--------------------------------------------------------------------------------
/static/skins/tech/TS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/TS.png
--------------------------------------------------------------------------------
/static/skins/tech/V8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/V8.png
--------------------------------------------------------------------------------
/static/sounds/jump.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/sounds/jump.mp3
--------------------------------------------------------------------------------
/apps/api/src/auth/exceptions/index.ts:
--------------------------------------------------------------------------------
1 | export { InvalidTokenException } from './invalid-token.exception';
2 |
--------------------------------------------------------------------------------
/static/skins/tech/APL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/APL.png
--------------------------------------------------------------------------------
/static/skins/tech/AWS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/AWS.png
--------------------------------------------------------------------------------
/static/skins/tech/Akka.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Akka.png
--------------------------------------------------------------------------------
/static/skins/tech/Atom.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Atom.png
--------------------------------------------------------------------------------
/static/skins/tech/Awk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Awk.png
--------------------------------------------------------------------------------
/static/skins/tech/Bash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Bash.png
--------------------------------------------------------------------------------
/static/skins/tech/Bun.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Bun.png
--------------------------------------------------------------------------------
/static/skins/tech/C++.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/C++.png
--------------------------------------------------------------------------------
/static/skins/tech/CSS3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/CSS3.png
--------------------------------------------------------------------------------
/static/skins/tech/Dart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Dart.png
--------------------------------------------------------------------------------
/static/skins/tech/Deno.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Deno.png
--------------------------------------------------------------------------------
/static/skins/tech/Elm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Elm.png
--------------------------------------------------------------------------------
/static/skins/tech/GCC.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/GCC.png
--------------------------------------------------------------------------------
/static/skins/tech/GIMP.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/GIMP.png
--------------------------------------------------------------------------------
/static/skins/tech/Git.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Git.png
--------------------------------------------------------------------------------
/static/skins/tech/Haxe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Haxe.png
--------------------------------------------------------------------------------
/static/skins/tech/Helm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Helm.png
--------------------------------------------------------------------------------
/static/skins/tech/Hugo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Hugo.png
--------------------------------------------------------------------------------
/static/skins/tech/JSON.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/JSON.png
--------------------------------------------------------------------------------
/static/skins/tech/Java.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Java.png
--------------------------------------------------------------------------------
/static/skins/tech/Jeet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Jeet.png
--------------------------------------------------------------------------------
/static/skins/tech/Jest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Jest.png
--------------------------------------------------------------------------------
/static/skins/tech/Jira.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Jira.png
--------------------------------------------------------------------------------
/static/skins/tech/Jule.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Jule.png
--------------------------------------------------------------------------------
/static/skins/tech/K3OS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/K3OS.png
--------------------------------------------------------------------------------
/static/skins/tech/K3s.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/K3s.png
--------------------------------------------------------------------------------
/static/skins/tech/Ktor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Ktor.png
--------------------------------------------------------------------------------
/static/skins/tech/LLVM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/LLVM.png
--------------------------------------------------------------------------------
/static/skins/tech/Lua.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Lua.png
--------------------------------------------------------------------------------
/static/skins/tech/MODX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/MODX.png
--------------------------------------------------------------------------------
/static/skins/tech/MobX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/MobX.png
--------------------------------------------------------------------------------
/static/skins/tech/NPM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/NPM.png
--------------------------------------------------------------------------------
/static/skins/tech/Nano.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Nano.png
--------------------------------------------------------------------------------
/static/skins/tech/Nim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Nim.png
--------------------------------------------------------------------------------
/static/skins/tech/Okta.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Okta.png
--------------------------------------------------------------------------------
/static/skins/tech/PHP.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/PHP.png
--------------------------------------------------------------------------------
/static/skins/tech/Perl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Perl.png
--------------------------------------------------------------------------------
/static/skins/tech/Qwik.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Qwik.png
--------------------------------------------------------------------------------
/static/skins/tech/Ruby.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Ruby.png
--------------------------------------------------------------------------------
/static/skins/tech/Rust.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Rust.png
--------------------------------------------------------------------------------
/static/skins/tech/SSH.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/SSH.png
--------------------------------------------------------------------------------
/static/skins/tech/Sass.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Sass.png
--------------------------------------------------------------------------------
/static/skins/tech/TeX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/TeX.png
--------------------------------------------------------------------------------
/static/skins/tech/UNIX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/UNIX.png
--------------------------------------------------------------------------------
/static/skins/tech/Vala.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Vala.png
--------------------------------------------------------------------------------
/static/skins/tech/Vim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Vim.png
--------------------------------------------------------------------------------
/static/skins/tech/Vite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Vite.png
--------------------------------------------------------------------------------
/static/skins/tech/XML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/XML.png
--------------------------------------------------------------------------------
/static/skins/tech/YAML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/YAML.png
--------------------------------------------------------------------------------
/static/skins/tech/Yarn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Yarn.png
--------------------------------------------------------------------------------
/static/skins/tech/Zig.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Zig.png
--------------------------------------------------------------------------------
/static/skins/tech/tech.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/tech.png
--------------------------------------------------------------------------------
/apps/admin/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/apps/admin/public/favicon.ico
--------------------------------------------------------------------------------
/apps/api/src/app/controllers/index.ts:
--------------------------------------------------------------------------------
1 | export { AppController as UserController } from './app.controller';
2 |
--------------------------------------------------------------------------------
/static/skins/tech/AArch64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/AArch64.png
--------------------------------------------------------------------------------
/static/skins/tech/Algolia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Algolia.png
--------------------------------------------------------------------------------
/static/skins/tech/Android.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Android.png
--------------------------------------------------------------------------------
/static/skins/tech/Angular.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Angular.png
--------------------------------------------------------------------------------
/static/skins/tech/Ansible.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Ansible.png
--------------------------------------------------------------------------------
/static/skins/tech/Apache.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Apache.png
--------------------------------------------------------------------------------
/static/skins/tech/Apple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Apple.png
--------------------------------------------------------------------------------
/static/skins/tech/Arduino.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Arduino.png
--------------------------------------------------------------------------------
/static/skins/tech/Argo-CD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Argo-CD.png
--------------------------------------------------------------------------------
/static/skins/tech/Astro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Astro.png
--------------------------------------------------------------------------------
/static/skins/tech/Azios.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Azios.png
--------------------------------------------------------------------------------
/static/skins/tech/Azure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Azure.png
--------------------------------------------------------------------------------
/static/skins/tech/Babel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Babel.png
--------------------------------------------------------------------------------
/static/skins/tech/Bamboo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Bamboo.png
--------------------------------------------------------------------------------
/static/skins/tech/Behance.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Behance.png
--------------------------------------------------------------------------------
/static/skins/tech/Blender.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Blender.png
--------------------------------------------------------------------------------
/static/skins/tech/Bower.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Bower.png
--------------------------------------------------------------------------------
/static/skins/tech/Bulma.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Bulma.png
--------------------------------------------------------------------------------
/static/skins/tech/CLion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/CLion.png
--------------------------------------------------------------------------------
/static/skins/tech/CMake.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/CMake.png
--------------------------------------------------------------------------------
/static/skins/tech/CSharp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/CSharp.png
--------------------------------------------------------------------------------
/static/skins/tech/CakePHP.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/CakePHP.png
--------------------------------------------------------------------------------
/static/skins/tech/Canva.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Canva.png
--------------------------------------------------------------------------------
/static/skins/tech/CentOS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/CentOS.png
--------------------------------------------------------------------------------
/static/skins/tech/Chrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Chrome.png
--------------------------------------------------------------------------------
/static/skins/tech/Clarity.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Clarity.png
--------------------------------------------------------------------------------
/static/skins/tech/Clojure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Clojure.png
--------------------------------------------------------------------------------
/static/skins/tech/CodePen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/CodePen.png
--------------------------------------------------------------------------------
/static/skins/tech/Codeac.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Codeac.png
--------------------------------------------------------------------------------
/static/skins/tech/Codecov.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Codecov.png
--------------------------------------------------------------------------------
/static/skins/tech/Consul.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Consul.png
--------------------------------------------------------------------------------
/static/skins/tech/Contao.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Contao.png
--------------------------------------------------------------------------------
/static/skins/tech/Core-js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Core-js.png
--------------------------------------------------------------------------------
/static/skins/tech/CouchDB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/CouchDB.png
--------------------------------------------------------------------------------
/static/skins/tech/Crystal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Crystal.png
--------------------------------------------------------------------------------
/static/skins/tech/Cypress.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Cypress.png
--------------------------------------------------------------------------------
/static/skins/tech/D3.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/D3.js.png
--------------------------------------------------------------------------------
/static/skins/tech/DBeaver.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/DBeaver.png
--------------------------------------------------------------------------------
/static/skins/tech/Debian.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Debian.png
--------------------------------------------------------------------------------
/static/skins/tech/Devicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Devicon.png
--------------------------------------------------------------------------------
/static/skins/tech/Django.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Django.png
--------------------------------------------------------------------------------
/static/skins/tech/Docker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Docker.png
--------------------------------------------------------------------------------
/static/skins/tech/Drupal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Drupal.png
--------------------------------------------------------------------------------
/static/skins/tech/ESLint.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/ESLint.png
--------------------------------------------------------------------------------
/static/skins/tech/Elixir.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Elixir.png
--------------------------------------------------------------------------------
/static/skins/tech/Envoy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Envoy.png
--------------------------------------------------------------------------------
/static/skins/tech/Erlang.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Erlang.png
--------------------------------------------------------------------------------
/static/skins/tech/Express.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Express.png
--------------------------------------------------------------------------------
/static/skins/tech/FSharp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/FSharp.png
--------------------------------------------------------------------------------
/static/skins/tech/FastAPI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/FastAPI.png
--------------------------------------------------------------------------------
/static/skins/tech/Fastify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Fastify.png
--------------------------------------------------------------------------------
/static/skins/tech/Fauna.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Fauna.png
--------------------------------------------------------------------------------
/static/skins/tech/Fedora.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Fedora.png
--------------------------------------------------------------------------------
/static/skins/tech/Figma.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Figma.png
--------------------------------------------------------------------------------
/static/skins/tech/Firefox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Firefox.png
--------------------------------------------------------------------------------
/static/skins/tech/Flask.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Flask.png
--------------------------------------------------------------------------------
/static/skins/tech/Flutter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Flutter.png
--------------------------------------------------------------------------------
/static/skins/tech/Fortran.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Fortran.png
--------------------------------------------------------------------------------
/static/skins/tech/Gatling.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Gatling.png
--------------------------------------------------------------------------------
/static/skins/tech/Gatsby.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Gatsby.png
--------------------------------------------------------------------------------
/static/skins/tech/Gazebo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Gazebo.png
--------------------------------------------------------------------------------
/static/skins/tech/Gentoo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Gentoo.png
--------------------------------------------------------------------------------
/static/skins/tech/Ghost.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Ghost.png
--------------------------------------------------------------------------------
/static/skins/tech/GitBook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/GitBook.png
--------------------------------------------------------------------------------
/static/skins/tech/GitHub.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/GitHub.png
--------------------------------------------------------------------------------
/static/skins/tech/GitLab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/GitLab.png
--------------------------------------------------------------------------------
/static/skins/tech/Gitpod.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Gitpod.png
--------------------------------------------------------------------------------
/static/skins/tech/Gitter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Gitter.png
--------------------------------------------------------------------------------
/static/skins/tech/GoLand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/GoLand.png
--------------------------------------------------------------------------------
/static/skins/tech/Google.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Google.png
--------------------------------------------------------------------------------
/static/skins/tech/Gradle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Gradle.png
--------------------------------------------------------------------------------
/static/skins/tech/Grafana.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Grafana.png
--------------------------------------------------------------------------------
/static/skins/tech/Grails.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Grails.png
--------------------------------------------------------------------------------
/static/skins/tech/GraphQL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/GraphQL.png
--------------------------------------------------------------------------------
/static/skins/tech/Gulp.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Gulp.js.png
--------------------------------------------------------------------------------
/static/skins/tech/HTML5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/HTML5.png
--------------------------------------------------------------------------------
/static/skins/tech/Hardhat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Hardhat.png
--------------------------------------------------------------------------------
/static/skins/tech/Haskell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Haskell.png
--------------------------------------------------------------------------------
/static/skins/tech/Heroku.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Heroku.png
--------------------------------------------------------------------------------
/static/skins/tech/IFTTT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/IFTTT.png
--------------------------------------------------------------------------------
/static/skins/tech/Ionic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Ionic.png
--------------------------------------------------------------------------------
/static/skins/tech/JUnit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/JUnit.png
--------------------------------------------------------------------------------
/static/skins/tech/Jasmine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Jasmine.png
--------------------------------------------------------------------------------
/static/skins/tech/Jekyll.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Jekyll.png
--------------------------------------------------------------------------------
/static/skins/tech/Jenkins.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Jenkins.png
--------------------------------------------------------------------------------
/static/skins/tech/Julia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Julia.png
--------------------------------------------------------------------------------
/static/skins/tech/Jupyter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Jupyter.png
--------------------------------------------------------------------------------
/static/skins/tech/Kaggle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Kaggle.png
--------------------------------------------------------------------------------
/static/skins/tech/Karma.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Karma.png
--------------------------------------------------------------------------------
/static/skins/tech/Keras.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Keras.png
--------------------------------------------------------------------------------
/static/skins/tech/Kibana.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Kibana.png
--------------------------------------------------------------------------------
/static/skins/tech/Knex.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Knex.js.png
--------------------------------------------------------------------------------
/static/skins/tech/Kotlin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Kotlin.png
--------------------------------------------------------------------------------
/static/skins/tech/LaTeX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/LaTeX.png
--------------------------------------------------------------------------------
/static/skins/tech/LabVIEW.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/LabVIEW.png
--------------------------------------------------------------------------------
/static/skins/tech/Laravel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Laravel.png
--------------------------------------------------------------------------------
/static/skins/tech/Less.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Less.js.png
--------------------------------------------------------------------------------
/static/skins/tech/Linux.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Linux.png
--------------------------------------------------------------------------------
/static/skins/tech/Lumen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Lumen.png
--------------------------------------------------------------------------------
/static/skins/tech/MATLAB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/MATLAB.png
--------------------------------------------------------------------------------
/static/skins/tech/MS-DOS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/MS-DOS.png
--------------------------------------------------------------------------------
/static/skins/tech/Minitab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Minitab.png
--------------------------------------------------------------------------------
/static/skins/tech/Mocha.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Mocha.png
--------------------------------------------------------------------------------
/static/skins/tech/MongoDB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/MongoDB.png
--------------------------------------------------------------------------------
/static/skins/tech/Moodle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Moodle.png
--------------------------------------------------------------------------------
/static/skins/tech/MySQL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/MySQL.png
--------------------------------------------------------------------------------
/static/skins/tech/NGINX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/NGINX.png
--------------------------------------------------------------------------------
/static/skins/tech/Nerog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Nerog.png
--------------------------------------------------------------------------------
/static/skins/tech/Nest.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Nest.js.png
--------------------------------------------------------------------------------
/static/skins/tech/New4j.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/New4j.png
--------------------------------------------------------------------------------
/static/skins/tech/Next.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Next.js.png
--------------------------------------------------------------------------------
/static/skins/tech/Nimble.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Nimble.png
--------------------------------------------------------------------------------
/static/skins/tech/NixOS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/NixOS.png
--------------------------------------------------------------------------------
/static/skins/tech/Node.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Node.js.png
--------------------------------------------------------------------------------
/static/skins/tech/Nodemon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Nodemon.png
--------------------------------------------------------------------------------
/static/skins/tech/NuGet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/NuGet.png
--------------------------------------------------------------------------------
/static/skins/tech/NumPy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/NumPy.png
--------------------------------------------------------------------------------
/static/skins/tech/Nuxt-JS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Nuxt-JS.png
--------------------------------------------------------------------------------
/static/skins/tech/OCaml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/OCaml.png
--------------------------------------------------------------------------------
/static/skins/tech/OpenAL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/OpenAL.png
--------------------------------------------------------------------------------
/static/skins/tech/OpenAPI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/OpenAPI.png
--------------------------------------------------------------------------------
/static/skins/tech/OpenCL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/OpenCL.png
--------------------------------------------------------------------------------
/static/skins/tech/OpenCV.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/OpenCV.png
--------------------------------------------------------------------------------
/static/skins/tech/OpenGL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/OpenGL.png
--------------------------------------------------------------------------------
/static/skins/tech/Opera.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Opera.png
--------------------------------------------------------------------------------
/static/skins/tech/Oracle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Oracle.png
--------------------------------------------------------------------------------
/static/skins/tech/Packer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Packer.png
--------------------------------------------------------------------------------
/static/skins/tech/Pandas.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Pandas.png
--------------------------------------------------------------------------------
/static/skins/tech/Phalcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Phalcon.png
--------------------------------------------------------------------------------
/static/skins/tech/Ploty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Ploty.png
--------------------------------------------------------------------------------
/static/skins/tech/Podman.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Podman.png
--------------------------------------------------------------------------------
/static/skins/tech/Polygon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Polygon.png
--------------------------------------------------------------------------------
/static/skins/tech/PostCSS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/PostCSS.png
--------------------------------------------------------------------------------
/static/skins/tech/Postman.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Postman.png
--------------------------------------------------------------------------------
/static/skins/tech/PuTTY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/PuTTY.png
--------------------------------------------------------------------------------
/static/skins/tech/PyCharm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/PyCharm.png
--------------------------------------------------------------------------------
/static/skins/tech/PyTorch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/PyTorch.png
--------------------------------------------------------------------------------
/static/skins/tech/Python.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Python.png
--------------------------------------------------------------------------------
/static/skins/tech/Qodana.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Qodana.png
--------------------------------------------------------------------------------
/static/skins/tech/Quarkus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Quarkus.png
--------------------------------------------------------------------------------
/static/skins/tech/Quasar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Quasar.png
--------------------------------------------------------------------------------
/static/skins/tech/RSpec.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/RSpec.png
--------------------------------------------------------------------------------
/static/skins/tech/RStudio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/RStudio.png
--------------------------------------------------------------------------------
/static/skins/tech/Rancher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Rancher.png
--------------------------------------------------------------------------------
/static/skins/tech/Reach.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Reach.png
--------------------------------------------------------------------------------
/static/skins/tech/React.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/React.png
--------------------------------------------------------------------------------
/static/skins/tech/Realm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Realm.png
--------------------------------------------------------------------------------
/static/skins/tech/Red-Hat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Red-Hat.png
--------------------------------------------------------------------------------
/static/skins/tech/Redis.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Redis.png
--------------------------------------------------------------------------------
/static/skins/tech/Redux.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Redux.png
--------------------------------------------------------------------------------
/static/skins/tech/Ren'Py.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Ren'Py.png
--------------------------------------------------------------------------------
/static/skins/tech/Rider.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Rider.png
--------------------------------------------------------------------------------
/static/skins/tech/RocksDB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/RocksDB.png
--------------------------------------------------------------------------------
/static/skins/tech/SQLite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/SQLite.png
--------------------------------------------------------------------------------
/static/skins/tech/Sanity.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Sanity.png
--------------------------------------------------------------------------------
/static/skins/tech/Scala.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Scala.png
--------------------------------------------------------------------------------
/static/skins/tech/Sketch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Sketch.png
--------------------------------------------------------------------------------
/static/skins/tech/Slack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Slack.png
--------------------------------------------------------------------------------
/static/skins/tech/Splunk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Splunk.png
--------------------------------------------------------------------------------
/static/skins/tech/Spring.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Spring.png
--------------------------------------------------------------------------------
/static/skins/tech/Stata.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Stata.png
--------------------------------------------------------------------------------
/static/skins/tech/Stylus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Stylus.png
--------------------------------------------------------------------------------
/static/skins/tech/Svelte.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Svelte.png
--------------------------------------------------------------------------------
/static/skins/tech/Swagger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Swagger.png
--------------------------------------------------------------------------------
/static/skins/tech/Swift.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Swift.png
--------------------------------------------------------------------------------
/static/skins/tech/Symfony.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Symfony.png
--------------------------------------------------------------------------------
/static/skins/tech/TYPO3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/TYPO3.png
--------------------------------------------------------------------------------
/static/skins/tech/Tauri.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Tauri.png
--------------------------------------------------------------------------------
/static/skins/tech/Tower.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Tower.png
--------------------------------------------------------------------------------
/static/skins/tech/Trello.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Trello.png
--------------------------------------------------------------------------------
/static/skins/tech/Twitter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Twitter.png
--------------------------------------------------------------------------------
/static/skins/tech/Ubuntu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Ubuntu.png
--------------------------------------------------------------------------------
/static/skins/tech/Unity.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Unity.png
--------------------------------------------------------------------------------
/static/skins/tech/Vercel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Vercel.png
--------------------------------------------------------------------------------
/static/skins/tech/Veutify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Veutify.png
--------------------------------------------------------------------------------
/static/skins/tech/Vite.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Vite.js.png
--------------------------------------------------------------------------------
/static/skins/tech/Vue.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Vue.js.png
--------------------------------------------------------------------------------
/static/skins/tech/Vyper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Vyper.png
--------------------------------------------------------------------------------
/static/skins/tech/Webflow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Webflow.png
--------------------------------------------------------------------------------
/static/skins/tech/Weblate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Weblate.png
--------------------------------------------------------------------------------
/static/skins/tech/Webpack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Webpack.png
--------------------------------------------------------------------------------
/static/skins/tech/Xamarin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Xamarin.png
--------------------------------------------------------------------------------
/static/skins/tech/Xcode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Xcode.png
--------------------------------------------------------------------------------
/static/skins/tech/jQuery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/jQuery.png
--------------------------------------------------------------------------------
/static/skins/tech/p5-JS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/p5-JS.png
--------------------------------------------------------------------------------
/static/skins/tech/pfSense.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/pfSense.png
--------------------------------------------------------------------------------
/static/skins/tech/pytest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/pytest.png
--------------------------------------------------------------------------------
/static/skins/tech/uWSGI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/uWSGI.png
--------------------------------------------------------------------------------
/static/skins/tech/vSphere.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/vSphere.png
--------------------------------------------------------------------------------
/apps/admin/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import config from '@repo/eslint-config';
2 |
3 | export default [...config.react];
4 |
--------------------------------------------------------------------------------
/apps/api/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import config from "@repo/eslint-config";
2 |
3 | export default [...config.base];
4 |
--------------------------------------------------------------------------------
/apps/client/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import config from "@repo/eslint-config";
2 |
3 | export default [...config.base];
4 |
--------------------------------------------------------------------------------
/apps/client/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/apps/client/public/favicon.ico
--------------------------------------------------------------------------------
/apps/website/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/apps/website/public/favicon.ico
--------------------------------------------------------------------------------
/apps/website/public/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Allow: /
3 | Sitemap: https://evotars.inferst.com/sitemap.xml
4 |
--------------------------------------------------------------------------------
/static/skins/tech/Adobe-XD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Adobe-XD.png
--------------------------------------------------------------------------------
/static/skins/tech/AdonisJS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/AdonisJS.png
--------------------------------------------------------------------------------
/static/skins/tech/Alpine.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Alpine.js.png
--------------------------------------------------------------------------------
/static/skins/tech/Anaconda.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Anaconda.png
--------------------------------------------------------------------------------
/static/skins/tech/AngularJS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/AngularJS.png
--------------------------------------------------------------------------------
/static/skins/tech/Appwrite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Appwrite.png
--------------------------------------------------------------------------------
/static/skins/tech/Ballerina.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Ballerina.png
--------------------------------------------------------------------------------
/static/skins/tech/BitBucket.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/BitBucket.png
--------------------------------------------------------------------------------
/static/skins/tech/Bootstrap.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Bootstrap.png
--------------------------------------------------------------------------------
/static/skins/tech/Capacitor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Capacitor.png
--------------------------------------------------------------------------------
/static/skins/tech/CircleCI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/CircleCI.png
--------------------------------------------------------------------------------
/static/skins/tech/Composer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Composer.png
--------------------------------------------------------------------------------
/static/skins/tech/Cosmos-BD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Cosmos-BD.png
--------------------------------------------------------------------------------
/static/skins/tech/Cucumber.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Cucumber.png
--------------------------------------------------------------------------------
/static/skins/tech/DataGrip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/DataGrip.png
--------------------------------------------------------------------------------
/static/skins/tech/DataSpell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/DataSpell.png
--------------------------------------------------------------------------------
/static/skins/tech/Doctrine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Doctrine.png
--------------------------------------------------------------------------------
/static/skins/tech/Electron.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Electron.png
--------------------------------------------------------------------------------
/static/skins/tech/Ember.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Ember.js.png
--------------------------------------------------------------------------------
/static/skins/tech/Facebook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Facebook.png
--------------------------------------------------------------------------------
/static/skins/tech/Feathers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Feathers.png
--------------------------------------------------------------------------------
/static/skins/tech/FileZilla.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/FileZilla.png
--------------------------------------------------------------------------------
/static/skins/tech/Firebase.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Firebase.png
--------------------------------------------------------------------------------
/static/skins/tech/GNU-Emacs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/GNU-Emacs.png
--------------------------------------------------------------------------------
/static/skins/tech/Grunt.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Grunt.js.png
--------------------------------------------------------------------------------
/static/skins/tech/Harvester.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Harvester.png
--------------------------------------------------------------------------------
/static/skins/tech/Hibernate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Hibernate.png
--------------------------------------------------------------------------------
/static/skins/tech/Homebrew.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Homebrew.png
--------------------------------------------------------------------------------
/static/skins/tech/InfluxDB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/InfluxDB.png
--------------------------------------------------------------------------------
/static/skins/tech/Inkscape-.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Inkscape-.png
--------------------------------------------------------------------------------
/static/skins/tech/Insomnia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Insomnia.png
--------------------------------------------------------------------------------
/static/skins/tech/Jamstack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Jamstack.png
--------------------------------------------------------------------------------
/static/skins/tech/JetBrains.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/JetBrains.png
--------------------------------------------------------------------------------
/static/skins/tech/Knockout.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Knockout.png
--------------------------------------------------------------------------------
/static/skins/tech/Krakenjs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Krakenjs.png
--------------------------------------------------------------------------------
/static/skins/tech/LinkedIn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/LinkedIn.png
--------------------------------------------------------------------------------
/static/skins/tech/Liquibase.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Liquibase.png
--------------------------------------------------------------------------------
/static/skins/tech/Livewire.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Livewire.png
--------------------------------------------------------------------------------
/static/skins/tech/Logstash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Logstash.png
--------------------------------------------------------------------------------
/static/skins/tech/Markdown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Markdown.png
--------------------------------------------------------------------------------
/static/skins/tech/Meteor.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Meteor.js.png
--------------------------------------------------------------------------------
/static/skins/tech/Moleculer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Moleculer.png
--------------------------------------------------------------------------------
/static/skins/tech/NetworkX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/NetworkX.png
--------------------------------------------------------------------------------
/static/skins/tech/Oh-my-zsh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Oh-my-zsh.png
--------------------------------------------------------------------------------
/static/skins/tech/OpenStack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/OpenStack.png
--------------------------------------------------------------------------------
/static/skins/tech/PhpStorm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/PhpStorm.png
--------------------------------------------------------------------------------
/static/skins/tech/Playwrite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Playwrite.png
--------------------------------------------------------------------------------
/static/skins/tech/Portainer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Portainer.png
--------------------------------------------------------------------------------
/static/skins/tech/PyScript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/PyScript.png
--------------------------------------------------------------------------------
/static/skins/tech/RabbitMQ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/RabbitMQ.png
--------------------------------------------------------------------------------
/static/skins/tech/Rollup.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Rollup.js.png
--------------------------------------------------------------------------------
/static/skins/tech/RubyMine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/RubyMine.png
--------------------------------------------------------------------------------
/static/skins/tech/Scalingo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Scalingo.png
--------------------------------------------------------------------------------
/static/skins/tech/Selenium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Selenium.png
--------------------------------------------------------------------------------
/static/skins/tech/Sequelize.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Sequelize.png
--------------------------------------------------------------------------------
/static/skins/tech/Shopware.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Shopware.png
--------------------------------------------------------------------------------
/static/skins/tech/Socket.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Socket.io.png
--------------------------------------------------------------------------------
/static/skins/tech/Solid.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Solid.js.png
--------------------------------------------------------------------------------
/static/skins/tech/Solidity.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Solidity.png
--------------------------------------------------------------------------------
/static/skins/tech/SonarQube.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/SonarQube.png
--------------------------------------------------------------------------------
/static/skins/tech/Storybook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Storybook.png
--------------------------------------------------------------------------------
/static/skins/tech/Streamlit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Streamlit.png
--------------------------------------------------------------------------------
/static/skins/tech/Three.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Three.js.png
--------------------------------------------------------------------------------
/static/skins/tech/Travis-CI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Travis-CI.png
--------------------------------------------------------------------------------
/static/skins/tech/WebStorm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/WebStorm.png
--------------------------------------------------------------------------------
/static/skins/tech/Windows-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Windows-8.png
--------------------------------------------------------------------------------
/static/skins/tech/WordPress.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/WordPress.png
--------------------------------------------------------------------------------
/static/skins/tech/Yuno-Host.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Yuno-Host.png
--------------------------------------------------------------------------------
/static/skins/tech/openSUSE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/openSUSE.png
--------------------------------------------------------------------------------
/apps/website/public/assets/obs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/apps/website/public/assets/obs.png
--------------------------------------------------------------------------------
/static/skins/dudes/cat/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/dudes/cat/sprite.png
--------------------------------------------------------------------------------
/static/skins/dudes/duck/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/dudes/duck/sprite.png
--------------------------------------------------------------------------------
/static/skins/dudes/dude/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/dudes/dude/sprite.png
--------------------------------------------------------------------------------
/static/skins/dudes/girl/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/dudes/girl/sprite.png
--------------------------------------------------------------------------------
/static/skins/dudes/nerd/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/dudes/nerd/sprite.png
--------------------------------------------------------------------------------
/static/skins/dudes/nyan/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/dudes/nyan/sprite.png
--------------------------------------------------------------------------------
/static/skins/dudes/owl/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/dudes/owl/sprite.png
--------------------------------------------------------------------------------
/static/skins/dudes/sith/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/dudes/sith/sprite.png
--------------------------------------------------------------------------------
/static/skins/tech/Ant-Design.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Ant-Design.png
--------------------------------------------------------------------------------
/static/skins/tech/Apache-Kafka.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Apache-Kafka.png
--------------------------------------------------------------------------------
/static/skins/tech/Apache-Maven.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Apache-Maven.png
--------------------------------------------------------------------------------
/static/skins/tech/Apache-Spark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Apache-Spark.png
--------------------------------------------------------------------------------
/static/skins/tech/Appcelerator.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Appcelerator.png
--------------------------------------------------------------------------------
/static/skins/tech/Apple-Safari.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Apple-Safari.png
--------------------------------------------------------------------------------
/static/skins/tech/Arch-Linux.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Arch-Linux.png
--------------------------------------------------------------------------------
/static/skins/tech/Azure-Devops.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Azure-Devops.png
--------------------------------------------------------------------------------
/static/skins/tech/Backbone.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Backbone.js.png
--------------------------------------------------------------------------------
/static/skins/tech/BrowserStack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/BrowserStack.png
--------------------------------------------------------------------------------
/static/skins/tech/Cloudflare.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Cloudflare.png
--------------------------------------------------------------------------------
/static/skins/tech/CodeIgniter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/CodeIgniter.png
--------------------------------------------------------------------------------
/static/skins/tech/CoffeeScript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/CoffeeScript.png
--------------------------------------------------------------------------------
/static/skins/tech/Confluence.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Confluence.png
--------------------------------------------------------------------------------
/static/skins/tech/Discord.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Discord.js.png
--------------------------------------------------------------------------------
/static/skins/tech/Django-REST.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Django-REST.png
--------------------------------------------------------------------------------
/static/skins/tech/Dropwizard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Dropwizard.png
--------------------------------------------------------------------------------
/static/skins/tech/Eclipse-IDE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Eclipse-IDE.png
--------------------------------------------------------------------------------
/static/skins/tech/Embedded-C.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Embedded-C.png
--------------------------------------------------------------------------------
/static/skins/tech/Foundation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Foundation.png
--------------------------------------------------------------------------------
/static/skins/tech/Godot-Engine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Godot-Engine.png
--------------------------------------------------------------------------------
/static/skins/tech/Google-Cloud.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Google-Cloud.png
--------------------------------------------------------------------------------
/static/skins/tech/Handlebars.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Handlebars.png
--------------------------------------------------------------------------------
/static/skins/tech/JavaScript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/JavaScript.png
--------------------------------------------------------------------------------
/static/skins/tech/Jira-Align.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Jira-Align.png
--------------------------------------------------------------------------------
/static/skins/tech/Karate-Labs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Karate-Labs.png
--------------------------------------------------------------------------------
/static/skins/tech/Kubernetes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Kubernetes.png
--------------------------------------------------------------------------------
/static/skins/tech/Material-UI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Material-UI.png
--------------------------------------------------------------------------------
/static/skins/tech/Materialize.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Materialize.png
--------------------------------------------------------------------------------
/static/skins/tech/Matplotlib.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Matplotlib.png
--------------------------------------------------------------------------------
/static/skins/tech/Mongoose.js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Mongoose.js.png
--------------------------------------------------------------------------------
/static/skins/tech/NHibernate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/NHibernate.png
--------------------------------------------------------------------------------
/static/skins/tech/Objective-C.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Objective-C.png
--------------------------------------------------------------------------------
/static/skins/tech/PostgresSQL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/PostgresSQL.png
--------------------------------------------------------------------------------
/static/skins/tech/Powershell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Powershell.png
--------------------------------------------------------------------------------
/static/skins/tech/Processing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Processing.png
--------------------------------------------------------------------------------
/static/skins/tech/Prometheus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Prometheus.png
--------------------------------------------------------------------------------
/static/skins/tech/PureScript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/PureScript.png
--------------------------------------------------------------------------------
/static/skins/tech/Qt-Framework.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Qt-Framework.png
--------------------------------------------------------------------------------
/static/skins/tech/Raspberry-Pi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Raspberry-Pi.png
--------------------------------------------------------------------------------
/static/skins/tech/SQLAlchemy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/SQLAlchemy.png
--------------------------------------------------------------------------------
/static/skins/tech/Salesforce.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Salesforce.png
--------------------------------------------------------------------------------
/static/skins/tech/Sourcetree.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Sourcetree.png
--------------------------------------------------------------------------------
/static/skins/tech/Tailwind-CSS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Tailwind-CSS.png
--------------------------------------------------------------------------------
/static/skins/tech/TensorFlow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/TensorFlow.png
--------------------------------------------------------------------------------
/static/skins/tech/Titanium-SDK.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Titanium-SDK.png
--------------------------------------------------------------------------------
/static/skins/tech/TortoiseGit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/TortoiseGit.png
--------------------------------------------------------------------------------
/static/skins/tech/Traefik-Mesh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Traefik-Mesh.png
--------------------------------------------------------------------------------
/static/skins/tech/TypeScript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/TypeScript.png
--------------------------------------------------------------------------------
/static/skins/tech/WebAssembly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/WebAssembly.png
--------------------------------------------------------------------------------
/static/skins/tech/Windows-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Windows-11.png
--------------------------------------------------------------------------------
/static/skins/tech/WooCommerce.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/WooCommerce.png
--------------------------------------------------------------------------------
/static/skins/tech/scikit-learn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/scikit-learn.png
--------------------------------------------------------------------------------
/apps/website/public/assets/admin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/apps/website/public/assets/admin.png
--------------------------------------------------------------------------------
/static/skins/dudes/agent/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/dudes/agent/sprite.png
--------------------------------------------------------------------------------
/static/skins/dudes/senior/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/dudes/senior/sprite.png
--------------------------------------------------------------------------------
/static/skins/dudes/sponge/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/dudes/sponge/sprite.png
--------------------------------------------------------------------------------
/static/skins/tech/After-Effects.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/After-Effects.png
--------------------------------------------------------------------------------
/static/skins/tech/Android-Studio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Android-Studio.png
--------------------------------------------------------------------------------
/static/skins/tech/Apache-Airflow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Apache-Airflow.png
--------------------------------------------------------------------------------
/static/skins/tech/Apache-Groovy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Apache-Groovy.png
--------------------------------------------------------------------------------
/static/skins/tech/Apache-Hadoop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Apache-Hadoop.png
--------------------------------------------------------------------------------
/static/skins/tech/Apache-Tomcat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Apache-Tomcat.png
--------------------------------------------------------------------------------
/static/skins/tech/Autodesk-Maya.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Autodesk-Maya.png
--------------------------------------------------------------------------------
/static/skins/tech/Cairo-Graphics.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Cairo-Graphics.png
--------------------------------------------------------------------------------
/static/skins/tech/ClojureScript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/ClojureScript.png
--------------------------------------------------------------------------------
/static/skins/tech/Digital-Ocean.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Digital-Ocean.png
--------------------------------------------------------------------------------
/static/skins/tech/Eclipse-Ceylon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Eclipse-Ceylon.png
--------------------------------------------------------------------------------
/static/skins/tech/Eclipse-Vert.x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Eclipse-Vert.x.png
--------------------------------------------------------------------------------
/static/skins/tech/Elastic-Beats.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Elastic-Beats.png
--------------------------------------------------------------------------------
/static/skins/tech/Elastic-Search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Elastic-Search.png
--------------------------------------------------------------------------------
/static/skins/tech/GitHub-Actions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/GitHub-Actions.png
--------------------------------------------------------------------------------
/static/skins/tech/IntelliJ-IDEA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/IntelliJ-IDEA.png
--------------------------------------------------------------------------------
/static/skins/tech/Jaeger-Tracing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Jaeger-Tracing.png
--------------------------------------------------------------------------------
/static/skins/tech/OpenTelemetry.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/OpenTelemetry.png
--------------------------------------------------------------------------------
/static/skins/tech/Photon-Engine-.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Photon-Engine-.png
--------------------------------------------------------------------------------
/static/skins/tech/Python-Poetry.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Python-Poetry.png
--------------------------------------------------------------------------------
/static/skins/tech/Read-the-Docs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Read-the-Docs.png
--------------------------------------------------------------------------------
/static/skins/tech/Ruby-on-Rails.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Ruby-on-Rails.png
--------------------------------------------------------------------------------
/static/skins/tech/SQL-Developer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/SQL-Developer.png
--------------------------------------------------------------------------------
/static/skins/tech/Sema-Software.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Sema-Software.png
--------------------------------------------------------------------------------
/static/skins/tech/Stack-Overflow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Stack-Overflow.png
--------------------------------------------------------------------------------
/static/skins/tech/The-Algorithms.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/The-Algorithms.png
--------------------------------------------------------------------------------
/static/skins/tech/Traefik-Proxy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Traefik-Proxy.png
--------------------------------------------------------------------------------
/static/skins/tech/Unreal-Engine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Unreal-Engine.png
--------------------------------------------------------------------------------
/static/skins/tech/Visual-Studio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Visual-Studio.png
--------------------------------------------------------------------------------
/static/skins/tech/Vue-Storefront.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Vue-Storefront.png
--------------------------------------------------------------------------------
/static/skins/tech/Yii-Framework.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Yii-Framework.png
--------------------------------------------------------------------------------
/static/skins/tech/Zend-Framework.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Zend-Framework.png
--------------------------------------------------------------------------------
/apps/website/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | const config = {
2 | plugins: ["@tailwindcss/postcss"],
3 | };
4 |
5 | export default config;
6 |
--------------------------------------------------------------------------------
/apps/website/public/assets/setup1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/apps/website/public/assets/setup1.png
--------------------------------------------------------------------------------
/apps/website/public/assets/setup2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/apps/website/public/assets/setup2.png
--------------------------------------------------------------------------------
/apps/website/public/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/apps/website/public/favicon-16x16.png
--------------------------------------------------------------------------------
/apps/website/public/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/apps/website/public/favicon-32x32.png
--------------------------------------------------------------------------------
/static/skins/dudes/duck_evil/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/dudes/duck_evil/sprite.png
--------------------------------------------------------------------------------
/static/skins/tech/Adobe-Illustrator.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Adobe-Illustrator.png
--------------------------------------------------------------------------------
/static/skins/tech/Adobe-Photoshop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Adobe-Photoshop.png
--------------------------------------------------------------------------------
/static/skins/tech/Apache-Cassandra.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Apache-Cassandra.png
--------------------------------------------------------------------------------
/static/skins/tech/Apache-Subversion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Apache-Subversion.png
--------------------------------------------------------------------------------
/static/skins/tech/Autodesk-ShotGrid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Autodesk-ShotGrid.png
--------------------------------------------------------------------------------
/static/skins/tech/Eleventy-(11ty).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Eleventy-(11ty).png
--------------------------------------------------------------------------------
/static/skins/tech/GitHub-Codespaces.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/GitHub-Codespaces.png
--------------------------------------------------------------------------------
/static/skins/tech/HashiCorp-Vagrant.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/HashiCorp-Vagrant.png
--------------------------------------------------------------------------------
/static/skins/tech/HashiCorp-Vault.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/HashiCorp-Vault.png
--------------------------------------------------------------------------------
/static/skins/tech/Phoenix-Framework.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Phoenix-Framework.png
--------------------------------------------------------------------------------
/static/skins/tech/Protractor-Test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Protractor-Test.png
--------------------------------------------------------------------------------
/static/skins/tech/React-Bootstrap.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/React-Bootstrap.png
--------------------------------------------------------------------------------
/apps/api/src/auth/guards/index.ts:
--------------------------------------------------------------------------------
1 | export { TwitchAuthGuard } from './twitch-auth.guard';
2 | export { AuthGuard } from './auth.guard';
3 |
--------------------------------------------------------------------------------
/apps/website/public/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/apps/website/public/apple-touch-icon.png
--------------------------------------------------------------------------------
/static/fonts/Rubik-VariableFont_wght.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/fonts/Rubik-VariableFont_wght.ttf
--------------------------------------------------------------------------------
/static/skins/tech/Adobe-Premiere-Pro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Adobe-Premiere-Pro.png
--------------------------------------------------------------------------------
/static/skins/tech/Azure-SQL-Database.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Azure-SQL-Database.png
--------------------------------------------------------------------------------
/static/skins/tech/Cloudflare-Workers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Cloudflare-Workers.png
--------------------------------------------------------------------------------
/static/skins/tech/HashiCorp-Terraform.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/HashiCorp-Terraform.png
--------------------------------------------------------------------------------
/static/skins/tech/IBM-SPSS-Statistics.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/IBM-SPSS-Statistics.png
--------------------------------------------------------------------------------
/static/skins/tech/NW.js-(node-webkit).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/NW.js-(node-webkit).png
--------------------------------------------------------------------------------
/apps/api/tsconfig.build.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.json",
3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/static/skins/tech/Microsoft-SQL-Server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Microsoft-SQL-Server.png
--------------------------------------------------------------------------------
/apps/admin/.env.example:
--------------------------------------------------------------------------------
1 | VITE_API_URL=http://localhost/api
2 | VITE_CLIENT_SOCKET_HOST=http://localhost
3 |
4 | VITE_CJS_IGNORE_WARNING=true
5 |
--------------------------------------------------------------------------------
/apps/client/.env.example:
--------------------------------------------------------------------------------
1 | VITE_API_URL=http://localhost/api
2 | VITE_CLIENT_SOCKET_HOST=http://localhost
3 |
4 | VITE_CJS_IGNORE_WARNING=true
5 |
--------------------------------------------------------------------------------
/apps/website/public/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/apps/website/public/android-chrome-192x192.png
--------------------------------------------------------------------------------
/apps/website/public/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/apps/website/public/android-chrome-512x512.png
--------------------------------------------------------------------------------
/apps/website/src/app/page.tsx:
--------------------------------------------------------------------------------
1 | import { Main } from '@/components/Main';
2 |
3 | export default function Home() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/static/skins/tech/Adobe-Commerce-(Magneto).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Adobe-Commerce-(Magneto).png
--------------------------------------------------------------------------------
/static/fonts/Rubik-Italic-VariableFont_wght.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/fonts/Rubik-Italic-VariableFont_wght.ttf
--------------------------------------------------------------------------------
/static/skins/tech/Internet-Explorer-10-(ie10).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Internet-Explorer-10-(ie10).png
--------------------------------------------------------------------------------
/static/skins/tech/Robot-Operating-System-(ROS).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Robot-Operating-System-(ROS).png
--------------------------------------------------------------------------------
/static/skins/tech/Visual-Studio-Code-(VS-Code).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Visual-Studio-Code-(VS-Code).png
--------------------------------------------------------------------------------
/static/skins/tech/Simple-DirectMedia-Layer-(SDL).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Simple-DirectMedia-Layer-(SDL).png
--------------------------------------------------------------------------------
/static/skins/tech/Unified-Modelling-Language-(UML).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/Unified-Modelling-Language-(UML).png
--------------------------------------------------------------------------------
/apps/api/src/admin/repositories/index.ts:
--------------------------------------------------------------------------------
1 | export * from './user-skin-collection.repository';
2 | export * from './user-skin.repository';
3 | export * from './user.repository';
4 |
--------------------------------------------------------------------------------
/packages/database/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@repo/typescript-config/base-nestjs.json",
3 | "include": [
4 | "**/*.ts",
5 | "tsup.config.ts"
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/apps/api/prisma/migrations/migration_lock.toml:
--------------------------------------------------------------------------------
1 | # Please do not edit this file manually
2 | # It should be added in your version-control system (i.e. Git)
3 | provider = "postgresql"
--------------------------------------------------------------------------------
/packages/database/prisma/migrations/migration_lock.toml:
--------------------------------------------------------------------------------
1 | # Please do not edit this file manually
2 | # It should be added in your version-control system (i.e. Git)
3 | provider = "postgresql"
--------------------------------------------------------------------------------
/static/skins/tech/RedCube's-epic-Compiler-Thingy-programming-(ReCT).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inferst/evotars-app/HEAD/static/skins/tech/RedCube's-epic-Compiler-Thingy-programming-(ReCT).png
--------------------------------------------------------------------------------
/apps/api/src/constants.ts:
--------------------------------------------------------------------------------
1 | export const TWITCH_PLATFORM_ID = 1;
2 |
3 | export const TWITCH_SCOPE = [
4 | 'moderator:read:chatters',
5 | 'channel:manage:redemptions',
6 | 'chat:read',
7 | ];
8 |
--------------------------------------------------------------------------------
/apps/client/src/utils/utils.ts:
--------------------------------------------------------------------------------
1 | export const getGuid = () => {
2 | const path = window.location.pathname.split('/');
3 | const userGuid = path[path.length - 1];
4 |
5 | return userGuid;
6 | };
7 |
--------------------------------------------------------------------------------
/apps/api/nest-cli.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "assets": [
4 | {
5 | "include": "../public",
6 | "outDir": "./dist/public"
7 | }
8 | ]
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/apps/api/src/admin/twitch/token-revoked.exception.ts:
--------------------------------------------------------------------------------
1 | export class TokenRevokedException extends Error {
2 | public name = 'TokenRevokedException';
3 | public message = 'The token has been revoked.';
4 | }
5 |
--------------------------------------------------------------------------------
/packages/types/src/dto/message.ts:
--------------------------------------------------------------------------------
1 | import { UserInfo } from './user';
2 |
3 | export type MessageEntity = {
4 | userId: string;
5 | message: string;
6 | emotes: string[];
7 | info: UserInfo;
8 | };
9 |
--------------------------------------------------------------------------------
/apps/api/src/admin/controllers/index.ts:
--------------------------------------------------------------------------------
1 | export { UserController } from './user.controller';
2 | export { CommandController } from './command.controller';
3 | export { SpriteController } from './sprite.controller';
4 |
--------------------------------------------------------------------------------
/apps/api/src/auth/exceptions/invalid-token.exception.ts:
--------------------------------------------------------------------------------
1 | export class InvalidTokenException extends Error {
2 | public name = 'InvalidTokenException';
3 |
4 | public message = 'Access token is invalid.';
5 | }
6 |
--------------------------------------------------------------------------------
/apps/website/public/sitemap.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | https://evotars.inferst.com/
4 | 1.0
5 |
6 |
7 |
--------------------------------------------------------------------------------
/apps/admin/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { type ClassValue, clsx } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 |
4 | export function cn(...inputs: ClassValue[]) : string {
5 | return twMerge(clsx(inputs))
6 | }
7 |
--------------------------------------------------------------------------------
/apps/website/src/mdx-components.tsx:
--------------------------------------------------------------------------------
1 | import type { MDXComponents } from 'mdx/types';
2 |
3 | export function useMDXComponents(components: MDXComponents): MDXComponents {
4 | return {
5 | ...components,
6 | };
7 | }
8 |
--------------------------------------------------------------------------------
/apps/website/src/utils/index.ts:
--------------------------------------------------------------------------------
1 | import { type ClassValue, clsx } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 |
4 | export function cn(...inputs: ClassValue[]) : string {
5 | return twMerge(clsx(inputs))
6 | }
7 |
--------------------------------------------------------------------------------
/apps/website/public/yandex_dd1696715a134c06.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Verification: dd1696715a134c06
7 |
8 |
9 |
--------------------------------------------------------------------------------
/packages/typescript-config/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@repo/typescript-config",
3 | "version": "0.0.0",
4 | "private": true,
5 | "devDependencies": {
6 | "eslint": "9.26.0",
7 | "typescript": "5.8.3"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/apps/api/src/app/controllers/app.controller.ts:
--------------------------------------------------------------------------------
1 | import { Controller, Get } from '@nestjs/common';
2 |
3 | @Controller()
4 | export class AppController {
5 | @Get('/meta')
6 | public getMeta(): string {
7 | return '';
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/apps/api/src/admin/services/index.ts:
--------------------------------------------------------------------------------
1 | export { ActionService } from './action.service';
2 | export { ChatMessageService } from './chat-message.service';
3 | export { SocketService } from './socket.service';
4 | export { SpriteService } from './sprite.service';
5 |
--------------------------------------------------------------------------------
/apps/admin/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@repo/typescript-config/vite.json",
3 | "include": [
4 | "src"
5 | ],
6 | "compilerOptions": {
7 | "paths": {
8 | "@/*": [
9 | "./src/*"
10 | ]
11 | }
12 | },
13 | }
14 |
--------------------------------------------------------------------------------
/apps/api/src/database/seed/skins/dudes.ts:
--------------------------------------------------------------------------------
1 | export const skins = [
2 | 'agent',
3 | 'cat',
4 | 'duck',
5 | 'duck_evil',
6 | 'dude',
7 | 'girl',
8 | 'nerd',
9 | 'nyan',
10 | 'owl',
11 | 'senior',
12 | 'sith',
13 | 'sponge',
14 | ];
15 |
--------------------------------------------------------------------------------
/packages/database/src/seed/skins/dudes.ts:
--------------------------------------------------------------------------------
1 | export const skins = [
2 | 'agent',
3 | 'cat',
4 | 'duck',
5 | 'duck_evil',
6 | 'dude',
7 | 'girl',
8 | 'nerd',
9 | 'nyan',
10 | 'owl',
11 | 'senior',
12 | 'sith',
13 | 'sponge',
14 | ];
15 |
--------------------------------------------------------------------------------
/packages/types/src/schema/index.ts:
--------------------------------------------------------------------------------
1 | export * from './action';
2 | export * from './chatter';
3 | export * from './command';
4 | export * from './reward';
5 | export * from './settings';
6 | export * from './user-skin';
7 | export * from './user-skin-collection';
8 |
--------------------------------------------------------------------------------
/apps/website/src/lib/i18n/settings.ts:
--------------------------------------------------------------------------------
1 | export const fallbackLng = 'en';
2 | export const languages = [fallbackLng, 'ru'];
3 | export const defaultNS = 'translation';
4 | export const cookieName = 'i18next';
5 | export const headerName = 'x-i18next-current-language';
6 |
--------------------------------------------------------------------------------
/apps/api/prisma/migrations/20240121195332_add_action_data_command_data/migration.sql:
--------------------------------------------------------------------------------
1 | -- AlterTable
2 | ALTER TABLE "Action" ADD COLUMN "data" JSONB NOT NULL DEFAULT '{}';
3 |
4 | -- AlterTable
5 | ALTER TABLE "Command" ADD COLUMN "data" JSONB NOT NULL DEFAULT '{}';
6 |
--------------------------------------------------------------------------------
/.devcontainer/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM mcr.microsoft.com/devcontainers/typescript-node:1-20-bullseye
2 |
3 | RUN apt-get -y update && export DEBIAN_FRONTEND=noninteractive \
4 | && apt-get -y install git gnupg2
5 |
6 | RUN npm install -g pnpm
7 |
8 | RUN pnpm fetch
9 |
10 |
--------------------------------------------------------------------------------
/apps/client/src/style.css:
--------------------------------------------------------------------------------
1 | :root {
2 | margin: 0;
3 | padding: 0;
4 | }
5 |
6 | html {
7 | height: 100%;
8 | }
9 |
10 | body {
11 | margin: 0;
12 | padding: 0;
13 | width: 100%;
14 | height: 100%;
15 | min-height: 100%;
16 | overflow: hidden;
17 | }
18 |
--------------------------------------------------------------------------------
/packages/database/prisma/migrations/20240121195332_add_action_data_command_data/migration.sql:
--------------------------------------------------------------------------------
1 | -- AlterTable
2 | ALTER TABLE "Action" ADD COLUMN "data" JSONB NOT NULL DEFAULT '{}';
3 |
4 | -- AlterTable
5 | ALTER TABLE "Command" ADD COLUMN "data" JSONB NOT NULL DEFAULT '{}';
6 |
--------------------------------------------------------------------------------
/packages/types/src/schema/user-skin.ts:
--------------------------------------------------------------------------------
1 | import { z } from 'zod';
2 |
3 | export const updateUserSkinDtoSchema = z
4 | .object({
5 | id: z.number().int().min(1),
6 | isActive: z.boolean().optional(),
7 | isDefault: z.boolean().optional(),
8 | })
9 | .strict();
10 |
--------------------------------------------------------------------------------
/static/skins/tech/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "tech",
3 | "collider": {
4 | "x": 0,
5 | "y": 0,
6 | "w": 512,
7 | "h": 512
8 | },
9 | "size": {
10 | "w": 512,
11 | "h": 512
12 | },
13 | "scale": 0.25,
14 | "flip": false,
15 | "colored": []
16 | }
17 |
--------------------------------------------------------------------------------
/apps/client/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@repo/typescript-config/vite.json",
3 | "include": [
4 | "src"
5 | ],
6 | "compilerOptions": {
7 | "moduleResolution": "node",
8 | "paths": {
9 | "@/*": [
10 | "./src/*",
11 | ]
12 | }
13 | },
14 | }
15 |
--------------------------------------------------------------------------------
/apps/website/public/site.webmanifest:
--------------------------------------------------------------------------------
1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
--------------------------------------------------------------------------------
/apps/admin/src/components/common/Loader.tsx:
--------------------------------------------------------------------------------
1 | import { Loader2 } from 'lucide-react';
2 |
3 | export function Loader() {
4 | return (
5 |
6 |
7 |
8 | );
9 | }
10 |
--------------------------------------------------------------------------------
/packages/types/src/schema/user-skin-collection.ts:
--------------------------------------------------------------------------------
1 | import { z } from 'zod';
2 |
3 | export const updateUserSkinCollectionDtoSchema = z
4 | .object({
5 | id: z.number().int().min(1),
6 | isActive: z.boolean().optional(),
7 | isDefault: z.boolean().optional(),
8 | })
9 | .strict();
10 |
--------------------------------------------------------------------------------
/packages/types/src/dto/settings.ts:
--------------------------------------------------------------------------------
1 | import { Settings } from '@repo/database';
2 | import { z } from 'zod';
3 | import { updateSettingsDtoSchema } from '../schema/settings';
4 |
5 | export type UpdateSettingsDto = z.infer;
6 |
7 | export type SettingsEntity = Settings['data'];
8 |
--------------------------------------------------------------------------------
/static/skins/dudes/cat/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cat",
3 | "collider": {
4 | "x": 8,
5 | "y": 4,
6 | "w": 16,
7 | "h": 21
8 | },
9 | "size": {
10 | "w": 32,
11 | "h": 32
12 | },
13 | "scale": 4,
14 | "flip": true,
15 | "colored": [
16 | "Body"
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/static/skins/dudes/duck/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "duck",
3 | "collider": {
4 | "x": 8,
5 | "y": 7,
6 | "w": 16,
7 | "h": 18
8 | },
9 | "size": {
10 | "w": 32,
11 | "h": 32
12 | },
13 | "scale": 4,
14 | "flip": true,
15 | "colored": ["Body"]
16 | }
17 |
--------------------------------------------------------------------------------
/static/skins/dudes/dude/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "dude",
3 | "collider": {
4 | "x": 8,
5 | "y": 7,
6 | "w": 16,
7 | "h": 18
8 | },
9 | "size": {
10 | "w": 32,
11 | "h": 32
12 | },
13 | "scale": 4,
14 | "flip": true,
15 | "colored": [
16 | "Body"
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/static/skins/dudes/girl/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "girl",
3 | "collider": {
4 | "x": 8,
5 | "y": 5,
6 | "w": 16,
7 | "h": 20
8 | },
9 | "size": {
10 | "w": 32,
11 | "h": 32
12 | },
13 | "scale": 4,
14 | "flip": true,
15 | "colored": [
16 | "Body"
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/static/skins/dudes/nerd/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nerd",
3 | "collider": {
4 | "x": 8,
5 | "y": 7,
6 | "w": 16,
7 | "h": 18
8 | },
9 | "size": {
10 | "w": 32,
11 | "h": 32
12 | },
13 | "scale": 4,
14 | "flip": true,
15 | "colored": [
16 | "Body"
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/static/skins/dudes/nyan/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nyan",
3 | "collider": {
4 | "x": 14,
5 | "y": 4,
6 | "w": 16,
7 | "h": 21
8 | },
9 | "size": {
10 | "w": 32,
11 | "h": 32
12 | },
13 | "scale": 4,
14 | "flip": true,
15 | "colored": ["Body"]
16 | }
17 |
--------------------------------------------------------------------------------
/static/skins/dudes/owl/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "owl",
3 | "collider": {
4 | "x": 8,
5 | "y": 4,
6 | "w": 17,
7 | "h": 21
8 | },
9 | "size": {
10 | "w": 32,
11 | "h": 32
12 | },
13 | "scale": 4,
14 | "flip": true,
15 | "colored": ["Body"]
16 | }
17 |
--------------------------------------------------------------------------------
/static/skins/dudes/sith/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "sith",
3 | "collider": {
4 | "x": 8,
5 | "y": 5,
6 | "w": 16,
7 | "h": 20
8 | },
9 | "size": {
10 | "w": 32,
11 | "h": 32
12 | },
13 | "scale": 4,
14 | "flip": true,
15 | "colored": [
16 | "Body"
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/packages/types/src/dto/user.ts:
--------------------------------------------------------------------------------
1 | export type UserEntity = {
2 | userId: number;
3 | guid: string;
4 | displayName: string;
5 | profileImageUrl: string;
6 | previewUrl: string;
7 | };
8 |
9 | export type UserInfo = {
10 | displayName: string;
11 | sprite: string;
12 | color?: string;
13 | };
14 |
--------------------------------------------------------------------------------
/static/skins/dudes/agent/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "agent",
3 | "collider": {
4 | "x": 8,
5 | "y": 7,
6 | "w": 16,
7 | "h": 18
8 | },
9 | "size": {
10 | "w": 32,
11 | "h": 32
12 | },
13 | "scale": 4,
14 | "flip": true,
15 | "colored": [
16 | "Body"
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/static/skins/dudes/senior/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "senior",
3 | "collider": {
4 | "x": 8,
5 | "y": 4,
6 | "w": 16,
7 | "h": 21
8 | },
9 | "size": {
10 | "w": 32,
11 | "h": 32
12 | },
13 | "scale": 4,
14 | "flip": true,
15 | "colored": [
16 | "Body"
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/static/skins/dudes/sponge/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "sponge",
3 | "collider": {
4 | "x": 8,
5 | "y": 7,
6 | "w": 16,
7 | "h": 18
8 | },
9 | "size": {
10 | "w": 32,
11 | "h": 32
12 | },
13 | "scale": 4,
14 | "flip": true,
15 | "colored": [
16 | "Body"
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.md]
12 | max_line_length = off
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/apps/client/src/main.ts:
--------------------------------------------------------------------------------
1 | import { app } from './app/app';
2 | import './style.css';
3 |
4 | const init = async (): Promise => {
5 | // Hot reload
6 | if (import.meta.hot) {
7 | import.meta.hot.accept(() => {
8 | //
9 | });
10 | }
11 |
12 | await app.init();
13 | };
14 |
15 | init();
16 |
--------------------------------------------------------------------------------
/static/skins/dudes/duck_evil/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "duck_evil",
3 | "collider": {
4 | "x": 8,
5 | "y": 7,
6 | "w": 16,
7 | "h": 18
8 | },
9 | "size": {
10 | "w": 32,
11 | "h": 32
12 | },
13 | "scale": 4,
14 | "flip": true,
15 | "colored": ["Body"]
16 | }
17 |
--------------------------------------------------------------------------------
/apps/website/public/assets/twitch.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/packages/types/src/dto/user-skin.ts:
--------------------------------------------------------------------------------
1 | import { z } from 'zod';
2 | import { updateUserSkinDtoSchema } from '..';
3 |
4 | export type UserSkinEntity = {
5 | id: number;
6 | name: string;
7 | isActive: boolean;
8 | isDefault: boolean;
9 | };
10 |
11 | export type UpdateUserSkinDto = z.infer;
12 |
--------------------------------------------------------------------------------
/apps/api/src/database/database.module.ts:
--------------------------------------------------------------------------------
1 | import { Global, Module } from '@nestjs/common';
2 | import { PrismaService } from '@/database/prisma.service';
3 |
4 | @Global()
5 | @Module({
6 | exports: [PrismaService],
7 | imports: [],
8 | controllers: [],
9 | providers: [PrismaService],
10 | })
11 | export class DatabaseModule {}
12 |
--------------------------------------------------------------------------------
/apps/admin/src/components/Auth/use-auth.tsx:
--------------------------------------------------------------------------------
1 | import { useContext } from 'react';
2 | import { AuthContext } from './AuthProvider';
3 |
4 | export const useAuth = () => {
5 | const ctx = useContext(AuthContext);
6 | if (ctx === undefined) {
7 | throw new Error('AuthContext must be attached.');
8 | }
9 |
10 | return ctx;
11 | };
12 |
--------------------------------------------------------------------------------
/apps/api/src/database/prisma.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable, OnModuleInit } from '@nestjs/common';
2 | import { PrismaClient } from '@repo/database';
3 |
4 | @Injectable()
5 | export class PrismaService extends PrismaClient implements OnModuleInit {
6 | public async onModuleInit(): Promise {
7 | await this.$connect();
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/apps/website/next.config.ts:
--------------------------------------------------------------------------------
1 | import type { NextConfig } from 'next';
2 | import createMDX from '@next/mdx';
3 |
4 | const nextConfig: NextConfig = {
5 | pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'],
6 | output: 'standalone',
7 | };
8 |
9 | const withMDX = createMDX({
10 | extension: /\.(md|mdx)$/,
11 | });
12 |
13 | export default withMDX(nextConfig);
14 |
--------------------------------------------------------------------------------
/packages/types/src/dto/index.ts:
--------------------------------------------------------------------------------
1 | export * from './action';
2 | export * from './chatter';
3 | export * from './command';
4 | export * from './message';
5 | export * from './raid';
6 | export * from './reward';
7 | export * from './settings';
8 | export * from './socket';
9 | export * from './user';
10 | export * from './user-skin';
11 | export * from './user-skin-collection';
12 |
--------------------------------------------------------------------------------
/apps/api/src/instruments.ts:
--------------------------------------------------------------------------------
1 | import * as Sentry from "@sentry/nestjs"
2 |
3 | Sentry.init({
4 | dsn: "https://f37c4d61c30033a2d67b232af5275255@o4507430774898688.ingest.de.sentry.io/4509684650344529",
5 |
6 | // Setting this option to true will send default PII data to Sentry.
7 | // For example, automatic IP address collection on events
8 | sendDefaultPii: true,
9 | });
10 |
--------------------------------------------------------------------------------
/apps/admin/src/main.tsx:
--------------------------------------------------------------------------------
1 | import { StrictMode } from 'react';
2 | import * as ReactDOM from 'react-dom/client';
3 | import './style.css';
4 | import App from './App';
5 |
6 | import './i18n';
7 |
8 | const root = document.getElementById('root');
9 |
10 | if (root) {
11 | ReactDOM.createRoot(root).render(
12 |
13 |
14 |
15 | );
16 | }
17 |
--------------------------------------------------------------------------------
/packages/eslint-config/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@repo/eslint-config",
3 | "version": "0.0.0",
4 | "main": "index.js",
5 | "type": "module",
6 | "devDependencies": {
7 | "@eslint/js": "9.25.1",
8 | "eslint": "9.26.0",
9 | "eslint-plugin-react": "7.37.5",
10 | "globals": "16.1.0",
11 | "typescript": "5.8.3",
12 | "typescript-eslint": "8.31.0"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/packages/types/src/dto/user-skin-collection.ts:
--------------------------------------------------------------------------------
1 | import { z } from 'zod';
2 | import { updateUserSkinCollectionDtoSchema } from '..';
3 |
4 | export type UserSkinCollectionEntity = {
5 | id: number;
6 | name: string;
7 | isActive: boolean;
8 | isDefault: boolean;
9 | };
10 |
11 | export type UpdateUserSkinCollectionDto = z.infer<
12 | typeof updateUserSkinCollectionDtoSchema
13 | >;
14 |
--------------------------------------------------------------------------------
/apps/api/src/pipes/zod.pipe.ts:
--------------------------------------------------------------------------------
1 | import { Injectable, PipeTransform } from '@nestjs/common';
2 | import { ZodSchema } from 'zod';
3 |
4 | // TODO: parse action data with type guard
5 | @Injectable()
6 | export class ZodPipe implements PipeTransform {
7 | constructor(private readonly schema: ZodSchema) {}
8 |
9 | transform(value: T): T {
10 | this.schema.parse(value);
11 | return value;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/packages/types/src/dto/command.ts:
--------------------------------------------------------------------------------
1 | import { z } from 'zod';
2 | import {
3 | createCommandDtoSchema,
4 | updateCommandDtoSchema
5 | } from '../schema/command';
6 | import { Command } from '@repo/database';
7 |
8 | export type UpdateCommandDto = z.infer;
9 |
10 | export type CreateCommandDto = z.infer;
11 |
12 | export type CommandEntity = Command;
13 |
--------------------------------------------------------------------------------
/packages/types/src/dto/raid.ts:
--------------------------------------------------------------------------------
1 | import { UserInfo } from './user';
2 |
3 | export type RaidEntity = {
4 | broadcaster: {
5 | id: string;
6 | info: UserInfo;
7 | };
8 | viewers: {
9 | count: number;
10 | sprite: string;
11 | };
12 | };
13 |
14 | export type RewardRedemptionData = {
15 | rewardId: string;
16 | userId: string;
17 | userDisplayName: string;
18 | input: string;
19 | };
20 |
--------------------------------------------------------------------------------
/apps/client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Overlay / Evotars
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/apps/admin/src/queries/actions.ts:
--------------------------------------------------------------------------------
1 | import { createQueryKeys } from '@lukemorales/query-key-factory';
2 | import { api } from '../api/api';
3 | import { useApiQuery } from '../api/use-api-query';
4 |
5 | export const actionsKeys = createQueryKeys('actions', {
6 | list: {
7 | queryKey: null,
8 | queryFn: api.getActions,
9 | },
10 | });
11 |
12 | export const useActionsQuery = () =>
13 | useApiQuery({
14 | ...actionsKeys.list,
15 | });
16 |
--------------------------------------------------------------------------------
/apps/admin/src/queries/rewards.ts:
--------------------------------------------------------------------------------
1 | import { createQueryKeys } from '@lukemorales/query-key-factory';
2 | import { api } from '../api/api';
3 | import { useApiQuery } from '../api/use-api-query';
4 |
5 | export const rewardsKeys = createQueryKeys('rewards', {
6 | list: {
7 | queryKey: null,
8 | queryFn: api.getRewards,
9 | },
10 | });
11 |
12 | export const useRewardsQuery = () =>
13 | useApiQuery({
14 | ...rewardsKeys.list,
15 | });
16 |
--------------------------------------------------------------------------------
/apps/admin/src/queries/chatters.ts:
--------------------------------------------------------------------------------
1 | import { createQueryKeys } from "@lukemorales/query-key-factory";
2 | import { api } from "../api/api";
3 | import { useApiQuery } from "../api/use-api-query";
4 |
5 | export const chattersKeys = createQueryKeys('chatters', {
6 | list: {
7 | queryKey: null,
8 | queryFn: api.getChatters,
9 | },
10 | });
11 |
12 | export const useChattersQuery = () =>
13 | useApiQuery({
14 | ...chattersKeys.list,
15 | });
16 |
--------------------------------------------------------------------------------
/apps/admin/src/queries/commands.ts:
--------------------------------------------------------------------------------
1 | import { createQueryKeys } from "@lukemorales/query-key-factory";
2 | import { api } from "../api/api";
3 | import { useApiQuery } from "../api/use-api-query";
4 |
5 | export const commandsKeys = createQueryKeys('commands', {
6 | list: {
7 | queryKey: null,
8 | queryFn: api.getCommands,
9 | },
10 | });
11 |
12 | export const useCommandsQuery = () =>
13 | useApiQuery({
14 | ...commandsKeys.list,
15 | });
16 |
--------------------------------------------------------------------------------
/apps/admin/src/queries/settings.ts:
--------------------------------------------------------------------------------
1 | import { createQueryKeys } from '@lukemorales/query-key-factory';
2 | import { api } from '../api/api';
3 | import { useApiQuery } from '../api/use-api-query';
4 |
5 | export const settingsKeys = createQueryKeys('settings', {
6 | list: {
7 | queryKey: null,
8 | queryFn: api.getSettings,
9 | },
10 | });
11 |
12 | export const useSettingsQuery = () =>
13 | useApiQuery({
14 | ...settingsKeys.list,
15 | });
16 |
--------------------------------------------------------------------------------
/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "default",
4 | "rsc": false,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "apps/admin/tailwind.config.js",
8 | "css": "apps/admin/src/style.css",
9 | "baseColor": "zinc",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@app/admin/components",
15 | "utils": "@app/admin/lib/utils"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/packages/types/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@repo/typescript-config/nestjs.json",
3 | "compilerOptions": {
4 | "strictNullChecks": true,
5 | "allowJs": true,
6 | "baseUrl": "src",
7 | "esModuleInterop": true,
8 | "incremental": false,
9 | "outDir": "dist"
10 | },
11 | "include": [
12 | "src/**/*.ts"
13 | ],
14 | "exclude": [
15 | "node_modules",
16 | "test",
17 | "dist",
18 | "**/*spec.ts"
19 | ]
20 | }
21 |
--------------------------------------------------------------------------------
/apps/api/prisma/migrations/20240117143624_add_settings_table/migration.sql:
--------------------------------------------------------------------------------
1 | -- CreateTable
2 | CREATE TABLE "Settings" (
3 | "id" SERIAL NOT NULL,
4 | "userId" INTEGER NOT NULL,
5 | "data" JSONB NOT NULL DEFAULT '{}',
6 |
7 | CONSTRAINT "Settings_pkey" PRIMARY KEY ("id")
8 | );
9 |
10 | -- AddForeignKey
11 | ALTER TABLE "Settings" ADD CONSTRAINT "Settings_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
12 |
--------------------------------------------------------------------------------
/apps/api/prisma/migrations/20240411135958_chatter/migration.sql:
--------------------------------------------------------------------------------
1 | -- CreateTable
2 | CREATE TABLE "Chatter" (
3 | "id" SERIAL NOT NULL,
4 | "userId" INTEGER NOT NULL,
5 | "chatterName" TEXT NOT NULL,
6 | "sprite" TEXT NOT NULL,
7 |
8 | CONSTRAINT "Chatter_pkey" PRIMARY KEY ("id")
9 | );
10 |
11 | -- AddForeignKey
12 | ALTER TABLE "Chatter" ADD CONSTRAINT "Chatter_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
13 |
--------------------------------------------------------------------------------
/packages/database/prisma/migrations/20240117143624_add_settings_table/migration.sql:
--------------------------------------------------------------------------------
1 | -- CreateTable
2 | CREATE TABLE "Settings" (
3 | "id" SERIAL NOT NULL,
4 | "userId" INTEGER NOT NULL,
5 | "data" JSONB NOT NULL DEFAULT '{}',
6 |
7 | CONSTRAINT "Settings_pkey" PRIMARY KEY ("id")
8 | );
9 |
10 | -- AddForeignKey
11 | ALTER TABLE "Settings" ADD CONSTRAINT "Settings_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
12 |
--------------------------------------------------------------------------------
/packages/types/src/dto/chatter.ts:
--------------------------------------------------------------------------------
1 | import { Chatter } from '@repo/database';
2 | import { z } from 'zod';
3 | import { createChatterDtoSchema, updateChatterDtoSchema } from '../schema';
4 |
5 | export type TwitchChatterEntity = {
6 | userId: string;
7 | name: string;
8 | };
9 |
10 | export type UpdateChatterDto = z.infer;
11 |
12 | export type CreateChatterDto = z.infer;
13 |
14 | export type ChatterEntity = Chatter;
15 |
--------------------------------------------------------------------------------
/apps/website/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import { dirname } from "path";
2 | import { fileURLToPath } from "url";
3 | import { FlatCompat } from "@eslint/eslintrc";
4 |
5 | const __filename = fileURLToPath(import.meta.url);
6 | const __dirname = dirname(__filename);
7 |
8 | const compat = new FlatCompat({
9 | baseDirectory: __dirname,
10 | });
11 |
12 | const eslintConfig = [
13 | ...compat.extends("next/core-web-vitals", "next/typescript"),
14 | ];
15 |
16 | export default eslintConfig;
17 |
--------------------------------------------------------------------------------
/packages/database/prisma/migrations/20240411135958_chatter/migration.sql:
--------------------------------------------------------------------------------
1 | -- CreateTable
2 | CREATE TABLE "Chatter" (
3 | "id" SERIAL NOT NULL,
4 | "userId" INTEGER NOT NULL,
5 | "chatterName" TEXT NOT NULL,
6 | "sprite" TEXT NOT NULL,
7 |
8 | CONSTRAINT "Chatter_pkey" PRIMARY KEY ("id")
9 | );
10 |
11 | -- AddForeignKey
12 | ALTER TABLE "Chatter" ADD CONSTRAINT "Chatter_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
13 |
--------------------------------------------------------------------------------
/apps/api/src/database/seed/actions/resurrect.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '@repo/database';
2 |
3 | export async function resurrectActionSeed(prisma: PrismaClient): Promise {
4 | const spriteAction = await prisma.action.upsert({
5 | where: { name: 'resurrect' },
6 | update: {},
7 | create: {
8 | name: 'resurrect',
9 | title: 'Resurrect',
10 | description: 'Resurrect',
11 | },
12 | });
13 |
14 | console.log({
15 | spriteAction,
16 | });
17 | }
18 |
--------------------------------------------------------------------------------
/packages/database/src/seed/actions/resurrect.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '../../client';
2 |
3 | export async function resurrectActionSeed(prisma: PrismaClient): Promise {
4 | const spriteAction = await prisma.action.upsert({
5 | where: { name: 'resurrect' },
6 | update: {},
7 | create: {
8 | name: 'resurrect',
9 | title: 'Resurrect',
10 | description: 'Resurrect',
11 | },
12 | });
13 |
14 | console.log({
15 | spriteAction,
16 | });
17 | }
18 |
--------------------------------------------------------------------------------
/apps/api/src/admin/exceptions/twitch-http.exception.ts:
--------------------------------------------------------------------------------
1 | import { HttpException } from '@nestjs/common';
2 | import { HttpStatusCodeError } from '@twurple/api-call';
3 |
4 | export class TwitchHttpException extends HttpException {
5 | constructor(error: unknown) {
6 | if (error instanceof HttpStatusCodeError) {
7 | const body = JSON.parse(error.body);
8 | super(body['message'], error.statusCode);
9 | } else if (error instanceof Error) {
10 | super(error.message, 500);
11 | }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/apps/api/src/admin/repositories/skin.repository.ts:
--------------------------------------------------------------------------------
1 | import { PrismaService } from '@/database/prisma.service';
2 | import { Injectable } from '@nestjs/common';
3 | import { Skin } from '@repo/database';
4 |
5 | @Injectable()
6 | export class SkinRepository {
7 | public constructor(private readonly prismaService: PrismaService) {}
8 |
9 | public async getSkins(): Promise {
10 | return this.prismaService.skin.findMany({
11 | orderBy: {
12 | id: 'asc',
13 | },
14 | });
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/apps/api/src/auth/guards/twitch-auth.guard.ts:
--------------------------------------------------------------------------------
1 | import { ExecutionContext, Injectable } from '@nestjs/common';
2 | import { AuthGuard } from '@nestjs/passport';
3 |
4 | @Injectable()
5 | export class TwitchAuthGuard extends AuthGuard('twitch') {
6 | public async canActivate(context: ExecutionContext): Promise {
7 | const activate = (await super.canActivate(context)) as boolean;
8 | const request = context.switchToHttp().getRequest();
9 | await super.logIn(request);
10 | return activate;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # To get started with Dependabot version updates, you'll need to specify which
2 | # package ecosystems to update and where the package manifests are located.
3 | # Please see the documentation for more information:
4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
5 | # https://containers.dev/guide/dependabot
6 |
7 | version: 2
8 | updates:
9 | - package-ecosystem: "devcontainers"
10 | directory: "/"
11 | schedule:
12 | interval: weekly
13 |
--------------------------------------------------------------------------------
/apps/api/src/admin/repositories/action.repository.ts:
--------------------------------------------------------------------------------
1 | import { PrismaService } from '@/database/prisma.service';
2 | import { Injectable } from '@nestjs/common';
3 | import { Action } from '@repo/database';
4 |
5 | @Injectable()
6 | export class ActionRepository {
7 | public constructor(private readonly prismaService: PrismaService) {}
8 |
9 | public async getActions(): Promise {
10 | return this.prismaService.action.findMany({
11 | orderBy: {
12 | id: 'asc',
13 | },
14 | });
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/packages/eslint-config/index.js:
--------------------------------------------------------------------------------
1 | import eslint from '@eslint/js';
2 | import react from 'eslint-plugin-react';
3 | import globals from 'globals';
4 | import tseslint from 'typescript-eslint';
5 |
6 | const base = tseslint.config(
7 | eslint.configs.recommended,
8 | tseslint.configs.recommended,
9 | );
10 |
11 | export default {
12 | base,
13 | react: [
14 | ...base,
15 | react.configs.flat.recommended,
16 | react.configs.flat['jsx-runtime'],
17 | { languageOptions: { globals: globals.browser } },
18 | ],
19 | };
20 |
--------------------------------------------------------------------------------
/apps/api/src/filters/zod.filter.ts:
--------------------------------------------------------------------------------
1 | import { ArgumentsHost, Catch, ExceptionFilter } from '@nestjs/common';
2 | import { ZodError } from 'zod';
3 |
4 | @Catch(ZodError)
5 | export class ZodFilter implements ExceptionFilter {
6 | catch(exception: T, host: ArgumentsHost): void {
7 | const ctx = host.switchToHttp();
8 | const response = ctx.getResponse();
9 | const status = 400;
10 | response.status(status).json({
11 | errors: exception.errors,
12 | statusCode: status,
13 | });
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/apps/api/.env.example:
--------------------------------------------------------------------------------
1 | HOST=localhost
2 | HOST_URL=http://localhost
3 | ADMIN_URL=http://localhost/admin
4 | CLIENT_URL=http://localhost/client
5 |
6 | # Twitch API creds.
7 | TWITCH_CLIENT_ID=t1xgu9qqxhpsrsk6e7viz8qfoj415z
8 | TWITCH_CLIENT_SECRET=kgkw7qe7dvol1x0q9ytvremljdqgta
9 | TWITCH_WEBHOOK_SECRET=1234567890
10 | TWITCH_CALLBACK_URL=http://localhost:3000/api/auth/callback
11 |
12 | # Session.
13 | SESSION_SECRET=1234567890
14 |
15 | # DB
16 | # Do not setup in devcontainer
17 | DATABASE_URL=postgresql://dudes:dudes@localhost:5432/dudes?schema=public
18 |
--------------------------------------------------------------------------------
/apps/api/src/database/seed/actions/add_jump_hits.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '@repo/database';
2 |
3 | export async function addJumpHitsActionSeed(
4 | prisma: PrismaClient,
5 | ): Promise {
6 | const addJumpHitsAction = await prisma.action.upsert({
7 | where: { name: 'add_jump_hits' },
8 | update: {},
9 | create: {
10 | name: 'add_jump_hits',
11 | title: 'Add Jump Hits',
12 | description: 'Add Jump Hits',
13 | },
14 | });
15 |
16 | console.log({
17 | spriteAction: addJumpHitsAction,
18 | });
19 | }
20 |
--------------------------------------------------------------------------------
/packages/database/src/seed/actions/add_jump_hits.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '../../client';
2 |
3 | export async function addJumpHitsActionSeed(
4 | prisma: PrismaClient
5 | ): Promise {
6 | const addJumpHitsAction = await prisma.action.upsert({
7 | where: { name: 'add_jump_hits' },
8 | update: {},
9 | create: {
10 | name: 'add_jump_hits',
11 | title: 'Add Jump Hits',
12 | description: 'Add Jump Hits',
13 | },
14 | });
15 |
16 | console.log({
17 | spriteAction: addJumpHitsAction,
18 | });
19 | }
20 |
--------------------------------------------------------------------------------
/apps/api/src/auth/serializers/auth.serializer.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@nestjs/common';
2 | import { PassportSerializer } from '@nestjs/passport';
3 |
4 | @Injectable()
5 | export class AuthSerializer extends PassportSerializer {
6 | public serializeUser(
7 | user: unknown,
8 | done: (err: null, user: unknown) => void,
9 | ): void {
10 | done(null, user);
11 | }
12 |
13 | public deserializeUser(
14 | payload: unknown,
15 | done: (err: null, user: unknown) => void,
16 | ): void {
17 | done(null, payload);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/apps/admin/src/i18n.ts:
--------------------------------------------------------------------------------
1 | import i18n from 'i18next';
2 | import { initReactI18next } from 'react-i18next';
3 |
4 | import Backend from 'i18next-http-backend';
5 | import LanguageDetector from 'i18next-browser-languagedetector';
6 |
7 | i18n
8 | .use(Backend)
9 | .use(LanguageDetector)
10 | .use(initReactI18next)
11 | .init({
12 | fallbackLng: 'en',
13 | debug: false,
14 |
15 | backend: { loadPath: '/admin/locales/{{lng}}/{{ns}}.json' },
16 |
17 | interpolation: {
18 | escapeValue: false,
19 | },
20 | });
21 |
22 | export default i18n;
23 |
--------------------------------------------------------------------------------
/.devcontainer/devcontainer.extend.yml:
--------------------------------------------------------------------------------
1 | version: '3'
2 | services:
3 | devcontainer:
4 | # Note that the path of the Dockerfile and context is relative to the *primary*
5 | # docker-compose.yml file (the first in the devcontainer.json "dockerComposeFile"
6 | # array). The sample below assumes your primary file is in the root of your project.
7 | build:
8 | context: .
9 | dockerfile: .devcontainer/Dockerfile
10 | volumes:
11 | - dudes:/workspaces
12 | command: /bin/sh -c "while sleep 1000; do :; done"
13 |
14 | volumes:
15 | dudes:
16 |
--------------------------------------------------------------------------------
/apps/api/src/admin/repositories/skin-collection.repository.ts:
--------------------------------------------------------------------------------
1 | import { PrismaService } from '@/database/prisma.service';
2 | import { Injectable } from '@nestjs/common';
3 | import { SkinCollection } from '@repo/database';
4 |
5 | @Injectable()
6 | export class SkinCollectionRepository {
7 | public constructor(private readonly prismaService: PrismaService) {}
8 |
9 | public async getSkinCollections(): Promise {
10 | return this.prismaService.skinCollection.findMany({
11 | orderBy: {
12 | id: 'asc',
13 | },
14 | });
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/packages/types/src/dto/reward.ts:
--------------------------------------------------------------------------------
1 | import { Reward } from '@repo/database';
2 | import { z } from 'zod';
3 | import { createTwitchRewardDtoSchema, updateTwitchRewardDtoSchema } from '../schema/reward';
4 |
5 | export type UpdateTwitchRewardDto = z.infer;
6 |
7 | export type CreateTwitchRewardDto = z.infer;
8 |
9 | export type RewardEntity = Reward;
10 |
11 | export type TwitchRewardEntity = {
12 | title?: string;
13 | cost?: number;
14 | isDeleted: boolean;
15 | isActive: boolean;
16 | } & RewardEntity;
17 |
--------------------------------------------------------------------------------
/packages/typescript-config/vite.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./base.json",
3 | "compilerOptions": {
4 | "target": "ESNext",
5 | "useDefineForClassFields": true,
6 | "module": "ESNext",
7 | "lib": [
8 | "ESNext",
9 | "DOM"
10 | ],
11 | "sourceMap": true,
12 | "resolveJsonModule": true,
13 | "noEmit": true,
14 | "noUnusedLocals": true,
15 | "noUnusedParameters": true,
16 | "noImplicitReturns": true,
17 | "jsx": "preserve",
18 | "allowImportingTsExtensions": true
19 | },
20 | "exclude": [
21 | "node_modules"
22 | ]
23 | }
24 |
--------------------------------------------------------------------------------
/apps/api/src/admin/controllers/action.controller.ts:
--------------------------------------------------------------------------------
1 | import { AuthGuard } from '@/auth/guards';
2 | import { Controller, Get, UseGuards } from '@nestjs/common';
3 | import { ActionEntity } from '@repo/types';
4 | import { ActionRepository } from '../repositories/action.repository';
5 |
6 | @Controller('/action')
7 | export class ActionController {
8 | public constructor(private readonly actionRepository: ActionRepository) {}
9 |
10 | @Get('/list')
11 | @UseGuards(AuthGuard)
12 | public async getActions(): Promise {
13 | return this.actionRepository.getActions();
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/apps/api/src/auth/repositories/user.repository.ts:
--------------------------------------------------------------------------------
1 | import { PrismaService } from '@/database/prisma.service';
2 | import { Injectable } from '@nestjs/common';
3 | import { User } from '@repo/database';
4 |
5 | @Injectable()
6 | export class UserRepository {
7 | public constructor(private readonly prismaService: PrismaService) {}
8 |
9 | public async getByIdOrCreate(id: number): Promise {
10 | const user = await this.prismaService.user.upsert({
11 | where: {
12 | id,
13 | },
14 | update: {},
15 | create: {},
16 | });
17 |
18 | return user;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/packages/typescript-config/base-nestjs.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "compilerOptions": {
4 | "declaration": true,
5 | "declarationMap": true,
6 | "esModuleInterop": true,
7 | "incremental": false,
8 | "isolatedModules": true,
9 | "lib": ["es2022", "DOM", "DOM.Iterable"],
10 | "module": "NodeNext",
11 | "moduleDetection": "force",
12 | "moduleResolution": "NodeNext",
13 | "noUncheckedIndexedAccess": true,
14 | "resolveJsonModule": true,
15 | "skipLibCheck": true,
16 | "strict": true,
17 | "target": "ES2022"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/apps/api/src/admin/services/chat-message.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@nestjs/common';
2 |
3 | @Injectable()
4 | export class ChatMessageService {
5 | public isUserCommand(message: string): boolean {
6 | return message.startsWith('!');
7 | }
8 |
9 | public stripEmotes(message: string, emotes: string[]): string {
10 | return message
11 | .split(' ')
12 | .filter((word) => !emotes.includes(word))
13 | .join(' ');
14 | }
15 |
16 | public formatMessage(message: string): string {
17 | if (this.isUserCommand(message)) {
18 | return '';
19 | }
20 |
21 | return message.trim();
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/apps/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite --clearScreen false",
8 | "build": "tsc && vite build",
9 | "preview": "vite preview",
10 | "lint": "tsc --noEmit"
11 | },
12 | "dependencies": {
13 | "@repo/eslint-config": "workspace:*",
14 | "@repo/types": "workspace:*",
15 | "@repo/typescript-config": "workspace:*",
16 | "evotars": "0.0.20",
17 | "socket.io-client": "4.8.1",
18 | "vite": "6.3.5"
19 | },
20 | "devDependencies": {
21 | "eslint": "9.26.0",
22 | "typescript": "5.8.3"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/packages/typescript-config/base.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "compilerOptions": {
4 | "composite": false,
5 | "declaration": true,
6 | "declarationMap": true,
7 | "esModuleInterop": true,
8 | "forceConsistentCasingInFileNames": true,
9 | "inlineSources": false,
10 | "isolatedModules": true,
11 | "module": "ESNext",
12 | "moduleResolution": "Bundler",
13 | "noUnusedLocals": false,
14 | "noUnusedParameters": false,
15 | "preserveWatchOutput": true,
16 | "skipLibCheck": true,
17 | "strict": true
18 | },
19 | "exclude": [
20 | "node_modules"
21 | ]
22 | }
23 |
--------------------------------------------------------------------------------
/apps/website/src/components/Card.tsx:
--------------------------------------------------------------------------------
1 | import { JSX } from 'react';
2 |
3 | type CardProps = {
4 | icon: JSX.Element;
5 | title: string;
6 | description: string;
7 | };
8 |
9 | export const Card = (props: CardProps) => {
10 | return (
11 | <>
12 |
13 |
14 | {props.icon}
15 |
16 |
{props.title}
17 |
{props.description}
18 |
19 | >
20 | );
21 | };
22 |
--------------------------------------------------------------------------------
/packages/types/src/dto/socket.ts:
--------------------------------------------------------------------------------
1 | import { UserActionEntity } from './action';
2 | import { TwitchChatterEntity } from './chatter';
3 | import { RaidEntity } from './raid';
4 | import { MessageEntity } from './message';
5 | import { SettingsEntity } from './settings';
6 |
7 | export type ServerToClientsEvents = {
8 | message: (data: MessageEntity) => void;
9 | settings: (data: SettingsEntity) => void;
10 | chatters: (data: TwitchChatterEntity[]) => void;
11 | action: (data: UserActionEntity) => void;
12 | raid: (data: RaidEntity) => void;
13 | };
14 |
15 | export interface ClientToServerEvents {
16 | initialize: (data: { roomId: string }) => void;
17 | }
18 |
--------------------------------------------------------------------------------
/packages/database/src/seed/seed.ts:
--------------------------------------------------------------------------------
1 | import { actionSeed } from './actions';
2 | import { dudesSkinCollectionSeed } from './skins';
3 |
4 | import { prisma } from '../client';
5 |
6 | async function main(): Promise {
7 | await actionSeed(prisma);
8 | await dudesSkinCollectionSeed(prisma);
9 |
10 | await prisma.platform.upsert({
11 | where: { id: 1 },
12 | update: {},
13 | create: {
14 | name: 'twitch',
15 | },
16 | });
17 | }
18 |
19 | main()
20 | .then(async () => {
21 | await prisma.$disconnect();
22 | })
23 | .catch(async (e) => {
24 | console.error(e);
25 | await prisma.$disconnect();
26 | process.exit(1);
27 | });
28 |
--------------------------------------------------------------------------------
/apps/website/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.*
7 | .yarn/*
8 | !.yarn/patches
9 | !.yarn/plugins
10 | !.yarn/releases
11 | !.yarn/versions
12 |
13 | # testing
14 | /coverage
15 |
16 | # next.js
17 | /.next/
18 | /out/
19 |
20 | # production
21 | /build
22 |
23 | # misc
24 | .DS_Store
25 | *.pem
26 |
27 | # debug
28 | npm-debug.log*
29 | yarn-debug.log*
30 | yarn-error.log*
31 | .pnpm-debug.log*
32 |
33 | # env files (can opt-in for committing if needed)
34 | .env*
35 |
36 | # vercel
37 | .vercel
38 |
39 | # typescript
40 | *.tsbuildinfo
41 | next-env.d.ts
42 |
--------------------------------------------------------------------------------
/compose.dev.yaml:
--------------------------------------------------------------------------------
1 | services:
2 |
3 | postgres:
4 | image: postgres:15-alpine
5 | container_name: evotars-postgres
6 | ports:
7 | - 5432:5432
8 | volumes:
9 | - postgres-data:/var/lib/postgresql/data
10 | environment:
11 | - POSTGRES_PASSWORD=dudes
12 | - POSTGRES_USER=dudes
13 | - POSTGRES_DB=dudes
14 | restart: unless-stopped
15 |
16 | nginx:
17 | image: nginx:alpine
18 | container_name: evotars-nginx
19 | ports:
20 | - 80:80
21 | volumes:
22 | - ./nginx/dev.conf:/etc/nginx/conf.d/default.conf
23 | - ./static:/var/www/html
24 | restart: unless-stopped
25 |
26 | volumes:
27 | postgres-data:
28 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "evotars-app",
3 | "version": "0.0.0",
4 | "license": "MIT",
5 | "scripts": {
6 | "dev": "turbo dev",
7 | "build": "turbo build",
8 | "lint": "turbo lint",
9 | "db:migrate:dev": "turbo db:migrate:dev",
10 | "db:migrate:deploy": "turbo db:migrate:deploy",
11 | "db:seed": "turbo db:seed"
12 | },
13 | "prisma": {
14 | "seed": "ts-node --compiler-options {\"module\":\"CommonJS\"} apps/api/src/database/seed/seed.ts"
15 | },
16 | "devDependencies": {
17 | "turbo": "2.5.3",
18 | "typescript": "5.8.3"
19 | },
20 | "pnpm": {
21 | "neverBuiltDependencies": []
22 | },
23 | "packageManager": "pnpm@10.10.0"
24 | }
25 |
--------------------------------------------------------------------------------
/apps/api/src/auth/decorators/auth.decorator.ts:
--------------------------------------------------------------------------------
1 | import { createParamDecorator, ExecutionContext } from '@nestjs/common';
2 | import { RuntimeException } from '@nestjs/core/errors/exceptions/runtime.exception';
3 | import { AuthUserProps } from '@/auth/services/auth.service';
4 |
5 | export const factory = (_: unknown, ctx: ExecutionContext): AuthUserProps => {
6 | const request = ctx.switchToHttp().getRequest();
7 |
8 | if (!request?.user) {
9 | throw new RuntimeException(
10 | 'User object is not found in the request. Possibly you forgot to add Auth guard',
11 | );
12 | }
13 |
14 | return request.user;
15 | };
16 |
17 | export const Auth = createParamDecorator(factory);
18 |
--------------------------------------------------------------------------------
/packages/typescript-config/nestjs.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "./base-nestjs.json",
4 | "compilerOptions": {
5 | "allowSyntheticDefaultImports": true,
6 | "emitDecoratorMetadata": true,
7 | "experimentalDecorators": true,
8 | "forceConsistentCasingInFileNames": false,
9 | "incremental": true,
10 | "module": "commonjs",
11 | "moduleResolution": "Node10",
12 | "noFallthroughCasesInSwitch": false,
13 | "noImplicitAny": false,
14 | "removeComments": true,
15 | "skipLibCheck": true,
16 | "sourceMap": true,
17 | "strictNullChecks": false,
18 | "strictBindCallApply": false
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/apps/admin/src/components/Layout/Layout.tsx:
--------------------------------------------------------------------------------
1 | import { Outlet } from 'react-router';
2 | import { Header } from './Header';
3 | import { Sidebar } from './Sidebar';
4 | import { AuthProvider } from '../Auth/AuthProvider';
5 | import { Footer } from './Footer';
6 |
7 | export function Layout() {
8 | return (
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | );
22 | }
23 |
--------------------------------------------------------------------------------
/apps/client/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { fileURLToPath } from 'node:url';
2 | import { defineConfig } from 'vite';
3 |
4 | export default defineConfig({
5 | root: __dirname,
6 | base: '/client',
7 |
8 | server: {
9 | port: 4300,
10 | host: true,
11 | },
12 |
13 | // logLevel: 'warn',
14 | //
15 | // preview: {
16 | // port: 4300,
17 | // host: 'localhost',
18 | // },
19 |
20 | build: {
21 | // outDir: './dist/apps/client',
22 | reportCompressedSize: true,
23 | commonjsOptions: {
24 | transformMixedEsModules: true,
25 | },
26 | },
27 |
28 | resolve: {
29 | alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) },
30 | },
31 | });
32 |
--------------------------------------------------------------------------------
/apps/api/src/database/seed/actions/color.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '@repo/database';
2 | import { defaultColorCommandSeed } from '../commands/color';
3 |
4 | export async function colorActionSeed(prisma: PrismaClient): Promise {
5 | const colorAction = await prisma.action.upsert({
6 | where: { name: 'color' },
7 | update: {},
8 | create: {
9 | name: 'color',
10 | title: 'Color',
11 | description: 'Color',
12 | },
13 | });
14 |
15 | const users = await prisma.user.findMany();
16 |
17 | for (const user of users) {
18 | await defaultColorCommandSeed(prisma, user, colorAction);
19 | }
20 |
21 | console.log({
22 | colorAction,
23 | });
24 | }
25 |
--------------------------------------------------------------------------------
/packages/database/src/seed/actions/color.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '../../client';
2 | import { defaultColorCommandSeed } from '../commands/color';
3 |
4 | export async function colorActionSeed(prisma: PrismaClient): Promise {
5 | const colorAction = await prisma.action.upsert({
6 | where: { name: 'color' },
7 | update: {},
8 | create: {
9 | name: 'color',
10 | title: 'Color',
11 | description: 'Color',
12 | },
13 | });
14 |
15 | const users = await prisma.user.findMany();
16 |
17 | for (const user of users) {
18 | await defaultColorCommandSeed(prisma, user, colorAction);
19 | }
20 |
21 | console.log({
22 | colorAction,
23 | });
24 | }
25 |
--------------------------------------------------------------------------------
/apps/api/src/database/seed/actions/sprite.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '@repo/database';
2 | import { defaultSpriteCommandSeed } from '../commands/sprite';
3 |
4 | export async function spriteActionSeed(prisma: PrismaClient): Promise {
5 | const spriteAction = await prisma.action.upsert({
6 | where: { name: 'sprite' },
7 | update: {},
8 | create: {
9 | name: 'sprite',
10 | title: 'Sprite',
11 | description: 'Sprite',
12 | },
13 | });
14 |
15 | const users = await prisma.user.findMany();
16 |
17 | for (const user of users) {
18 | await defaultSpriteCommandSeed(prisma, user, spriteAction);
19 | }
20 |
21 | console.log({
22 | spriteAction,
23 | });
24 | }
25 |
--------------------------------------------------------------------------------
/packages/database/src/seed/actions/sprite.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '../../client';
2 | import { defaultSpriteCommandSeed } from '../commands/sprite';
3 |
4 | export async function spriteActionSeed(prisma: PrismaClient): Promise {
5 | const spriteAction = await prisma.action.upsert({
6 | where: { name: 'sprite' },
7 | update: {},
8 | create: {
9 | name: 'sprite',
10 | title: 'Sprite',
11 | description: 'Sprite',
12 | },
13 | });
14 |
15 | const users = await prisma.user.findMany();
16 |
17 | for (const user of users) {
18 | await defaultSpriteCommandSeed(prisma, user, spriteAction);
19 | }
20 |
21 | console.log({
22 | spriteAction,
23 | });
24 | }
25 |
--------------------------------------------------------------------------------
/packages/types/src/schema/chatter.ts:
--------------------------------------------------------------------------------
1 | import { z } from 'zod';
2 |
3 | const id = z.number().int().min(1);
4 |
5 | const chatterId = z.string().min(1).max(255);
6 |
7 | const sprite = z.string().min(1).max(255);
8 |
9 | export const updateChatterDtoSchema = z
10 | .object({
11 | id,
12 | chatterId: chatterId,
13 | sprite: sprite,
14 | })
15 | .strict();
16 |
17 | export const createChatterDtoSchema = z
18 | .object({
19 | chatterId: chatterId,
20 | sprite: sprite,
21 | })
22 | .strict();
23 |
24 | export const createChatterFormSchema = z.object({
25 | chatterId: chatterId,
26 | sprite: sprite,
27 | });
28 |
29 | export type CreateChatterForm = z.infer;
30 |
--------------------------------------------------------------------------------
/apps/api/src/database/seed/skins/index.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '@repo/database';
2 | import { defaultUserSkinCollection, skinCollectionSeed } from './collection';
3 | import { skins } from './dudes';
4 | import { defaultUserSkins, skinSeed } from './skin';
5 |
6 | export async function dudesSkinCollectionSeed(
7 | prisma: PrismaClient,
8 | ): Promise {
9 | const collection = await skinCollectionSeed(prisma, 'dudes');
10 |
11 | for (const name of skins) {
12 | skinSeed(prisma, name, collection);
13 | }
14 |
15 | const users = await prisma.user.findMany();
16 |
17 | for (const user of users) {
18 | await defaultUserSkinCollection(prisma, user.id);
19 | await defaultUserSkins(prisma, user.id);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/packages/database/src/seed/commands/index.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient, User } from '../../client';
2 | import { defaultColorCommandSeed } from './color';
3 | import { defaultDashCommandSeed } from './dash';
4 | import { defaultGrowCommandSeed } from './grow';
5 | import { defaultJumpCommandSeed } from './jump';
6 | import { defaultSpriteCommandSeed } from './sprite';
7 |
8 | export const defaultCommandsSeed = async (
9 | prisma: PrismaClient,
10 | user: User
11 | ): Promise => {
12 | await defaultJumpCommandSeed(prisma, user);
13 | await defaultColorCommandSeed(prisma, user);
14 | await defaultGrowCommandSeed(prisma, user);
15 | await defaultDashCommandSeed(prisma, user);
16 | await defaultSpriteCommandSeed(prisma, user);
17 | };
18 |
--------------------------------------------------------------------------------
/packages/database/src/seed/skins/index.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '../../client';
2 | import { defaultUserSkinCollection, skinCollectionSeed } from './collection';
3 | import { skins } from './dudes';
4 | import { defaultUserSkins, skinSeed } from './skin';
5 |
6 | export async function dudesSkinCollectionSeed(
7 | prisma: PrismaClient,
8 | ): Promise {
9 | const collection = await skinCollectionSeed(prisma, 'dudes');
10 |
11 | for (const name of skins) {
12 | skinSeed(prisma, name, collection);
13 | }
14 |
15 | const users = await prisma.user.findMany();
16 |
17 | for (const user of users) {
18 | await defaultUserSkinCollection(prisma, user.id);
19 | await defaultUserSkins(prisma, user.id);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/apps/api/src/database/seed/commands/index.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient, User } from '@repo/database';
2 | import { defaultJumpCommandSeed } from './jump';
3 | import { defaultColorCommandSeed } from './color';
4 | import { defaultGrowCommandSeed } from './grow';
5 | import { defaultDashCommandSeed } from './dash';
6 | import { defaultSpriteCommandSeed } from './sprite';
7 |
8 | export const defaultCommandsSeed = async (
9 | prisma: PrismaClient,
10 | user: User,
11 | ): Promise => {
12 | await defaultJumpCommandSeed(prisma, user);
13 | await defaultColorCommandSeed(prisma, user);
14 | await defaultGrowCommandSeed(prisma, user);
15 | await defaultDashCommandSeed(prisma, user);
16 | await defaultSpriteCommandSeed(prisma, user);
17 | };
18 |
--------------------------------------------------------------------------------
/apps/api/src/admin/controllers/user.controller.ts:
--------------------------------------------------------------------------------
1 | import { Auth } from '@/auth/decorators';
2 | import { AuthGuard } from '@/auth/guards';
3 | import { AuthUserProps } from '@/auth/services/auth.service';
4 | import { ConfigService } from '@/config/config.service';
5 | import { Controller, Get, UseGuards } from '@nestjs/common';
6 | import { UserEntity } from '@repo/types';
7 |
8 | @Controller('/user')
9 | export class UserController {
10 | public constructor(private readonly configService: ConfigService) {}
11 |
12 | @Get('/')
13 | @UseGuards(AuthGuard)
14 | public getUser(@Auth() user: AuthUserProps): UserEntity {
15 | return {
16 | ...user,
17 | previewUrl: `${this.configService.clientUrl}/${user.guid}`,
18 | };
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/apps/admin/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Admin / Evotars
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/apps/website/src/lib/i18n/index.ts:
--------------------------------------------------------------------------------
1 | import i18next from './i18next';
2 | import { headerName } from './settings';
3 | import { headers } from 'next/headers';
4 |
5 | export async function getT(ns?: string, options?: { keyPrefix: string }) {
6 | const headerList = await headers();
7 | const lng = headerList.get(headerName);
8 |
9 | if (lng && i18next.resolvedLanguage !== lng) {
10 | await i18next.changeLanguage(lng);
11 | }
12 |
13 | if (ns && !i18next.hasLoadedNamespace(ns)) {
14 | await i18next.loadNamespaces(ns);
15 | }
16 |
17 | return {
18 | t: i18next.getFixedT(
19 | lng ?? i18next.resolvedLanguage ?? '',
20 | Array.isArray(ns) ? ns[0] : ns,
21 | options?.keyPrefix,
22 | ),
23 | i18n: i18next,
24 | };
25 | }
26 |
--------------------------------------------------------------------------------
/packages/database/src/seed/actions/dash.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '../../client';
2 | import { defaultDashCommandSeed } from '../commands/dash';
3 |
4 | export async function dashActionSeed(prisma: PrismaClient): Promise {
5 | const dashAction = await prisma.action.upsert({
6 | where: { name: 'dash' },
7 | update: {},
8 | create: {
9 | name: 'dash',
10 | title: 'Dash',
11 | description: 'Dash',
12 | },
13 | });
14 |
15 | // Create non existing command based on actions for each user
16 |
17 | const users = await prisma.user.findMany();
18 |
19 | for (const user of users) {
20 | await defaultDashCommandSeed(prisma, user, dashAction);
21 | }
22 |
23 | console.log({
24 | dashAction,
25 | });
26 | }
27 |
--------------------------------------------------------------------------------
/packages/database/src/seed/actions/grow.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '../../client';
2 | import { defaultGrowCommandSeed } from '../commands/grow';
3 |
4 | export async function growActionSeed(prisma: PrismaClient): Promise {
5 | const growAction = await prisma.action.upsert({
6 | where: { name: 'grow' },
7 | update: {},
8 | create: {
9 | name: 'grow',
10 | title: 'Grow',
11 | description: 'Grow',
12 | },
13 | });
14 |
15 | // Create non existing command based on actions for each user
16 |
17 | const users = await prisma.user.findMany();
18 |
19 | for (const user of users) {
20 | await defaultGrowCommandSeed(prisma, user, growAction);
21 | }
22 |
23 | console.log({
24 | growAction,
25 | });
26 | }
27 |
--------------------------------------------------------------------------------
/packages/database/src/seed/actions/jump.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '../../client';
2 | import { defaultJumpCommandSeed } from '../commands/jump';
3 |
4 | export async function jumpActionSeed(prisma: PrismaClient): Promise {
5 | const jumpAction = await prisma.action.upsert({
6 | where: { name: 'jump' },
7 | update: {},
8 | create: {
9 | name: 'jump',
10 | title: 'Jump',
11 | description: 'Jump',
12 | },
13 | });
14 |
15 | // Create non existing command based on actions for each user
16 |
17 | const users = await prisma.user.findMany();
18 |
19 | for (const user of users) {
20 | await defaultJumpCommandSeed(prisma, user, jumpAction);
21 | }
22 |
23 | console.log({
24 | jumpAction,
25 | });
26 | }
27 |
--------------------------------------------------------------------------------
/apps/api/src/admin/filters/twitch-http-exception.filter.ts:
--------------------------------------------------------------------------------
1 | import {
2 | ArgumentsHost,
3 | Catch,
4 | ExceptionFilter,
5 | HttpException,
6 | } from '@nestjs/common';
7 | import { Response } from 'express';
8 | import { TwitchHttpException } from '../exceptions/twitch-http.exception';
9 |
10 | @Catch(TwitchHttpException)
11 | export class TwitchHttpExceptionFilter implements ExceptionFilter {
12 | catch(exception: HttpException, host: ArgumentsHost) {
13 | const ctx = host.switchToHttp();
14 | const response = ctx.getResponse();
15 | const status = exception.getStatus();
16 |
17 | response.status(status).json({
18 | message: exception.message,
19 | statusCode: status,
20 | type: 'twitch',
21 | });
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/apps/api/src/database/seed/actions/dash.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '@repo/database';
2 | import { defaultDashCommandSeed } from '../commands/dash';
3 |
4 | export async function dashActionSeed(prisma: PrismaClient): Promise {
5 | const dashAction = await prisma.action.upsert({
6 | where: { name: 'dash' },
7 | update: {},
8 | create: {
9 | name: 'dash',
10 | title: 'Dash',
11 | description: 'Dash',
12 | },
13 | });
14 |
15 | // Create non existing command based on actions for each user
16 |
17 | const users = await prisma.user.findMany();
18 |
19 | for (const user of users) {
20 | await defaultDashCommandSeed(prisma, user, dashAction);
21 | }
22 |
23 | console.log({
24 | dashAction,
25 | });
26 | }
27 |
--------------------------------------------------------------------------------
/apps/api/src/database/seed/actions/grow.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '@repo/database';
2 | import { defaultGrowCommandSeed } from '../commands/grow';
3 |
4 | export async function growActionSeed(prisma: PrismaClient): Promise {
5 | const growAction = await prisma.action.upsert({
6 | where: { name: 'grow' },
7 | update: {},
8 | create: {
9 | name: 'grow',
10 | title: 'Grow',
11 | description: 'Grow',
12 | },
13 | });
14 |
15 | // Create non existing command based on actions for each user
16 |
17 | const users = await prisma.user.findMany();
18 |
19 | for (const user of users) {
20 | await defaultGrowCommandSeed(prisma, user, growAction);
21 | }
22 |
23 | console.log({
24 | growAction,
25 | });
26 | }
27 |
--------------------------------------------------------------------------------
/apps/api/src/database/seed/actions/jump.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '@repo/database';
2 | import { defaultJumpCommandSeed } from '../commands/jump';
3 |
4 | export async function jumpActionSeed(prisma: PrismaClient): Promise {
5 | const jumpAction = await prisma.action.upsert({
6 | where: { name: 'jump' },
7 | update: {},
8 | create: {
9 | name: 'jump',
10 | title: 'Jump',
11 | description: 'Jump',
12 | },
13 | });
14 |
15 | // Create non existing command based on actions for each user
16 |
17 | const users = await prisma.user.findMany();
18 |
19 | for (const user of users) {
20 | await defaultJumpCommandSeed(prisma, user, jumpAction);
21 | }
22 |
23 | console.log({
24 | jumpAction,
25 | });
26 | }
27 |
--------------------------------------------------------------------------------
/apps/api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "CommonJS",
4 | "declaration": true,
5 | "removeComments": true,
6 | "emitDecoratorMetadata": true,
7 | "experimentalDecorators": true,
8 | "allowSyntheticDefaultImports": true,
9 | "target": "ES2021",
10 | "sourceMap": true,
11 | "outDir": "./dist",
12 | "baseUrl": "./",
13 | "incremental": true,
14 | "skipLibCheck": true,
15 | "strictNullChecks": true,
16 | "forceConsistentCasingInFileNames": true,
17 | "noImplicitAny": false,
18 | "strictBindCallApply": false,
19 | "noFallthroughCasesInSwitch": false,
20 | "esModuleInterop": true,
21 | "paths": {
22 | "@/*": [
23 | "./src/*"
24 | ]
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/apps/website/src/app/terms/layout.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from '@/utils';
2 |
3 | export default function MdxLayout({ children }: { children: React.ReactNode }) {
4 | return (
5 |
24 | {children}
25 |
26 | );
27 | }
28 |
--------------------------------------------------------------------------------
/apps/website/src/app/privacy/layout.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from '@/utils';
2 |
3 | export default function MdxLayout({ children }: { children: React.ReactNode }) {
4 | return (
5 |
24 | {children}
25 |
26 | );
27 | }
28 |
--------------------------------------------------------------------------------
/packages/types/src/schema/settings.ts:
--------------------------------------------------------------------------------
1 | import { z } from 'zod';
2 | import { UpdateSettingsDto } from '../dto/settings';
3 |
4 | export const updateSettingsDtoSchema = z.object({
5 | showAnonymousEvotars: z.boolean().default(false).optional(),
6 | fallingEvotars: z.boolean().default(true).optional(),
7 | fallingRaiders: z.boolean().default(false).optional(),
8 | hiddenUsers: z.string().default('').optional(),
9 | maxEvotars: z.number().max(1000).positive().default(100).optional(),
10 | });
11 |
12 | export const defaultSettingsValues: UpdateSettingsDto = {
13 | showAnonymousEvotars: false,
14 | fallingEvotars: true,
15 | fallingRaiders: false,
16 | hiddenUsers: '',
17 | maxEvotars: 100,
18 | };
19 |
20 | export type UpdateSettingsForm = UpdateSettingsDto;
21 |
--------------------------------------------------------------------------------
/apps/admin/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite';
2 | import react from '@vitejs/plugin-react';
3 | import { fileURLToPath } from 'node:url';
4 | import tailwindcss from '@tailwindcss/vite';
5 |
6 | export default defineConfig({
7 | base: '/admin',
8 | root: __dirname,
9 |
10 | server: {
11 | proxy: {
12 | '/api': {
13 | target: 'http://localhost:3000',
14 | changeOrigin: true,
15 | },
16 | },
17 | port: 4200,
18 | host: true,
19 | },
20 |
21 | // logLevel: 'warn',
22 |
23 | // preview: {
24 | // port: 4200,
25 | // host: 'localhost',
26 | // },
27 |
28 | plugins: [react(), tailwindcss()],
29 | resolve: {
30 | alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) },
31 | },
32 | });
33 |
--------------------------------------------------------------------------------
/packages/database/src/seed/actions/index.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '../../client';
2 | import { addJumpHitsActionSeed } from './add_jump_hits';
3 | import { colorActionSeed } from './color';
4 | import { dashActionSeed } from './dash';
5 | import { growActionSeed } from './grow';
6 | import { jumpActionSeed } from './jump';
7 | import { resurrectActionSeed } from './resurrect';
8 | import { spriteActionSeed } from './sprite';
9 |
10 | export async function actionSeed(prisma: PrismaClient): Promise {
11 | await jumpActionSeed(prisma);
12 | await colorActionSeed(prisma);
13 | await growActionSeed(prisma);
14 | await dashActionSeed(prisma);
15 | await spriteActionSeed(prisma);
16 | await addJumpHitsActionSeed(prisma);
17 | await resurrectActionSeed(prisma);
18 | }
19 |
--------------------------------------------------------------------------------
/apps/api/src/database/seed/actions/index.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '@repo/database';
2 | import { addJumpHitsActionSeed } from './add_jump_hits';
3 | import { colorActionSeed } from './color';
4 | import { dashActionSeed } from './dash';
5 | import { growActionSeed } from './grow';
6 | import { jumpActionSeed } from './jump';
7 | import { resurrectActionSeed } from './resurrect';
8 | import { spriteActionSeed } from './sprite';
9 |
10 | export async function actionSeed(prisma: PrismaClient): Promise {
11 | await jumpActionSeed(prisma);
12 | await colorActionSeed(prisma);
13 | await growActionSeed(prisma);
14 | await dashActionSeed(prisma);
15 | await spriteActionSeed(prisma);
16 | await addJumpHitsActionSeed(prisma);
17 | await resurrectActionSeed(prisma);
18 | }
19 |
--------------------------------------------------------------------------------
/apps/api/src/database/seed/seed.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '@repo/database';
2 | import { TWITCH_PLATFORM_ID } from '../../constants';
3 | import { actionSeed } from './actions';
4 | import { dudesSkinCollectionSeed } from './skins';
5 |
6 | const prisma = new PrismaClient();
7 |
8 | async function main(): Promise {
9 | await actionSeed(prisma);
10 | await dudesSkinCollectionSeed(prisma);
11 |
12 | await prisma.platform.upsert({
13 | where: { id: TWITCH_PLATFORM_ID },
14 | update: {},
15 | create: {
16 | name: 'twitch',
17 | },
18 | });
19 | }
20 |
21 | main()
22 | .then(async () => {
23 | await prisma.$disconnect();
24 | })
25 | .catch(async (e) => {
26 | console.error(e);
27 | await prisma.$disconnect();
28 | process.exit(1);
29 | });
30 |
--------------------------------------------------------------------------------
/apps/website/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2017",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "noEmit": true,
9 | "esModuleInterop": true,
10 | "module": "esnext",
11 | "moduleResolution": "bundler",
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "jsx": "preserve",
15 | "incremental": true,
16 | "plugins": [
17 | {
18 | "name": "next"
19 | }
20 | ],
21 | "paths": {
22 | "@/*": ["./src/*"],
23 | "@repo/ui/*": [
24 | "../../packages/ui/src/*"
25 | ]
26 | }
27 | },
28 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
29 | "exclude": ["node_modules"]
30 | }
31 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See http://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # compiled output
4 | dist
5 | build
6 | tmp
7 | /out-tsc
8 |
9 | # dependencies
10 | node_modules
11 |
12 | # IDEs and editors
13 | /.idea
14 | .project
15 | .classpath
16 | .c9/
17 | *.launch
18 | .settings/
19 | *.sublime-workspace
20 |
21 | # IDE - VSCode
22 | .vscode/*
23 | !.vscode/settings.json
24 | !.vscode/tasks.json
25 | !.vscode/launch.json
26 | !.vscode/extensions.json
27 |
28 | # misc
29 | /.sass-cache
30 | /connect.lock
31 | /coverage
32 | /libpeerconnection.log
33 | npm-debug.log
34 | yarn-error.log
35 | testem.log
36 | /typings
37 |
38 | # System Files
39 | .DS_Store
40 | Thumbs.db
41 |
42 | # Env files
43 | .env
44 | .env.local
45 |
46 | vite.config.*.timestamp*
47 | vitest.config.*.timestamp*
48 |
49 | .turbo
50 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/label.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 | import * as LabelPrimitive from "@radix-ui/react-label"
3 | import { cva, type VariantProps } from "class-variance-authority"
4 |
5 | import { cn } from "@/lib/utils"
6 |
7 | const labelVariants = cva(
8 | "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
9 | )
10 |
11 | const Label = React.forwardRef<
12 | React.ElementRef,
13 | React.ComponentPropsWithoutRef &
14 | VariantProps
15 | >(({ className, ...props }, ref) => (
16 |
21 | ))
22 | Label.displayName = LabelPrimitive.Root.displayName
23 |
24 | export { Label }
25 |
--------------------------------------------------------------------------------
/packages/types/src/schema/command.ts:
--------------------------------------------------------------------------------
1 | import { z } from 'zod';
2 |
3 | const id = z.number().int().min(1);
4 |
5 | const actionId = z.number().int().min(0);
6 |
7 | const text = z.string().min(1).max(255);
8 |
9 | const cooldown = z.number().int().min(0);
10 |
11 | const isActive = z.boolean().optional();
12 |
13 | const data = z.any();
14 |
15 | export const updateCommandDtoSchema = z.object({
16 | id,
17 | isActive,
18 | text: text.optional(),
19 | cooldown: cooldown.optional(),
20 | data: data.optional(),
21 | }).strict();
22 |
23 | export const createCommandDtoSchema = z.object({
24 | actionId,
25 | isActive,
26 | text,
27 | cooldown,
28 | data,
29 | }).strict();
30 |
31 | export const updateCommandFormSchema = z.object({
32 | text,
33 | cooldown,
34 | });
35 |
36 | export type UpdateCommandForm = z.infer;
37 |
--------------------------------------------------------------------------------
/apps/admin/src/components/Layout/Footer.tsx:
--------------------------------------------------------------------------------
1 | export function Footer() {
2 | return (
3 |
22 | );
23 | }
24 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/textarea.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | export type TextareaProps = React.TextareaHTMLAttributes
6 |
7 | const Textarea = React.forwardRef(
8 | ({ className, ...props }, ref) => {
9 | return (
10 |
18 | )
19 | }
20 | )
21 | Textarea.displayName = "Textarea"
22 |
23 | export { Textarea }
24 |
--------------------------------------------------------------------------------
/apps/admin/src/queries/user-skins.ts:
--------------------------------------------------------------------------------
1 | import { createQueryKeys } from '@lukemorales/query-key-factory';
2 | import { api } from '../api/api';
3 | import { useApiQuery } from '../api/use-api-query';
4 |
5 | export const userSkinCollectionsKeys = createQueryKeys('userSkinCollections', {
6 | list: {
7 | queryKey: null,
8 | queryFn: api.getUserSkinCollections,
9 | },
10 | });
11 |
12 | export const useUserSkinCollectionsQuery = () =>
13 | useApiQuery({
14 | ...userSkinCollectionsKeys.list,
15 | });
16 |
17 | export const userSkinsKeys = createQueryKeys('userSkins', {
18 | list: (filters: { collectionId: number }) => ({
19 | queryKey: [{ filters }],
20 | queryFn: () => api.getUserSkins({ filters }),
21 | }),
22 | });
23 |
24 | export const useUserSkinsQuery = (filters: { collectionId: number }) =>
25 | useApiQuery({
26 | ...userSkinsKeys.list(filters),
27 | });
28 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/separator.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 | import * as SeparatorPrimitive from "@radix-ui/react-separator"
3 |
4 | import { cn } from "@/lib/utils"
5 |
6 | const Separator = React.forwardRef<
7 | React.ElementRef,
8 | React.ComponentPropsWithoutRef
9 | >(
10 | (
11 | { className, orientation = "horizontal", decorative = true, ...props },
12 | ref
13 | ) => (
14 |
25 | )
26 | )
27 | Separator.displayName = SeparatorPrimitive.Root.displayName
28 |
29 | export { Separator }
30 |
--------------------------------------------------------------------------------
/packages/types/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@repo/types",
3 | "private": true,
4 | "main": "./dist/index.js",
5 | "module": "./dist/index.mjs",
6 | "types": "./dist/index.d.ts",
7 | "scripts": {
8 | "dev": "tsup src/index.ts --format cjs,esm --dts --watch",
9 | "prebuild": "tsup src/index.ts --format cjs,esm --dts"
10 | },
11 | "exports": {
12 | "import": {
13 | "types": "./dist/index.d.mts",
14 | "import": "./dist/index.mjs"
15 | },
16 | "require": {
17 | "types": "./dist/index.d.ts",
18 | "require": "./dist/index.js"
19 | }
20 | },
21 | "dependencies": {
22 | "@repo/database": "workspace:*",
23 | "@repo/eslint-config": "workspace:*",
24 | "@repo/typescript-config": "workspace:*",
25 | "zod": "3.24.4"
26 | },
27 | "devDependencies": {
28 | "eslint": "9.26.0",
29 | "tsup": "8.0.2",
30 | "typescript": "5.8.3"
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/apps/api/src/admin/services/sprite.service.ts:
--------------------------------------------------------------------------------
1 | import { PrismaService } from '@/database/prisma.service';
2 | import { Injectable } from '@nestjs/common';
3 |
4 | @Injectable()
5 | export class SpriteService {
6 | constructor(private readonly prismaService: PrismaService) {}
7 |
8 | public async isSpriteAvailable(
9 | userId: number,
10 | spriteName: string,
11 | ): Promise {
12 | const count = await this.prismaService.skin.count({
13 | where: {
14 | name: spriteName,
15 | collection: {
16 | userSkinCollection: {
17 | some: {
18 | isActive: true,
19 | userId,
20 | },
21 | },
22 | },
23 | userSkin: {
24 | some: {
25 | isActive: true,
26 | userId,
27 | },
28 | },
29 | },
30 | });
31 |
32 | return count > 0;
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/packages/database/src/client.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '../generated/client';
2 |
3 | // const globalForPrisma = global as unknown as { prisma: PrismaClient };
4 | //
5 | // export const prisma =
6 | // globalForPrisma.prisma || new PrismaClient();
7 | //
8 | // if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
9 |
10 | export const prisma = new PrismaClient();
11 |
12 | declare global {
13 | namespace PrismaJson {
14 | type SettingsData = {
15 | showAnonymousEvotars?: boolean;
16 | fallingEvotars?: boolean;
17 | fallingRaiders?: boolean;
18 | hiddenUsers?: string;
19 | maxEvotars?: number;
20 | };
21 |
22 | type ActionData = Record;
23 |
24 | type ActionableData = {
25 | arguments: string[];
26 | action: ActionData;
27 | };
28 | }
29 | }
30 |
31 | export * from '../generated/client';
32 |
--------------------------------------------------------------------------------
/apps/api/src/admin/controllers/session.controller.ts:
--------------------------------------------------------------------------------
1 | import { AdminGuard } from '@/auth/guards/admin.guard';
2 | import { Controller, Get, UseGuards } from '@nestjs/common';
3 | import { ClientToServerEvents, ServerToClientsEvents } from '@repo/types';
4 | import { Socket } from 'socket.io';
5 | import { SocketService } from '../services';
6 |
7 | @Controller('/session')
8 | export class SessionController {
9 | public constructor(
10 | private readonly socketService: SocketService<
11 | Socket
12 | >,
13 | ) {}
14 |
15 | @Get()
16 | @UseGuards(AdminGuard)
17 | public getSessions(): unknown {
18 | const entries = this.socketService.getRooms().entries();
19 | return Array.from(entries).map((entry) => {
20 | return {
21 | id: entry[0],
22 | clients: entry[1].clients.map((client) => client.id),
23 | };
24 | });
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/input.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | export type InputProps = React.InputHTMLAttributes
6 |
7 | const Input = React.forwardRef(
8 | ({ className, type, ...props }, ref) => {
9 | return (
10 |
19 | )
20 | }
21 | )
22 | Input.displayName = "Input"
23 |
24 | export { Input }
25 |
--------------------------------------------------------------------------------
/apps/api/src/auth/auth.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { TwitchAuthGuard } from '@/auth/guards/twitch-auth.guard';
3 | import { AuthController } from '@/auth/controllers/auth.controller';
4 | import { AuthSerializer } from './serializers';
5 | import { AuthService } from '@/auth/services';
6 | import { HttpModule } from '@nestjs/axios';
7 | import { UserRepository } from '@/auth/repositories';
8 | import { TwitchStrategy } from '@/auth/strategies';
9 | import { SeedService } from './services/seed.service';
10 | import { UserTokenRepository } from './repositories/user-token.repository';
11 |
12 | @Module({
13 | imports: [HttpModule],
14 | controllers: [AuthController],
15 | providers: [
16 | AuthService,
17 | TwitchStrategy,
18 | TwitchAuthGuard,
19 | AuthSerializer,
20 | UserRepository,
21 | UserTokenRepository,
22 | SeedService,
23 | ],
24 | })
25 | export class AuthModule {}
26 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/toaster.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Toast,
3 | ToastClose,
4 | ToastDescription,
5 | ToastProvider,
6 | ToastTitle,
7 | ToastViewport,
8 | } from "@/components/ui/toast"
9 | import { useToast } from "@/components/ui/use-toast"
10 |
11 | export function Toaster() {
12 | const { toasts } = useToast()
13 |
14 | return (
15 |
16 | {toasts.map(function ({ id, title, description, action, ...props }) {
17 | return (
18 |
19 |
20 | {title && {title}}
21 | {description && (
22 | {description}
23 | )}
24 |
25 | {action}
26 |
27 |
28 | )
29 | })}
30 |
31 |
32 | )
33 | }
34 |
--------------------------------------------------------------------------------