Skip to content

ArthurDanjou/artsite

Repository files navigation

AI Research Intern at CMAP, Ecole Polytechnique. Personal portfolio built with Nuxt 4 and deployed to Cloudflare Workers.

Nuxt.js Vue.js TypeScript TailwindCSS Cloudflare

🌐 Live Β· πŸ› Issues

Tech Stack

  • Framework β€” Nuxt 4 with Cloudflare Workers preset
  • UI β€” Nuxt UI v4 + Tailwind CSS
  • Content β€” Nuxt Content with D1 database
  • Database β€” Cloudflare D1 (SQLite)
  • Cache β€” Cloudflare KV
  • Deployment β€” NuxtHub on Cloudflare
  • Package Manager β€” Bun
  • Validation β€” Zod
  • Composables β€” VueUse
  • Icons β€” Iconify

Getting Started

# Install
bun install

# Dev server
bun run dev

# Build
bun run build

# Lint
bun run lint

# Deploy
bun run deploy

Environment Variables

Copy .env.example to .env and configure:

NUXT_HA_URL=           # Home Assistant instance URL
NUXT_HA_TOKEN=         # Home Assistant long-lived access token
NUXT_DISCORD_USER_ID=  # Discord user ID for activity
NUXT_WAKATIME_*        # WakaTime API keys (optional)

Only NUXT_HA_URL + NUXT_HA_TOKEN are needed for the live status widget. The site works without any env vars.

Project Structure

artsite/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ content/           # MDC components (NowStatus, TalkCard, HoverText…)
β”‚   β”‚   └── home/              # Homepage sections (Skills, Timeline, Live widgets)
β”‚   β”œβ”€β”€ composables/           # useContent()
β”‚   β”œβ”€β”€ pages/                 # File-based routing
β”‚   β”‚   β”œβ”€β”€ index.vue          # Home
β”‚   β”‚   β”œβ”€β”€ projects/          # /projects & /projects/[slug]
β”‚   β”‚   β”œβ”€β”€ talks.vue          # /talks
β”‚   β”‚   β”œβ”€β”€ uses.vue           # /uses
β”‚   β”‚   └── hobbies.vue        # /hobbies
β”‚   └── app.vue
β”œβ”€β”€ content/
β”‚   β”œβ”€β”€ index.md               # Homepage content
β”‚   β”œβ”€β”€ talks.json             # Talks data (upcoming/past)
β”‚   β”œβ”€β”€ uses.md                # Hardware & software setup
β”‚   β”œβ”€β”€ hobbies.md             # Hobbies
β”‚   β”œβ”€β”€ projects/*.md          # Project pages
β”‚   β”œβ”€β”€ experiences/*.md       # Work experience
β”‚   β”œβ”€β”€ education/*.md         # Academic background
β”‚   β”œβ”€β”€ skills.json            # Skills data
β”‚   └── contact.json           # Contact links
β”œβ”€β”€ server/
β”‚   β”œβ”€β”€ api/                   # Content & integration API endpoints
β”‚   β”‚   └── ha/                # Home Assistant proxy (status, media, monitors)
β”‚   └── routes/resumes/        # Static PDF resume endpoints
β”œβ”€β”€ types/                     # TypeScript definitions & navigation config
β”œβ”€β”€ nuxt.config.ts
β”œβ”€β”€ content.config.ts          # Content collections with Zod schemas
β”œβ”€β”€ wrangler.jsonc             # Cloudflare Workers config
└── package.json

Pages

Route Description
/ Home β€” research focus, skills, experience timeline, live telemetry
/projects Project portfolio grouped by type
/projects/[slug] Individual project page
/talks Academic presentations β€” upcoming & past
/uses Hardware, software, and homelab infrastructure
/hobbies Personal interests
/resumes/en English resume (PDF)
/resumes/fr French resume (PDF)

License

MIT Β© Arthur Danjou

About

🌍 My personal website, my portfolio, and my blog. πŸš€ Built and powered by Nuxt Stack (Content, Hub, Studio, UI) & Nitro

Topics

Resources

License

Stars

Watchers

Forks

Contributors