An immersive personal portfolio built with Astro and Three.js. The same projects, experiences, and ideas are reinterpreted as a cosmic journey, a navigable archipelago, a living jianghu inn, a linework room, and a detailed studio.
Cosmic World |
![]() Archipelago World |
![]() Jianghu World |
![]() Linework World |
![]() Studio World |
Each World has its own art direction, camera language, interaction model, and Portfolio Binding. Content is not duplicated or rewritten for individual scenes.
Interactive landmarks connect the Worlds. The Runtime prepares the destination, hands over rendering ownership only when it is ready, and rolls back to the source World if loading fails or the journey is cancelled.
Projects, awards, skills, timeline entries, links, and media live in one semantic source of truth. Every World references stable portfolio IDs instead of page order or scene coordinates.
A shared Runtime owns the WebGL renderer, frame scheduling, input routing, quality budgets, World Sessions, and resource cleanup. The experience adapts its pixel ratio, effects, shadows, update rate, and transition mode to the device.
Astro emits a readable portfolio before WebGL starts. The content remains available when JavaScript, WebGL, or a 3D World cannot load.
git clone https://github.com/Qiuner/Qiuner.github.io.git
cd Qiuner.github.io
npm install
npm run devOpen the URL printed by Astro, normally http://localhost:4321.
# Type and Astro diagnostics
npm run check
# Test suite
npm test
# Production build and local preview
npm run build
npm run preview- Site and static output: Astro 7
- 3D runtime: Three.js
WebGLRenderer - Language: TypeScript 6
- World UI: Vue 3 and DOM overlays
- Testing: Vitest + jsdom
- Hosting: GitHub Pages + GitHub Actions
src/content/portfolio.ts— canonical portfolio contentsrc/runtime/— renderer, frame scheduling, lifecycle, Portal journeys, and resourcessrc/worlds/— lazy World Modules and their visual bindingssrc/pages/index.astro— static portfolio host and Runtime mount pointpublic/— locally hosted World and portfolio mediaCONTEXT.zh-CN.md— domain language and architecture invariantsdocs/ARCHITECTURE.zh-CN.md— implemented architecture and evolution plandocs/adr/— accepted architecture decisions
The project separates portfolio facts from their presentation:
Content Kernel → World Binding → World Module
↓
Astro Host ← Shared Runtime → Portal Journey
The Content Kernel is the single source of truth. World Modules are independently loadable interpretations. The Runtime is the sole owner of renderer, browser frame loop, input routing, quality policy, and World Session lifetime.
See the architecture overview and domain context for the complete model.
Pushes to main are built by the deployment workflow
and published as a static site on GitHub Pages. All production media and the
Three.js dependency are owned by this repository; no runtime CDN is required.



