Methodology
This page documents exactly how FolioAtlas collects, validates, deduplicates, classifies and publishes directory data. The pipeline is deterministic: the same upstream README always produces the same index.
Data collection
The canonical source is the README of emmabostian/developer-portfolios (branch master, commit 5072b20). A daily synchronization job fetches the file, parses every entry in the alphabetical sections, and regenerates the index; each change is reviewed as a pull request before it is loaded into the directory database. This site was last synchronized on November 12, 2026. If upstream is unreachable, the last successfully generated index keeps serving — a failed sync never erases good data.
URL validation
Only http:// and https:// links are accepted. Schemes such as javascript:, data: or file: are rejected, as are URLs with embedded credentials, loopback or private-IP hosts, and unparseable values. Normalization is conservative: hostnames are lower-cased, default ports are stripped, a trailing slash is removed, and URL fragments are dropped — path casing and segments are never altered.
Duplicates and names
Two entries are considered the same portfolio only when their fully normalized URLs match. Different paths under one domain (for example two sites on github.io) are different people. When a URL collision occurs, the first upstream occurrence is kept and the collision is reported rather than silently discarded. Identical names with different URLs — different people who share a name — are always kept separately. Each entry gets a deterministic identifier derived from its name and URL, so IDs are stable across builds.
Focus-area classification
The upstream list does not provide structured technology metadata. FolioAtlas therefore classifies entries using only the role label text supplied upstream (the bracketed text after each link). Matching is a documented, deterministic keyword mapping — URLs are never used as evidence, and portfolio websites are never scraped. Entries without supplied role text stay unclassified and remain fully browsable in the general directory. The complete rule set:
- Full Stack(617)
- Mentions full-stack, fullstack or MERN-style role text.
- Frontend(113)
- Mentions front-end / frontend / UI engineering.
- Backend(66)
- Mentions back-end / backend engineering.
- React(62)
- Mentions React in the supplied role text.
- Next.js(33)
- Mentions Next.js / NextJS.
- Vue(8)
- Mentions Vue / Vue.js.
- Angular(3)
- Mentions Angular.
- Node.js(16)
- Mentions Node.js / NodeJS.
- TypeScript(25)
- Mentions TypeScript.
- JavaScript(2)
- Mentions JavaScript.
- AI / ML(280)
- Mentions AI, ML, machine learning or LLMs.
- Mobile(55)
- Mentions mobile, Android, iOS or app development.
- Flutter(14)
- Mentions Flutter.
- DevOps & Cloud(79)
- Mentions DevOps, SRE, cloud, infrastructure or containers.
- Data(32)
- Mentions data science, engineering or analytics.
- Design(45)
- Mentions UI/UX, product or graphic design.
- Game Dev(7)
- Mentions game development, Unity or Unreal.
- WordPress(6)
- Mentions WordPress or WooCommerce.
- Salesforce(3)
- Mentions Salesforce.
- .NET(15)
- Mentions .NET, dotnet or C#.
- Python(30)
- Mentions Python, Django, Flask or FastAPI.
- PHP / Laravel(15)
- Mentions PHP or Laravel.
- Ruby / Rails(2)
- Mentions Ruby or Rails.
- Go(2)
- Mentions Golang.
- Java(16)
- Mentions Java (word-boundary match; never matches JavaScript).
- Blockchain(11)
- Mentions blockchain, web3, smart contracts or Solidity.
- Security(23)
- Mentions security, cybersecurity or penetration testing.
- Founder(5)
- Mentions founder, co-founder, entrepreneur or CEO.
- Freelance(28)
- Mentions freelancer / freelance work.
- Student(45)
- Mentions student or undergraduate status.
Quality gates
Every synchronization run produces a validation report alongside the index. Entries that cannot be interpreted are quarantined with their line number and reason instead of being silently converted. The pipeline refuses to publish a new index that is empty or has lost more than half of the previous entries — a likely signal that the upstream format changed and the parser needs review. Generated artifacts are written atomically: the new file is validated before it replaces the previous one.
Verified growth history
The Portfolio Growth chart is built exclusively from verified records. When FolioAtlas synchronizes, it records a snapshot of the directory size with the exact upstream commit SHA and timestamp. Historical points are derived by replaying the upstream repository's actual git history — each historical count is the real number of valid entries present in a real, linkable commit. Nothing is interpolated from a single report, and the chart always states the window its history covers. Where provenance cannot be established, history simply starts later — it is never invented.
AI features and their guardrails
Two features use language models, and both are clearly labeled. First, AI search: your plain-language request is converted into a typed search intent (focus areas, keywords, exclusions) that is validated against the canonical technology vocabulary before the database executes the real query. The model can shape the query; it can never invent developer records. Second, AI portfolio summaries: generated once per entry from the entry's supplied role text and focus areas only, validated against a strict schema, stored, and reused. Summaries never claim experience, employment, or project ownership that the source does not support, and every summary is labeled AI-generated. When the AI provider is unavailable, both features fall back to the standard keyword search — the directory keeps working without AI.
Likes, views and the leaderboard
Visitors can like portfolios; FolioAtlas also counts detail-page views and clicks through to each site. Each visitor can like a portfolio once, and a view or visit counts at most once per visitor per day; automated traffic is excluded and per-network daily caps limit ballot stuffing. The leaderboard ranks portfolios by likes in the selected UTC day, ISO week, month or year (or by views), then by the other metric, then by site visits. These numbers describe activity on FolioAtlas only — they are not a rating of anyone's work.
Website previews and images
FolioAtlas uses no screenshot or thumbnail service and never fetches portfolio websites on the server. The in-page preview embeds the portfolio website itself, only when you open it. If a website refuses embedding, the UI says so explicitly with an open-in-new-tab action; FolioAtlas never bypasses a site's own security headers. Profile pictures are shown only for entries hosted on github.io, using the public GitHub avatar of the inferred account; every other entry shows a neutral placeholder.
Corrections and removals
Because the upstream repository is the canonical source, edits — including removing your own portfolio — happen there via a normal pull request. Once merged upstream, the change propagates here automatically at the next synchronization. Nothing needs to be done on this site.