Interactive hero uses a three.js point-wave signal field that responds to pointer and theme changes
portfolio.dev — Astro Portfolio Template
By apoi1
Personal portfolio site of Julián David Ruiz Flórez, built with Astro, using Tailwind CSS, TypeScript, GSAP, Lenis and three.js, supporting English and Spanish bilingualism, light and dark themes, and deployed as a static site on Netlify.
Explore the design
Compare the page layouts and mobile experience. Open any screenshot for a closer look.
Actual screenshot captured by the server browser.
All pages & views 3
Screenshots show visual appearance; interactive behavior may differ.
What stands out
A quick read of the recorded project description.
Scroll choreography is based on GSAP, ScrollTrigger and Lenis, declaratively controlled via attributes such as data-reveal, data-stagger, data-counter and data-magnetic
Full English and Spanish bilingual routing, including hreflang alternate links and language-specific metadata and OG cards
Dark/light theme is implemented through CSS variable overrides, with no build branching, no flash, and persisted user choice
Project content is managed using Astro Content Collections; adding a project only requires creating a new folder with bilingual Markdown and a cover image
Includes a ⌘K command palette, a printable CV page, JSON-LD structured data, a sitemap and semantic HTML
Template Details
portfolio.dev is the personal portfolio of systems engineer Julián David Ruiz Flórez. The README states it is built with Astro, Tailwind CSS, TypeScript, GSAP, Lenis and three.js, supports bilingual English and Spanish routing (/ and /es/), offers dark and light theme switching, and includes scroll animations, a ⌘K command palette and a printable CV page. Project content is managed through Astro Content Collections, with each project corresponding to a folder containing bilingual English and Spanish Markdown entries and a cover image. The build output is static HTML, deployed on Netlify with a custom domain configured. The README does not provide performance data, browser compatibility details or specific production environment limitations.
Is it right for your project?
Use Cases
- Personal portfolio site that needs to showcase project case studies and support multiple languages
- Wanting to manage project entries as content folders, avoiding writing component code for each project
- Needing a statically deployed site that includes SEO metadata, structured data and a sitemap
- Wanting to provide light/dark theme switching, scroll animations and a reduced-motion fallback for the interactive experience
Suitable For
- Developers or designers who need an English-Spanish bilingual personal portfolio
- Projects building static sites with Astro and Tailwind CSS
- Scenarios where project content is added as folders via Content Collections
- Static sites that need to be deployed to Netlify with a custom domain configured
Getting started & customization
Use these recorded setup notes alongside the repository instructions for your chosen version.
- 1
Run npm install to install dependencies, and npm run dev to start the development server (default http://localhost:4321)
- 2
Run npm run build to generate static output to dist/, and npm run check to run astro check type checking
- 3
Run npm run verify to execute post-build content, SEO and link smoke tests
- 4
When adding a project, create index.en.md, index.es.md and a cover image under src/content/projects/<slug>/; after building, it automatically appears in the grid, case pages and the ⌘K palette
- 5
For deployment-related configuration see docs/DEPLOYMENT.md, for the content model see docs/CONTENT-GUIDE.md, and for architecture details see docs/ARCHITECTURE.md
License & source material
Usage conditions & limitations
Free to use · keep license noticeThis entry covers the free version under the MIT license in the public repository; the free scope is the code of that version and does not mean external services or third-party assets are free.
Must comply with when using
- Free use, modification, commercial use and distribution of that version's code are permitted.
- When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
- The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.
Additional costs & items to verify
- Demo images, fonts, icons and other third-party assets must be checked against their respective licenses and cannot be judged solely by the code's MIT license.
- External services such as domains, hosting, databases, payments or AI may incur additional charges.
View Original Text Basis
https://github.com/apoi1/portfolio.dev/blob/main/LICENSEhttps://github.com/apoi1/portfolio.dev/blob/main/README.mdPermission is hereby granted, free of charge
Original License Text
Compiled by DeepSeek based on repository license and README ·2026-10-16. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.
Project checks & description sources
Template Information
- Source platforms
- GitHub
- Documentation and maintenance reference score
- More documented · 80 / 100
- Technologies
- Astro
- Website type
- Portfolio
How this score is calculated
Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.
What to verify for this project
- Repository update recorded
- 2026-10-16
- Screenshot last checked
- 2026-10-16
A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.
The catalog identifies Astro as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.
Use a selection guide →How this description was prepared
AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.
Review declaration: codex-user-requested-batch-review-20261017 · 2026-10-16
Inspect the recorded source material
SHA-256: 25d36f398c2b803327ad630b09fa794b6999938dcd240af51b2c5b2877fabda3
2026-10-16T15:15:07.534Z
Source file / repository# apoi2 · portfolio.dev
**Personal portfolio of Julián David Ruiz Flórez** — systems engineer from Soacha/Bogotá, Colombia, building real-time signal systems and full-stack products. Bilingual (EN/ES), dual-theme (dark/light), motion-first, and still **100% static on Netlify**.

[](https://apoi2.netlify.app)
[](https://astro.build)
[](https://tailwindcss.com)
[](https://www.typescriptlang.org)
[](LICENSE)
**Live → [apoi2.is-a.dev](https://apoi2.is-a.dev)** · [English](https://apoi2.is-a.dev/) · [Español](https://apoi2.is-a.dev/es/) · [CV (print-ready)](https://apoi2.is-a.dev/cv)
## What's inside
| Feature | How |
| --- | --- |
| Interactive hero | three.js point-wave "signal field" — reacts to your pointer and to the theme |
| Scroll choreography | GSAP + ScrollTrigger + Lenis, all declarative (`data-reveal`, `data-stagger`, `data-counter`, `data-magnetic`) |
| Bilingual EN/ES | Full i18n routing (`/` + `/es/`), hreflang alternates, per-locale metadata & OG cards |
| Dark / light theme | CSS-variable token overrides — zero build fork, zero flash, persisted |
| Projects as content | Astro Content Collections — **add a project by adding a folder** |
| ⌘K command palette | Navigate, open cases, copy email, jump to the CV |
| Print-ready CV | `/cv` and `/es/cv` reuse the same verified data as the site |
| SEO | JSON-LD (Person, WebSite, CreativeWork), sitemap with hreflang, OG/Twitter cards, semantic HTML |
| Fast & resilient | Static HTML, `prefers-reduced-motion` fallbacks everywhere, no-JS still readable |
## Quick start
```bash
npm install
npm run dev # http://localhost:4321
npm run build # static output → dist/
npm run check # astro check (types)
npm run verify # post-build content/SEO/link smoke test
```
## Add a project in 3 steps
That's the whole content model — no component code, no config:
```text
src/content/projects/<your-slug>/
├── index.en.md ← English entry (frontmatter + case body)
├── index.es.md ← Spanish entry (same shape, translated)
├── cover.svg ← card/OG cover (16:10 works best)
└── shot-1.webp … ← optional gallery images
```
1. Create the folder, drop a `cover` image (SVG/PNG/WebP).
2. Write `index.en.md` + `index.es.md` — frontmatter + the case-study body.
3. Build. The card appears in the grid, the case page in both languages, and the ⌘K palette picks it up.
```mermaid
flowchart LR
A["📁 new folder<br/>src/content/projects/<slug>/"] --> B["📝 index.en.md + index.es.md"]
B --> C["🖼️ cover + gallery images"]
C --> D[" astro build "]
D --> E["🏠 card on the grid"]
D --> F["📄 /projects/<slug> + /es/projects/<slug>"]
D --> G["⌘K palette entry"]
D --> H["📅 sitemap + hreflang"]
```
Full reference: [docs/CONTENT-GUIDE.md](docs/CONTENT-GUIDE.md).
## Architecture (the short version)
```mermaid
flowchart TB
subgraph SRC[" src "]
C["Content collections<br/>5 projects × 2 locales"]
I["i18n/ui.ts — every UI string<br/>EN + ES, type-checked shapes"]
S["sections/ locale-aware<br/>Hero · About · Experience · Projects · Skills · Contact"]
M["scripts/motion.ts + signal-field.ts<br/>Lenis · GSAP · three.js"]
end
subgraph BUILD[" astro build "]
PG["15 static pages<br/>/ + /es + 10 case pages + 2 CV + 404"]
SEO["JSON-LD · sitemap+hreflang<br/>OG per locale"]
end
subgraph EDGE["Netlify edge"]
DIST["dist/ static files<br/>immutable asset caching"]
end
SRC --> BUILD --> EDGE
EDGE --> W["🌍 apoi2.is-a.dev<br/>(CNAME → apoi2.netlify.app)"]
```
Deep dive: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) · Deployment: [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md).
## Project structure
```text
├── astro.config.mjs # site URL, i18n routing, sitemap
├── netlify.toml # build + security/cache headers
├── scripts/
│ ├── generate-og.mjs # regenerates OG cards + favicon PNGs
│ └── verify-site.mjs # post-build smoke test (npm run verify)
├── src/
│ ├── content.config.ts # projects collection schema
│ ├── content/projects/ # ← THE content (folder per project)
│ ├── i18n/ui.ts # all copy, EN + ES
│ ├── lib/ # site identity, project helpers
│ ├── components/
│ │ ├── ui/ # design-system primitives (incl. toggles)
│ │ ├── sections/ # page sections
│ │ └── … # Nav, Footer, cards, palette, CV
│ ├── layouts/Layout.astro# SEO head, theme boot, VT
│ ├── scripts/ # motion.ts, signal-field.ts
│ └── pages/ # / , /es/ , /projects/[slug] , /cv , 404
└── public/ # favicon suite, OG cards, robots.txt
```
## Docs index
| Doc | What you'll find |
| --- | --- |
| [ARCHITECTURE](docs/ARCHITECTURE.md) | Rendering pipeline, i18n, theming, motion system — with diagrams |
| [CONTENT-GUIDE](docs/CONTENT-GUIDE.md) | Add projects, frontmatter reference, image & i18n rules |
| [DEPLOYMENT](docs/DEPLOYMENT.md) | Netlify, the is-a.dev domain, headers, OG regeneration |
## Credits
Designed & built by **Julián Ruiz — apoi2** with Astro, Tailwind CSS, GSAP, Lenis and three.js. Motion respects `prefers-reduced-motion`. Almost all rights reserved — [MIT licensed](LICENSE).
Explore similar templates
Compare previews and descriptions within the same stack and category.

astrofy
Astrofy is a free and open-source personal portfolio website template built with Astro and TailwindCSS, with built-in blog, CV timeline, project showcase, store, and RSS feed modules.
Astro · Portfolio

astro-nano
Astro Nano is a static, minimalist portfolio and blog template built with Astro, Tailwind, and TypeScript without frontend frameworks. It includes light/dark themes, animated UI, automatic sitemap and RSS feed generation, and Markdown/MDX support with component imports.
Astro · Portfolio

astro-erudite
astro-erudite is an opinionated, unstyled static blog template built with Astro and native CSS, with no UI or CSS framework and minimal dependencies.
Astro · Portfolio

astro-sphere
Astro Sphere is a static, minimalist portfolio and blog theme maintained by markhorn-dev, built mainly with Astro, Tailwind, and TypeScript, with a small amount of SolidJS for stateful components.
Astro · Portfolio

astro-micro
Astro Micro is a framework-free blog and portfolio theme for Astro, forked from Astro Nano. It adds Pagefind search and Giscus comments while retaining type safety, sitemap, RSS, Markdown and MDX support, and TailwindCSS with system, light, and dark themes.
Astro · Portfolio

astro-aria
astro-aria is an Astro-based personal blog and portfolio template maintained by miantiao-me, ported from static-templates/aria.
Astro · Portfolio
