OpenTwig is an open source personal link page generator that creates beautiful, customizable "link in bio" pages. Instead of relying on third-party services, users can define their configuration and instantly create a fully functional static site they own and control.
- π¨ Multiple Themes: Choose from 4 built-in themes (default, dark, minimal, colorful)
- π± Mobile Responsive: Optimized for all devices with mobile-first design
- π Fast & Lightweight: Generates static HTML/CSS with minimal dependencies
- π Easy Link Management: Simple JSON configuration for all your links
- πΌοΈ Optional Avatar Support: Custom profile pictures with automatic processing (completely optional)
- π Open Graph Images: Auto-generated social media preview images
- π± QR Code Generation: Built-in QR codes for easy mobile sharing
- π Modal Dialogs: Support for rich content in footer links
- π€ Share Functionality: Native Web Share API integration
- β‘ CSS Optimization: Automatic CSS minification and autoprefixing
- π οΈ CLI Interface: Simple command-line interface with helpful commands
# Create a new project
npx opentwig --init
# Edit the generated config.json with your information
# Then generate your page
npx opentwig- Node.js (v14 or higher)
- npm or yarn
OpenTwig uses a simple JSON configuration file (config.json) to define your page. Here's the complete configuration structure:
{
"theme": "default",
"url": "https://links.yourwebsite.com",
"title": "Your Name - opentwig πΏ",
"name": "Your Name",
"content": "Hello World! Here is my bio.",
"minify": true,
"avatar": {
"path": "./avatar.png"
},
"links": [
{
"url": "https://twitter.com",
"title": "Twitter"
},
{
"url": "https://instagram.com",
"title": "Instagram"
}
],
"footerLinks": [
{
"title": "Contact",
"url": "mailto:mail@mail.com"
},
{
"title": "Privacy",
"content": "Your privacy policy content here..."
}
],
"share": {
"title": "Your Name - opentwig πΏ",
"url": "https://links.yourwebsite.com",
"text": "Share"
}
}{
"theme": "default",
"url": "https://links.yourwebsite.com",
"title": "Your Name - opentwig πΏ",
"name": "Your Name",
"content": "Hello World! Here is my bio.",
"minify": true,
"links": [
{
"url": "https://twitter.com",
"title": "Twitter"
},
{
"url": "https://instagram.com",
"title": "Instagram"
}
],
"footerLinks": [
{
"title": "Contact",
"url": "mailto:mail@mail.com"
}
],
"share": {
"title": "Your Name - opentwig πΏ",
"url": "https://links.yourwebsite.com",
"text": "Share"
}
}| Option | Type | Description |
|---|---|---|
theme |
string | Theme name (default, dark, minimal, colorful) |
url |
string | Your page URL (for Open Graph and QR codes) |
title |
string | Page title (appears in browser tab) |
name |
string | Your display name |
content |
string | Bio/description text |
minify |
boolean | Enable CSS minification (default: true) |
avatar |
object | Optional Avatar image configuration |
avatar.path |
string | Optional Path to your avatar image (supports PNG, JPG, JPEG, WebP) |
links |
array | Array of link objects with url and title |
footerLinks |
array | Footer links (can be URLs or modal dialogs) |
share |
object | Web Share API configuration |
The avatar feature is completely optional. If you don't include the avatar object in your configuration, no avatar will be displayed on your page.
Supported image formats:
- PNG
- JPG/JPEG
- WebP
- SVG
Avatar processing:
- Images are automatically optimized and resized
- Processed avatar is saved as
avatar.pngin the output directory - Original aspect ratio is preserved
- Images are compressed for optimal web performance
Example avatar configuration:
{
"avatar": {
"path": "./my-photo.jpg"
}
}Note: If you don't want an avatar, simply omit the avatar object from your configuration entirely.
OpenTwig includes 5 beautiful themes:
- Default: Clean, modern design with subtle shadows and rounded corners
- Dark: Dark mode variant of the default theme
- Minimal: Simplified, minimalist design
- Colorful: Vibrant color scheme
- Azure: Clean gradient design with Azure-inspired colors
All themes are mobile-responsive and include:
- Optional custom avatar display
- Link buttons with hover effects
- Modal dialogs for rich content
- QR code integration
- Share button functionality
# Show help information
npx opentwig --help
# Create sample config.json
npx opentwig --init
# Generate page from config.json
npx opentwigOpenTwig generates the following files in the dist/ directory:
index.html- Main HTML pagestyle.css- Processed and optimized CSSavatar.png- Processed avatar image (only generated if avatar is configured)og-image.jpg- Open Graph image for social sharingqr.svg- QR code for mobile sharing
If you want to contribute to OpenTwig or customize it locally:
# Clone the repository
git clone https://github.com/tufantunc/opentwig.git
cd opentwig
# Install dependencies
npm install
# Test the CLI
npm start -- --help
# Create a sample config for testing
npm start -- --init
# Test the build process
npm startopentwig/
βββ src/
β βββ index.js # Main CLI entry point
β βββ constants.js # Application constants
β βββ utils/ # Core utilities
β βββ buildPage.js # Page building logic
β βββ generateHTML.js # HTML generation
β βββ generateOGImage.js # Open Graph image creation
β βββ generateQR.js # QR code generation
β βββ processCSS.js # CSS processing and optimization
β βββ ...
βββ theme/
β βββ default/ # Default theme
β β βββ index.js # Theme template
β β βββ style.css # Theme styles
β β βββ components/ # Reusable components
β βββ dark/ # Dark theme
β βββ minimal/ # Minimal theme
β βββ colorful/ # Colorful theme
β βββ azure/ # Azure theme
βββ .github/ # GitHub templates
β βββ ISSUE_TEMPLATE/ # Issue templates
β βββ pull_request_template.md # PR template
βββ dist/ # Generated output (gitignored)
- Image Processing: Uses Sharp for avatar and OG image processing
- QR Code Generation: Uses qrcode library for SVG QR codes
- CSS Processing: PostCSS with autoprefixer and minification
- HTML Generation: Component-based template system
- Theme System: Modular theme architecture with component support
Since OpenTwig generates static files, you can deploy to any static hosting service:
- GitHub Pages: Push
dist/folder to a repository - Netlify: Drag and drop the
dist/folder - Vercel: Connect your repository
- AWS S3: Upload files to an S3 bucket
- Any web server: Upload the
dist/folder to your server
Check out these amazing websites created with OpenTwig! These examples showcase sites made with OpenTwig:
- Tufan TunΓ§ - My Social Links - My social links, used default theme with avatar
Have you created a website with OpenTwig? We'd love to showcase it! You can add your site to our showcase in two ways:
- Create an Issue - Use our showcase submission template
- Submit a Pull Request - Add your site directly to the showcase section in this README
- β Your site must be live and accessible
- β Use OpenTwig to generate the site
- β Keep descriptions concise (1-2 sentences max)
- Creative use of themes and customization
- Different use cases (personal, business, portfolio, etc.)
- Good examples of various configuration options
- Sites that inspire other users
MIT License - see LICENSE file for details
OpenTwig is open source and welcomes contributions from the community! π
- π Report bugs using our bug report template
- β¨ Suggest features through our feature request template
- π Improve documentation using our documentation improvement template
- π Submit to showcase using our showcase submission template
- π¨ Create themes - add new visual styles and layouts
- π§ Fix issues - tackle open issues and improve the codebase
- π Translate - help translate documentation and content
- Read our Contributing Guide - Complete guide for contributors
- Check our Code of Conduct - Community guidelines
- Look for
good first issuelabels - Perfect for newcomers - Fork, code, and submit a PR - Standard open source workflow
π This repository participates in Hacktoberfest 2025!
- Look for issues with
hacktoberfestandgood first issuelabels - Follow our issue and PR templates
- Make meaningful contributions that benefit the project
- Review our Contributing Guide before starting
We appreciate all contributors! Contributors will be:
- Listed here (if desired)
- Mentioned in release notes for significant contributions
- Given priority for code reviews and feedback
You can validate your configuration file using the CLI option:
npx opentwig --validate-config--help- Show usage information--init- Create a sample config.json--validate-config- Validate the config.json filebuild- Compile the project filesstart- Run the projecttest- Execute the project tests