Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 39 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,44 @@
## Jordan's Site

<p align="center">
> My personal website, live at [kashall.dev](https://kashall.dev). Built with Nuxt 4 and Nuxt UI, shipped as a container image.

</p>
After almost continuous revisions, I've finally got my personal website to a state where I am proud of it. It's been a long journey since I first got invested in Vue, and it has grown alongside me from Nuxt 3 to Nuxt 4.

### Features

- Live Discord presence (activities, Spotify, profile banner and bio) streamed from [Juno](https://github.com/kashalls/juno)
- GitHub contribution stats, cached server-side for an hour
- Homelab stats pulled from [kromgo](https://github.com/kashalls/kromgo) badges
- Contact form protected by Cloudflare Turnstile and delivered with Resend
- A `/gateway` fallback page for hostnames that hit the gateway with no service behind them
- Pre-rendered OG images, sitemap and robots.txt

### Development

```bash
bun install
bun run dev
```

Optional environment variables:

| Variable | Purpose |
| ---------------------------- | -------------------------------------------------------- |
| `NUXT_GITHUB_TOKEN` | Raises the GitHub API rate limit for `/api/github` |
| `NUXT_RESEND_API_KEY` | Enables sending mail from the contact form |
| `NUXT_TURNSTILE_SITE_KEY` | Turnstile site key (dev uses the always-pass test keys) |
| `NUXT_TURNSTILE_SECRET_KEY` | Turnstile secret for server-side verification |
| `NUXT_PUBLIC_SITE_URL` | Overrides the canonical site URL |

### Deployment

The [Dockerfile](Dockerfile) builds a Nitro `node-server` output with bun and ships it on a distroless Node image, listening on port `3000`.

> Built with Nuxt 3, this is a fully static website hosted with Cloudflare Pages.
On every push to `main` and on each release, GitHub Actions builds a signed multi-arch (`amd64`/`arm64`) image with an SBOM and publishes it to `ghcr.io/kashalls/kashall.dev`.

After almost continuous revisions, I've finally got my personal website to a state where I am proud of it. It's been a long journey since I first got invested in Vue and honestly I just now got comfortable with Vue/Nuxt 3.
```bash
docker run --rm -p 3000:3000 ghcr.io/kashalls/kashall.dev:main
```

### 馃挅 Sponsors

Expand All @@ -18,5 +50,6 @@ After almost continuous revisions, I've finally got my personal website to a sta

### Powered By

- [Lanyard](https://github.com/phineas/lanyard) -- Lanyard (for Discord Presence)
- [Cloudflare Pages](https://cloudflare.com)
- [Nuxt](https://nuxt.com) and [Nuxt UI](https://ui.nuxt.com)
- [Juno](https://github.com/kashalls/juno) (for Discord presence)
- [Resend](https://resend.com) and [Cloudflare Turnstile](https://www.cloudflare.com/products/turnstile/)
Loading