Skip to main content

Documentation 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.

The repository explorer renders all non-fork public repositories with real-time client-side filtering and sorting. Because the full repository list is embedded in the server-rendered page payload, no server round-trips are needed after the initial data load — every search keystroke and filter change is instant.

RepositoryExplorer component

Source: src/components/portfolio/repository-explorer.tsx RepositoryExplorer accepts the complete list of repositories and owns all filter state:
function RepositoryExplorer({ repositories }: { repositories: Repository[] })
State is a single RepositoryQuery object managed with useState, initialised to defaultQuery. A patch helper merges partial updates so individual controls only need to send the fields they change. Three useMemo calls derive everything from the full repositories array:
Derived valueHow it is computed
languagescollectLanguages(repositories) — union of all language keys across repos, alphabetically sorted
technologiescollectTechnologies(repositories) — union of all technology names that are not raw language names, alphabetically sorted
visibleapplyQuery(repositories, query) — the filtered and sorted subset shown in the grid
The grid uses a responsive three-column layout (md:grid-cols-2 xl:grid-cols-3). When no repository matches the current query a polite empty-state message is shown instead.

Filter & sort controls

Source: src/components/portfolio/repository-filters.tsx RepositoryFilters receives the current query, an onChange callback, the available languages and technologies lists, and the live resultCount. It renders a self-contained panel containing all controls: Text search — A search input that matches against repo.name, repo.description, repo.technologies, Object.keys(repo.languages), and repo.topics (case-insensitive substring match via matchesSearch()). Language dropdown — A <Select> populated with the unique, sorted language list from collectLanguages(repositories). Selecting a language keeps only repos that have at least one byte of that language. Selecting the “Lenguaje” placeholder resets the filter to null. Technology (framework) dropdown — A <Select> populated with collectTechnologies(repositories), which excludes raw language names so it only lists frameworks and tools. Selecting a technology keeps only repos where repo.technologies includes that value. Feature toggles — A dropdown menu (DropdownMenu) containing five CheckboxItem toggles. The number of active toggles is shown as a badge on the trigger button:
Toggle keyLabelEffect
onlyWithReleaseTiene releaseKeeps repos where repo.release !== null
onlyWithDocsTiene documentaciónKeeps repos where docsUrlFor(repo.htmlUrl) is non-null
onlyWithSiteTiene sitio webKeeps repos where repo.homepage is non-null
onlyActiveProyecto activoKeeps repos where repo.archived === false
onlyArchivedProyecto archivadoKeeps repos where repo.archived === true
Sort key — Selects which field drives the sort order:
ValueLabelComparator
updatedActualizaciónpushedAt descending
createdCreacióncreatedAt descending
starsEstrellasstars descending
nameNombrename locale-compare descending
Sort direction — Ascending or descending. The direction multiplier flips all comparators, so name ascending becomes A → Z. Result count badge — A live-region (aria-live="polite") paragraph showing the number of matching projects.

RepositoryCard

Source: src/components/portfolio/repository-card.tsx Each repository is rendered as an <article> with a full-height flex column layout. The card contains: Header — Repository name as an <h3> (truncated with CSS), a description paragraph (line-clamp-2 by default), and a “Ver más…” / “Ver menos” toggle button for descriptions longer than 110 characters. An archived/active status chip is positioned in the top-right corner. Technology badges — A <ul> of up to 8 technology name chips drawn from repo.technologies. If a technology name also appears in Object.keys(repo.languages), a colored dot using languageColor(tech) is shown beside it. Metadata grid — Four data items in a <dl> grid:
ItemIconContent
CreatedCalendarPlusformatDate(repo.createdAt)
Last pushedHistoryuseRelativeTime(repo.pushedAt)
StarsStarrepo.stars
Forks & visibilityGitFork{repo.forks} · {repo.visibility}
Release panel — Shown only when repo.release !== null. Displays the release name, tag in a monospace () wrapper, and the formatted publish date. Footer links — A row of action buttons:
ButtonConditionDestination
RepositorioAlwaysrepo.htmlUrl (GitHub)
DocsdocsUrlFor(repo.htmlUrl) !== nullDeepWiki URL for the repo
Ver releaserepo.release !== nullrepo.release.url
Sitio webrepo.homepage !== nullrepo.homepage
docsUrlFor() converts a GitHub repository URL (https://github.com/owner/repo) to its DeepWiki documentation URL (https://deepwiki.com/owner/repo). It returns null for any URL that is not a valid GitHub repository path.

Repository domain type

The Repository interface is defined in src/domain/github/types.ts:
interface Repository {
  id: number;
  name: string;
  description: string | null;
  htmlUrl: string;
  homepage: string | null;
  language: string | null;
  languages: Record<string, number>;
  technologies: string[];
  stars: number;
  forks: number;
  watchers: number;
  openIssues: number;
  archived: boolean;
  visibility: string;
  createdAt: string;
  updatedAt: string;
  pushedAt: string;
  topics: string[];
  hasPages: boolean;
  license: string | null;
  release: ReleaseInfo | null;
}
languages is a Record<string, number> where each key is a language name and the value is the byte count for that language in the repository — the same data returned by GitHub’s per-repo /languages endpoint. technologies is the result of running detectTechnologies() at data-fetch time and is stored alongside the rest of the repository data in the portfolio snapshot.
Forked repositories are always excluded from the portfolio. The GitHub API call uses per_page=100&sort=updated, so the portfolio shows up to 100 public non-fork repos. If an account has more than 100 public non-fork repositories, the oldest ones (by push date) will not appear.

Build docs developers (and LLMs) love