Be static, and be beautiful.
[English] | 日本語
A static Bluesky client built with Hugo and Material Web Components.
- Login — Sign in with your Bluesky handle and app password
- Timeline — Fetch and display your home timeline
- Post — Create text posts
- Image upload — Attach up to 4 images per post
- Session persistence — Login state is saved via cookies so you stay logged in on reload
- Responsive UI — Built with Material Design 3 components
| Layer | Technology |
|---|---|
| Static site generator | Hugo v0.140.0+ |
| UI components | Material Web Components (via esm.sh) |
| Bluesky API | @atproto/api v0.13.6 (via esm.sh) |
| Fonts | Google Fonts — Roboto, Material Symbols Outlined |
- Hugo extended v0.140.0 or later
git clone https://github.com/kons10/materialblue.git
cd repo-namehugo serverOpen http://localhost:1313 in your browser.
hugoThe output is generated in the public/ directory.
This project is designed for static hosting (e.g. GitHub Pages, Cloudflare Pages, Netlify).
Before deploying, update baseURL in hugo.yaml to match your actual URL:
baseURL: 'https://example.com/'This application must be placed in the / directory directly under the domain. Otherwise, it may not function correctly.
- Open the app in your browser
- Enter your Bluesky handle (e.g.
user.bsky.social) and an app password- App passwords can be created at: Bluesky Settings → Privacy and Security → App Passwords
- Click Login
- Your timeline will load automatically
Note: Your credentials are never sent anywhere other than
bsky.social. Session tokens are stored in browser cookies only.
.
├── content/
│ └── _index.md # Home page front matter
├── layouts/
│ ├── _default/
│ │ └── baseof.html # Base HTML template (header, footer, MWC setup)
│ └── index.html # Home page template (login + timeline UI)
├── static/
│ └── src/
│ └── bsky-client.js # Bluesky API client wrapper
└── hugo.yaml # Hugo configuration
Licensed under the Apache License 2.0.