Instead of requiring manual tags on each repository, the portfolio infers technologies automatically using a rule set that maps GitHub-exposed signals (languages, topics, name, description) to framework and tool names. The result is stored inDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/santiagonieto09/portafolio/llms.txt
Use this file to discover all available pages before exploring further.
repo.technologies and used both by the filter dropdowns and the technology badges displayed on each repository card.
How it works
Source:src/domain/github/technology-detection.ts
-
Build a haystack — Concatenates
name(with hyphens and underscores replaced by spaces),description, thetopicsarray joined by spaces, andhomepageinto a single lowercase string. This is the text that keyword rules search through. -
Seed with raw languages — The
foundset is initialised with all entries frominput.languages. This ensures the detected technologies array always includes the primary languages GitHub detected. -
Evaluate rules — Iterates over all 25
TechRuleentries. A rule matches when either condition is true (short-circuit OR):byLanguage— at least one of the rule’slanguages[]entries is present ininput.languagesbyKeyword— at least one of the rule’skeywords[]entries appears as a substring in the lowercase haystack
technames are added to thefoundset (deduplication is automatic viaSet). -
Return — The
Setis spread into a plain array and returned.
Rule table
All 25 rules defined in theRULES array:
| Technology | Trigger languages | Trigger keywords |
|---|---|---|
| Spring Boot | — | spring boot, springboot, spring-boot, spring |
| Spring Security | — | spring security, spring-security, jwt |
| Spring Cloud | — | eureka, spring cloud, gateway, microservi |
| JPA / Hibernate | — | jpa, hibernate |
| Maven | Java | — |
| Angular | — | angular |
| React | — | react, next.js, nextjs |
| Flutter | Dart | flutter |
| Django | — | django |
| Jinja | Jinja | — |
| Symfony | — | symfony |
| Laravel | — | laravel, blade |
| FastAPI | — | fastapi |
| Node.js | — | node, express, nest |
| Docker | Dockerfile | docker, contenedor |
| PostgreSQL | — | postgres, postgresql |
| MySQL | — | mysql, mariadb |
| MongoDB | — | mongo |
| REST API | — | api rest, rest api, api-rest, restful |
| GraphQL | — | graphql |
| IA / RAG | — | rag, llm, ia (with spaces), asistente de ia, openai, embedding |
| Tailwind CSS | — | tailwind |
| Vercel | — | vercel |
| RPC / RMI | — | rpc, rmi, distribuid |
| Android | — | android |
languages list and a keywords list (e.g. Flutter, Docker) match on either condition independently — a Dart repository without the word “flutter” anywhere will still be tagged as Flutter.
frameworksOnly helper
detectTechnologies() seeds the result with raw language names (e.g. "TypeScript", "Java"). frameworksOnly() filters those out so that RepositoryCard only shows framework and tool badges — language information is already shown separately via the colored language dot.
The collectTechnologies() function in repository-query.ts applies the same logic when building the framework dropdown for RepositoryFilters:
Adding new rules
The module follows the open/closed principle: to add detection for a new technology, append aTechRule object to the RULES array in src/domain/github/technology-detection.ts. No other code changes are required.
languages, keywords, or both. At least one must be provided — a rule with neither condition would match every repository.