A modern, responsive bento-style link tree built with SvelteKit, featuring live data integration from various APIs.
Clone the repository
Install dependencies:
npm install
Copy the example environment file:
cp .env.example .env
Fill in your API credentials in the .env file (see API Setup below)
Start the development server:
npm run dev
public_repo scope (or repo for private repos).env:GITHUB_TOKEN: Your personal access tokenGITHUB_USERNAME: Your GitHub usernameGITHUB_REPO_OWNER: Owner of the repo to displayGITHUB_REPO_NAME: Repository name to display.env:SPOTIFY_CLIENT_ID: Your Spotify app client IDSPOTIFY_CLIENT_SECRET: Your Spotify app client secretSPOTIFY_REFRESH_TOKEN: Your refresh token (optional, for now playing)Note: The Spotify "Now Playing" feature requires a user-authorized refresh token. The client credentials flow only works for public data.
.env:BLUESKY_HANDLE: Your Bluesky handle (e.g., username.bsky.social)BLUESKY_PASSWORD: Your app passwordhttps://www.strava.com/oauth/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=http://localhost&scope=activity:read_all.env:STRAVA_CLIENT_ID: Your Strava app client IDSTRAVA_CLIENT_SECRET: Your Strava app client secretSTRAVA_REFRESH_TOKEN: Your refresh tokensrc/
āāā lib/
ā āāā api/ # API integration utilities
ā ā āāā github.js # GitHub API functions
ā ā āāā spotify.js # Spotify API functions
ā ā āāā bluesky.js # Bluesky API functions
ā ā āāā strava.js # Strava API functions
ā ā āāā index.js # API exports
ā āāā ...
āāā routes/
āāā +page.svelte # Main bento grid page
āāā +page.server.js # Server-side data fetching
src/lib/api/src/routes/+page.server.jssrc/routes/+page.svelte<style> sectionThe cards use CSS Grid with a 2-column layout on desktop. Modify the .bento-grid styles to change the layout.
All API credentials are stored in .env (not committed to git). See .env.example for all available variables.
Important: Never commit your .env file to version control!
npm run build
Note: This project uses live API data, so it's configured as a dynamic site (not prerendered). For static hosting, you may want to implement caching or use a different deployment strategy.
SPOTIFY_REFRESH_TOKENusername.bsky.social)MIT
Feel free to submit issues and pull requests!