Just my portfolio website and smth more) (pwd by RUST & VUE & ASTRO)
1
stars
228
commits
Vue
primary language
Sep 11, 2026
updated
Personal site of Vadim Khristenko — a.k.a. VAI_PROG. Developer · bot-maker · open-source activist. Systems code, Rust, and interfaces that don't look like everyone else's.
A trilingual (🇬🇧 / 🇷🇺 / 🇨🇳) single-page portfolio with 8 fully distinct themes — each one a genuine experience, not a recolor — plus a set of self-contained mini-apps written from scratch in Rust → WebAssembly. No React. No Tailwind. Static HTML with Vue islands only where interactivity earns its keep.
The full story of the rebuild — dropping React, dropping Tailwind, the Astro 4→7 jump, the domain move, the flaky-internet war — is on the blog: Reborn.
client:only="vue" mounts the interactive app. State lives in three tiny Pinia stores (theme · mode · locale).translationKey keeps you on the same article when you switch language)./editor) — live Markdown preview, tag chips, auto "last edited" date, export to Markdown/Astro./license page covering both the code (VKPPL) and the writing (VAI Content License)./llms.txt.| App | What | Live |
|---|---|---|
| Horizon 2027 | Interactive, branching New-Year experience with a live countdown (Gregorian and Chinese New Year). | /files/horizon |
| JustCode | Turn source code into beautiful images — themes, window chrome, PNG/JPEG/WebP/SVG, saved presets. | /files/justcode |
| VAI Terminal | An explorable command-line portfolio with a writable virtual filesystem; speaks bash and PowerShell. | /files/terminal |
Each lab lives in projects/<name>/ and builds with trunk build --release straight into public/files/<name>/.
Site: Astro 7 · Vue 3.5 + Pinia 3 · TypeScript 7 · Vite 8 · modular CSS-token themes (no Tailwind, no CSS framework — just variables and discipline).
Labs: Rust · Leptos 0.6 (CSR) · Trunk · WebAssembly.
Tooling: Bun · Zod-validated content collections · a custom build-verify test (tests/build-check.mjs).
Infra: GitHub Actions (deploy · label sync · stats cron, all on the latest action majors) · Dependabot · GitHub Pages + Cloudflare DNS (DNS-only).
.github/workflows/stats.yml runs scripts/update-stats.mjs every 6 hours (and on demand). It walks the GitHub API across every owned repo, aggregates total stars / forks / followers, a language breakdown by bytes (with estimated lines of code), and per-repo stats — stars, forks, open issues + PRs, and the latest release tag. The result is committed to public/data/stats.json; the site reads that JSON at runtime, so numbers stay fresh with zero per-visitor API calls and no rate limits. If GitHub's API is down, the site degrades gracefully to the last good snapshot. The data is public: /data/stats.json.
src/
components/sections/ # one Vue component per page section
data/ # editable data (projects, labs, friends, achievements, …)
i18n/translations/ # ru/ en/ zh — one file per section, merged in index.ts
styles/themes/ # one CSS file per theme
pages/ # index · blog · editor · license (Astro)
content/blog/ # trilingual Markdown posts (Zod-validated)
projects/{horizon,justcode,terminal}/ # Rust/WASM mini-apps
scripts/update-stats.mjs # GitHub stats generator (cron)
tests/build-check.mjs # build + SEO + i18n-parity + 404 verifier
public/ # static assets, CNAME, favicons, /data/stats.json, /llms.txt
bun install
bun run dev # local dev
bun run build # → dist/ (runs postbuild)
bun run verify # build output + SEO + i18n parity + broken-link check
Build a lab:
rustup target add wasm32-unknown-unknown # once
cargo install trunk --locked # once
cd projects/horizon && trunk build --release
bun run verify (after a build) checks the dist/ output for: required pages & assets, SEO essentials (OG banner, JSON-LD, sitemap, robots, CNAME), that every blog post exists in ru/en/zh, that i18n keys are in parity across all three languages, and that there are no broken internal links. It's the gate the deploy pipeline runs too.
Pushing to main (or the stats cron committing) triggers GitHub Actions → GitHub Pages. Custom domain vai-rice.space via public/CNAME + Cloudflare DNS (DNS-only). Pages source must be set to GitHub Actions.
Check that CI actions are on their latest versions:
grep -rh 'uses:' .github/workflows | sort -u # what you pin now
gh api repos/actions/checkout/releases/latest -q .tag_name # latest upstream tag
Know a community or a person that belongs here? Use the trilingual issue forms: suggest a community · add a friend.
Two licenses, both explained in plain words on the /license page:
For both: ✅ non-commercial use · ❌ commercial use without permission · ❌ AI / ML training on the code or content.
business@vai-rice.space · vai-rice.space · github.com/Vadim-Khristenko
Vue
32.9%
CSS
24.4%
TypeScript
13.7%
JavaScript
13.6%
Rust
8.3%
Astro
4.7%
HTML
2.3%
Just my portfolio website and smth more) (pwd by RUST & VUE & ASTRO)
1
stars
228
commits
Vue
primary language
Sep 11, 2026
updated
Personal site of Vadim Khristenko — a.k.a. VAI_PROG. Developer · bot-maker · open-source activist. Systems code, Rust, and interfaces that don't look like everyone else's.
A trilingual (🇬🇧 / 🇷🇺 / 🇨🇳) single-page portfolio with 8 fully distinct themes — each one a genuine experience, not a recolor — plus a set of self-contained mini-apps written from scratch in Rust → WebAssembly. No React. No Tailwind. Static HTML with Vue islands only where interactivity earns its keep.
The full story of the rebuild — dropping React, dropping Tailwind, the Astro 4→7 jump, the domain move, the flaky-internet war — is on the blog: Reborn.
client:only="vue" mounts the interactive app. State lives in three tiny Pinia stores (theme · mode · locale).translationKey keeps you on the same article when you switch language)./editor) — live Markdown preview, tag chips, auto "last edited" date, export to Markdown/Astro./license page covering both the code (VKPPL) and the writing (VAI Content License)./llms.txt.| App | What | Live |
|---|---|---|
| Horizon 2027 | Interactive, branching New-Year experience with a live countdown (Gregorian and Chinese New Year). | /files/horizon |
| JustCode | Turn source code into beautiful images — themes, window chrome, PNG/JPEG/WebP/SVG, saved presets. | /files/justcode |
| VAI Terminal | An explorable command-line portfolio with a writable virtual filesystem; speaks bash and PowerShell. | /files/terminal |
Each lab lives in projects/<name>/ and builds with trunk build --release straight into public/files/<name>/.
Site: Astro 7 · Vue 3.5 + Pinia 3 · TypeScript 7 · Vite 8 · modular CSS-token themes (no Tailwind, no CSS framework — just variables and discipline).
Labs: Rust · Leptos 0.6 (CSR) · Trunk · WebAssembly.
Tooling: Bun · Zod-validated content collections · a custom build-verify test (tests/build-check.mjs).
Infra: GitHub Actions (deploy · label sync · stats cron, all on the latest action majors) · Dependabot · GitHub Pages + Cloudflare DNS (DNS-only).
.github/workflows/stats.yml runs scripts/update-stats.mjs every 6 hours (and on demand). It walks the GitHub API across every owned repo, aggregates total stars / forks / followers, a language breakdown by bytes (with estimated lines of code), and per-repo stats — stars, forks, open issues + PRs, and the latest release tag. The result is committed to public/data/stats.json; the site reads that JSON at runtime, so numbers stay fresh with zero per-visitor API calls and no rate limits. If GitHub's API is down, the site degrades gracefully to the last good snapshot. The data is public: /data/stats.json.
src/
components/sections/ # one Vue component per page section
data/ # editable data (projects, labs, friends, achievements, …)
i18n/translations/ # ru/ en/ zh — one file per section, merged in index.ts
styles/themes/ # one CSS file per theme
pages/ # index · blog · editor · license (Astro)
content/blog/ # trilingual Markdown posts (Zod-validated)
projects/{horizon,justcode,terminal}/ # Rust/WASM mini-apps
scripts/update-stats.mjs # GitHub stats generator (cron)
tests/build-check.mjs # build + SEO + i18n-parity + 404 verifier
public/ # static assets, CNAME, favicons, /data/stats.json, /llms.txt
bun install
bun run dev # local dev
bun run build # → dist/ (runs postbuild)
bun run verify # build output + SEO + i18n parity + broken-link check
Build a lab:
rustup target add wasm32-unknown-unknown # once
cargo install trunk --locked # once
cd projects/horizon && trunk build --release
bun run verify (after a build) checks the dist/ output for: required pages & assets, SEO essentials (OG banner, JSON-LD, sitemap, robots, CNAME), that every blog post exists in ru/en/zh, that i18n keys are in parity across all three languages, and that there are no broken internal links. It's the gate the deploy pipeline runs too.
Pushing to main (or the stats cron committing) triggers GitHub Actions → GitHub Pages. Custom domain vai-rice.space via public/CNAME + Cloudflare DNS (DNS-only). Pages source must be set to GitHub Actions.
Check that CI actions are on their latest versions:
grep -rh 'uses:' .github/workflows | sort -u # what you pin now
gh api repos/actions/checkout/releases/latest -q .tag_name # latest upstream tag
Know a community or a person that belongs here? Use the trilingual issue forms: suggest a community · add a friend.
Two licenses, both explained in plain words on the /license page:
For both: ✅ non-commercial use · ❌ commercial use without permission · ❌ AI / ML training on the code or content.
business@vai-rice.space · vai-rice.space · github.com/Vadim-Khristenko
Vue
32.9%
CSS
24.4%
TypeScript
13.7%
JavaScript
13.6%
Rust
8.3%
Astro
4.7%
HTML
2.3%