A free, open-source tool for creating realistic Bluesky post mockups and generating images from existing posts. Built with vanilla JavaScript and Tailwind CSS, designed to be fast, responsive, and easy to use.
Use it at https://skeetgen.bluedog.dev
Try it now β https://skeetgen.bluedog.dev or deploy it to your own server.
| Feature | Status | Description |
|---|---|---|
| π¨ Generate New Posts | β Complete | Create custom Bluesky posts from scratch |
| π± Real Post Integration | β Complete | Fetch and use actual Bluesky posts |
| π Dark/Light Mode | β Complete | Export in both themes |
| π± Mobile Responsive | β Complete | Works on all devices |
| π Cloudflare Deployment | β Complete | One-click deployment |
| π Real Engagement Data | β Complete | Uses actual Bluesky metrics |
| π― WCAG Compliant | β Complete | Accessibility standards |
| π² Smart Randomization | β Complete | Realistic engagement metrics generation |
- User Profile: Customize display name, handle, and avatar
- Post Content: Add text content with character counter (300 char limit)
- Images: Upload custom images for both avatars and post content
- Post Types: Support for regular posts, reposts, and replies
- Engagement Metrics: Set custom repost, like, and reply counts with randomization
- Timestamps: Customize date and time with smart formatting
- Theme Export: Choose light or dark mode for the exported image
- Social Handle Input: Enter Bluesky handles to fetch real posts via Bluesky API
- Post Selection: Browse and select from fetched posts with pagination
- Direct URL Support: Paste specific post URLs for instant loading
- Real Data: Uses actual Bluesky posts with real engagement metrics
- Theme Export: Choose light or dark mode for the exported image
- Live updates as you type
- Responsive design for mobile and desktop
- Dark/light mode toggle of the preview image
- Bluesky-accurate styling
- High-quality PNG export
- Automatic filename generation with user's handle/display name
- Light and dark mode export themes
- Fast: Client-side generation with no server required
- Responsive: Mobile-first design
- Accessible: WCAG compliant with keyboard navigation
- Lightweight: Minimal dependencies
- Smart Randomization: Realistic engagement metrics generation
- Real Bluesky API: Live post fetching from actual Bluesky accounts
- Direct URL Support: Load specific posts by pasting Bluesky URLs
-
Clone the repository
git clone https://github.com/bluedog-consulting/bluesky-skeetgen.git cd bluesky-skeetgen -
Open in browser
# Using Python (if installed) python -m http.server 8000 --directory site # Using Node.js (if installed) npx serve site # Or simply open site/index.html in your browser
-
Choose your workflow:
- π¨ Generate New Post Image: Create custom posts from scratch
- π± Create from Existing Post: Generate images from real Bluesky posts
-
Export your images in light or dark mode!
Note: For full Bluesky API integration, deploy to Cloudflare Workers using npx wrangler deploy
-
Deploy with one command
npx wrangler deploy
-
Configure Google Analytics (Optional)
# Set your GA4 tracking ID wrangler secret put GOOGLE_ANALYTICS_ID # Enter your tracking ID when prompted (e.g., G-XXXXXXXXXX)
-
Your app will be available at
https://bluesky-skeetgen.your-subdomain.workers.dev -
Features included:
- Static site hosting
- Real Bluesky API integration (using api.bsky.app)
- No CORS issues (everything on same domain)
- Avatar proxy for Bluesky CDN images
- Optional Google Analytics integration
- Cloudflare Pages: For static-only deployment (no API features)
- Netlify: Drag and drop the folder or connect to Git
- Vercel: Import repository and deploy
- GitHub Pages: Enable in repository settings
- Any static hosting: Upload files to any web server
Note: Only Cloudflare Workers deployment (currently) includes the full Bluesky API integration
-
Choose Post Type
- Regular Post: Standard Bluesky post
- Repost: Shows as a reposted post
- Reply: Shows as a reply to another post
-
Set User Profile
- Display Name: Your name as it appears
- Handle: Your Bluesky handle (e.g., @username.bsky.social)
- Avatar: Upload a custom image or use default
-
Add Content
- Post Text: Your message (300 character limit)
- Post Image: Optional image attachment
- Character counter shows remaining characters
-
Customize Engagement
- Reposts: Number of reposts
- Likes: Number of likes
- Replies: Number of replies
- π² Randomize: Click to generate realistic metrics
-
Set Timestamp
- Date: When the post was made
- Time: Time of posting
- Smart formatting (e.g., "2h", "3d", "Jan 15")
-
Export
- Choose Light Mode or Dark Mode
- Click "Export as PNG" to download
- Image includes all styling and content
- Automatic filename generation with your handle/display name
-
Enter Bluesky Handle
- Type a Bluesky handle (e.g., @username.bsky.social)
- Click "Fetch Posts" to load their real posts via Bluesky API
- Or paste a direct post URL for instant loading
-
Select a Post
- Browse through fetched posts with pagination
- Posts show real engagement metrics and content
- Click on any post to select it
- Preview updates automatically with real data
-
Export
- Choose Light Mode or Dark Mode
- Click "Export as PNG" to download
- Image preserves the original post content and real metrics
- Images: Use square images for avatars, any aspect ratio for post images
- Content: Keep posts under 300 characters for realism
- Metrics: Use realistic numbers (e.g., 42 likes, 12 reposts) or click "π² Randomize"
- Timestamps: Recent dates work best for engagement metrics
- Handles: Enter the exact Bluesky handle (e.g., @username.bsky.social)
- URLs: Use direct post URLs for specific posts (e.g., https://bsky.app/profile/username.bsky.social/post/3juxx2q5n2g2a)
- Real Data: All posts and metrics come from the actual Bluesky API
- Selection: Browse through posts to find the perfect one
- Export: Choose your preferred theme (light/dark) for the final image
bluesky-skeetgen/
βββ site/ # Static files for deployment
β βββ index.html # Main application
β βββ css/styles.css # Custom Bluesky styling
β βββ js/ # JavaScript modules
β β βββ app.js # Main app logic & workflow management
β β βββ post-generator.js # Post rendering engine
β β βββ image-handler.js # Image upload & processing
β β βββ export-handler.js # PNG export functionality
β β βββ post-fetcher.js # Bluesky API integration & post selection
β βββ assets/ # Images and assets
βββ api-worker.js # Cloudflare Worker (serves static assets + API)
βββ wrangler.toml # Cloudflare Workers config
βββ DEPLOYMENT.md # Deployment guide
βββ README.md # Project documentation
- Tailwind CSS (CDN): Styling framework
- html2canvas (CDN): PNG export functionality
- Vanilla JavaScript: No build process required
- Cloudflare Workers: For API integration and static asset serving
- Bundle Size: < 50KB (minified)
- Load Time: < 1 second
- Export Time: 2-5 seconds depending on content
- API Response: < 500ms for Bluesky API calls (via api.bsky.app)
- Edge Computing: Global CDN for fast worldwide access (if using Cloudflare - YMMV with other providers)
- Google Analytics: Optional GA4 integration via client-side API configuration
- Privacy-First: No tracking by default, analytics only when environment variable is set
- Open Source: All tracking code is visible in HTML, environment variable keeps ID private
- GDPR Compliant: Analytics can be disabled by not setting the environment variable
I welcome contributions! Here's how to get started:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Test thoroughly
- Commit:
git commit -m 'Add amazing feature' - Push:
git push - Open a Pull Request
- Use vanilla JavaScript (ES6+)
- Follow existing code structure
- Add comments for complex logic
- Test on multiple browsers
- Ensure mobile responsiveness
- Real Bluesky API integration for live post fetching (using api.bsky.app)
- Seamless workflow switching with confirmation dialogs
- Content preservation across workflow switches
- Watermark on exports
- Add more post types (quote posts, polls)
- Batch export multiple posts
- User authentication for saved posts
This project is licensed under the MIT License - see the LICENSE file for details.
- Inspired by BrandBird's Bluesky Post Generator
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Note: This tool is for creating mockups and educational content. Please use responsibly and don't create misleading or deceptive content.