A modern, brutalist-designed static site generator for link bio pages
Project description
LinkBioSite
A modern, brutalist-designed static site generator for creating beautiful link bio pages. Built with Python and Jinja2 templates, featuring 2026 design trends with cosmic midnight color palettes and experimental layouts.
✨ Features
- 🎨 2026 Brutalist Design: Raw edges, asymmetrical layouts, and bold typography
- 🌙 Cosmic midnight color palette with high contrast
- 🚀 Built with Python and Jinja2 templating
- 📱 Mobile-friendly responsive layout
- 🐳 Static site generation for fast hosting
- 📊 Analytics integration ready
- 🔍 SEO optimized with meta tags
- ✨ Motion Design: Subtle animations and interactive hovers
- ♿ Accessibility: Reduced motion support
- 🛠️ Library API: Use as a Python library or CLI tool
- 🐳 Docker Support: Multi-stage builds for development and production
🚀 Quick Start
Installation
Install LinkBioSite using pip:
pip install linkbiosite
Or install from source for development:
git clone https://github.com/rafnixg/links.git
cd links
pip install -e .
Create Your First Link Bio
- Initialize a new project:
linkbiosite init my-bio
cd my-bio
- Edit
data.jsonwith your information:
{
"bio": {
"name": "Your Name",
"greeting": "Hi, I'm Your Name",
"subtitle": "Your awesome subtitle",
"handle": "@yourhandle",
"avatar": "/avatar.png",
"avatar_alt": "YN"
},
"links": {
"Social": [
{"text": "Website", "tag": "globe", "url": "https://example.com"},
{"text": "Twitter", "tag": "twitter", "url": "https://twitter.com/yourhandle"}
]
}
}
- Build your site:
linkbiosite build
- Serve locally for development:
linkbiosite serve
Your link bio will be available at http://localhost:8000
💻 Usage
Command Line Interface
LinkBioSite provides a comprehensive CLI for all operations:
# Initialize a new project
linkbiosite init [directory]
# Build the static site
linkbiosite build [--output OUTPUT_DIR]
# Serve locally for development
linkbiosite serve [--port PORT] [--host HOST]
# Show help
linkbiosite --help
Python API
Use LinkBioSite as a Python library:
from linkbiosite import build, init, serve
# Initialize a new project
init("my-bio-project")
# Build the site
output_dir = build()
# Serve for development
serve(port=8000)
Advanced Usage
from linkbiosite import LinkBioSiteGenerator
# Create a custom generator
generator = LinkBioSiteGenerator(project_root="/path/to/project")
# Build with custom output directory
output_path = generator.build_site(output_dir="/custom/output")
# Load and validate data
data = generator.load_data()
generator.validate_data(data)
🐳 Docker Usage
Development
Build and run the development container:
# Build development image
docker build --target runtime -t linkbio:dev .
# Run with volume mounting
docker run -it --rm \
-v $(pwd):/app/project \
-v $(pwd)/public:/app/output \
-p 8000:8000 \
linkbiosite:dev \
linkbiosite serve --host 0.0.0.0
Production
Build and run the production container:
# Build production image
docker build --target production -t linkbiosite:prod .
# Run nginx server
docker run -d -p 80:80 linkbiosite:prod
📁 Project Structure
When you initialize a new LinkBioSite project, you'll get:
my-bio/
├── data.json # Site configuration and content
├── templates/ # Jinja2 templates
│ ├── index.html # Main page template
│ └── styles.css # CSS styles
├── assets/ # Static assets (images, etc.)
└── public/ # Generated site (after build)
🛠️ Technologies
- Language: Python 3.8+
- Templating: Jinja2 3.0+
- Styling: CSS3 with brutalist design
- Containerization: Docker with multi-stage builds
- Package Management: Modern Python packaging (pyproject.toml)
📖 Configuration
data.json Structure
{
"bio": {
"name": "Your Name",
"greeting": "Welcome message",
"subtitle": "Your subtitle",
"handle": "@yourhandle",
"avatar": "/path/to/avatar.png",
"avatar_alt": "Alt text for avatar"
},
"links": {
"Category Name": [
{
"text": "Link Text",
"tag": "icon-name",
"url": "https://example.com"
}
]
},
"footer": {
"copyright": "© {year} Your Name. All rights reserved."
},
"analytics": {},
"meta": {
"title": "Page Title",
"description": "Page description for SEO"
}
}
Custom Templates
LinkBio uses Jinja2 templates. Customize templates/index.html and templates/styles.css to match your design needs.
👤 Author
Rafnix Guzmán
- Website: rafnixg.dev
- Twitter: @rafnixg
- GitHub: @rafnixg
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
📝 License
This project is licensed under the MIT License - see the LICENSE file for details.
⭐ Show your support
Give a ⭐️ if this project helped you!
📚 Documentation
For detailed documentation, visit linkbio.readthedocs.io (coming soon).
🙏 Acknowledgments
- Inspired by 2026 design trends
- Built with modern Python packaging
- Thanks to the Jinja2 and Python communities```
- Install dependencies:
pip install -r requirements.txt
💻 Usage
Building the Site
To generate the static site:
python build.py
The generated site will be in the public/ directory.
Development Mode
Run the application in development mode with hot reload:
reflex run
The application will be available at:
- Frontend: http://localhost:3000
- Backend: http://localhost:8000
Export Static Files
Export the public files to the public folder:
./public_export
Production Mode
Run the application in production mode:
reflex run --env prod
🐳 Docker Deployment
Build and run the application using Docker:
# Build the Docker image
docker build -t reflex-links:latest .
# Run the container
docker run -d -p 8000:8000 -p 3000:3000 --name links reflex-links:latest
Access the application at http://localhost:3000
📁 Project Structure
links/
├── link_bio/ # Main application code
│ ├── components/ # Reusable UI components
│ ├── styles/ # CSS styles and theme
│ ├── views/ # Page views (header, footer, links)
│ └── link_bio.py # Main application file
├── assets/ # Static assets (images, icons)
├── public/ # Public files
├── requirements.txt # Python dependencies
├── rxconfig.py # Reflex configuration
└── Dockerfile # Docker configuration
🛠️ Technologies
- Static Site Generator: Custom Python/Jinja2 SSG
- Language: Python 3.11+
- Templating: Jinja2 3.1.2
- Styling: CSS3 with animations and brutalist design
- Analytics: Umami Analytics
- Containerization: Docker
👤 Author
Rafnix Guzmán
- Website: links.rafnixg.dev
- Twitter: @rafnixg
- GitHub: @rafnixg
🤝 Contributing
Contributions, issues, and feature requests are welcome! Feel free to check the issues page.
📝 License
This project is open source and available for personal and commercial use.
⭐ Show your support
Give a ⭐️ if this project helped you!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file linkbiosite-1.0.0.tar.gz.
File metadata
- Download URL: linkbiosite-1.0.0.tar.gz
- Upload date:
- Size: 20.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
867e38263dc2d23ab68ad324a55f98f7eed294b328b8aad76d85ae3af938ca8d
|
|
| MD5 |
02c99f09795231e0b1c68126d9d8dd5a
|
|
| BLAKE2b-256 |
c32ea9d5febe0dec417a656f0b50d724ce74fb9aec804b94a3b44f165dbe7db4
|
File details
Details for the file linkbiosite-1.0.0-py3-none-any.whl.
File metadata
- Download URL: linkbiosite-1.0.0-py3-none-any.whl
- Upload date:
- Size: 16.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
850d7923619a6f2bdd3a69fe939e9771aaf596a764bfd5b3abd49fcd93ddb423
|
|
| MD5 |
5c9df8be1e8f0928454c29b6bceed203
|
|
| BLAKE2b-256 |
f894514974305a9d515a0d83cf5fdbf9ad07cb155b37138da352748cf8e4c63b
|