Skip to content

kelp/kelp.github.io

Repository files navigation

kelp.github.io (tcole.net)

License: MIT

This is a Jekyll-powered personal website and blog for Travis Cole. The site is automatically deployed to GitHub Pages at tcole.net.

Note to visitors: This repository is open-sourced to share how I've built my blog, particularly the Bluesky cross-posting functionality. Feel free to use and adapt any code or workflows for your own projects. Read the blog post about how I automated cross-posting to Bluesky.

IMPORTANT: This repository must remain named kelp.github.io for GitHub Pages to function correctly with the custom domain. Renaming this repository will break the GitHub Pages configuration and custom domain setup.

Features

  • Built with Jekyll
  • Responsive design with light/dark mode
  • Syntax highlighting using Rouge
  • Automatically deployed to GitHub Pages
  • Auto-crossposting to Bluesky with AI-generated summaries

Usage

Local Development

The site uses a Makefile to simplify common operations. Here are the main commands:

# Install dependencies
make install

# Run local server
make serve

# Create a new post
make new-post title="My New Post"

# Format markdown files (wraps at 78 characters)
make format

# Check for broken links
make check

Bluesky Cross-posting

This repository includes an automated GitHub Action that cross-posts blog posts to Bluesky when they're published. The action runs whenever new posts are added to the _posts/ directory.

How It Works

  1. When a blog post is added or modified in the _posts/ directory, the GitHub Action is triggered.
  2. The action extracts the title, content, and URL for the post.
  3. A post is created on Bluesky with:
    • The title as a clickable link back to the blog post
    • A short summary extracted from the post content
    • Proper formatting for Bluesky's character limits

Setup Requirements

To use the Bluesky cross-posting feature, you need to add the following secrets to your GitHub repository:

Required secrets:

  • BLUESKY_IDENTIFIER: Your Bluesky handle (e.g., tcole.net)
  • BLUESKY_PASSWORD: Your Bluesky app password

Optional secret for enhanced summaries:

  • ANTHROPIC_API_KEY: An Anthropic API key to use Claude for generating high-quality post summaries

If the Anthropic API key is not provided, the system will fall back to a simple text extraction method for creating summaries.

Configuration

The cross-posting behavior can be customized by modifying:

  • .github/workflows/bluesky-crosspost.yml: The GitHub workflow configuration
  • .github/scripts/crosspost_to_bluesky.py: The Python script that handles the cross-posting logic
  • .github/bluesky-published.json: Tracks which posts have been published to avoid duplicates

Manual Triggers

You can manually trigger the cross-posting workflow for existing posts:

gh workflow run "Cross-post to Bluesky" --ref main

This will post the most recent blog post to Bluesky, even if it has been posted before.

Post Formatting

Posts on Bluesky will appear with the following format:

A new post on my blog:

[Title of the Post] (clickable link to the blog post)

Summary text of the blog post...

When the ANTHROPIC_API_KEY is provided, the summary will be generated by Claude, Anthropic's AI assistant. This results in more coherent, engaging summaries that better represent the content of your posts. The summary is automatically sized to fit within Bluesky's character limits.

Draft Posts

Posts with draft: true in their front matter will be skipped and not cross-posted to Bluesky.

Credits

This site is built using:

Much of the code, including the Bluesky cross-posting system, was written with assistance from Claude Code.

About

Personal website and blog at tcole.net, built with Jekyll and deployed to GitHub Pages

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors