Skip to content

Instantly share code, notes, and snippets.

@chrishannah
chrishannah / miniship-email-notifications-plan.md
Created April 19, 2026 20:03
Miniship Email Notifications Implementation Plan (Issue #25)

Email Notifications Implementation Plan

Issue: chrishannah/miniship#25 Feature: Email Notifications (Pro Feature) Estimated Time: 6-8 hours Complexity: Medium-High Risk: Medium (external service integration, email delivery)

Overview

@chrishannah
chrishannah / miniship-issue-25-plan.md
Created April 2, 2026 16:06
Implementation Plan: Miniship Email Notifications (Issue #25)

Implementation Plan: Email Notifications (Pro Feature)

Issue: chrishannah/miniship#25
Type: Pro Feature
Estimated Time: 8-12 hours

Overview

Implement email notification system for Miniship subscribers to receive updates when new releases are published. This is a Pro-tier feature requiring Stripe subscription validation.

@chrishannah
chrishannah / entry-types-management-plan.md
Created March 30, 2026 03:59
Entry Types Management UI - Implementation Plan for Miniship #40

Entry Types Management UI - Implementation Plan

Overview

Add a UI for users to view, edit, reorder, and delete entry types in their changelogs. This solves the issue where users can't manage duplicate or unwanted entry types after they're created.

Context

  • Import logic was creating duplicate entry types (e.g., 'Added' and 'added') due to case mismatches (now fixed)
  • Users need a way to clean up existing duplicates and manage custom types
  • Currently no UI to edit, delete, or reorder entry types after creation
@chrishannah
chrishannah / miniship-issue-25-plan.md
Created March 24, 2026 08:00
Implementation Plan: Email Notifications (Pro Feature) - miniship#25

Implementation Plan: Email Notifications (Pro Feature)

Issue: chrishannah/miniship#25
Feature: Email notification system for changelog subscribers
Tier: Pro Feature
Estimated Time: 8-12 hours

Overview

Build a complete email notification system that allows users to subscribe to changelogs and receive email updates when new releases are published. This is a Pro-tier feature.

@chrishannah
chrishannah / miniship-40-plan.md
Created March 23, 2026 22:00
Implementation Plan: Entry Types Management UI (miniship#40)

Implementation Plan: Entry Types Management UI

Issue: chrishannah/miniship#40
Status: Planning
Estimated Time: 4-6 hours
Complexity: Medium
Risk: Medium (data migration for reordering, cascading deletes)

Overview

@chrishannah
chrishannah / new_post.sh
Created September 21, 2025 12:13
Bash script to automate starting a new blog post
#!/usr/bin/env bash
# Exit if no title is provided
if [ -z "$1" ]; then
echo "Usage: $0 \"Post Title\""
exit 1
fi
# Get current date parts
YEAR=$(date +%Y)
@chrishannah
chrishannah / ghost-mass-post-delete.sh
Created December 31, 2022 17:23
A bash script that allows you to mass delete blog posts from a Ghost blog via a text file of post ids.
#!/usr/bin/env bash
# Admin API key goes here
KEY="this is your admin api key"
# Split the key into ID and SECRET
TMPIFS=$IFS
IFS=':' read ID SECRET <<<"$KEY"
IFS=$TMPIFS
@chrishannah
chrishannah / Blogs.opml
Created January 27, 2021 17:14
Current RSS subscriptions as of 27/01/2021
<?xml version="1.0" encoding="UTF-8"?>
<opml version="2.0">
<head>
<title>Bloggers</title>
</head>
<body>
<outline title="Personal" text="Personal">
<outline text="Blog – Cal Newport" type="rss" htmlUrl="https://www.calnewport.com" xmlUrl="https://feeds.feedburner.com/StudyHacks" title="Blog – Cal Newport" />
<outline type="rss" title="Matt Gemmell" text="Matt Gemmell" htmlUrl="http://mattgemmell.com/" xmlUrl="https://mattgemmell.com/atom-nosponsor.xml?utm_source=MattGemmell.com+Members&amp;utm_campaign=311f4cf54b-Writers_Life_Newsletter_0073&amp;utm_medium=email&amp;utm_term=0_3fbd89148b-311f4cf54b-135530901" />
<outline xmlUrl="http://kylesethgray.com/rss/" htmlUrl="https://kylesethgray.com/" text="Kyle Seth Gray" title="Kyle Seth Gray" type="rss" />
@chrishannah
chrishannah / InsetLabel.swift
Last active March 12, 2022 14:01
A simple subclass of UILabel that allows you to add content insets to pad the content.
import UIKit
class InsetLabel: UILabel {
var contentInsets = UIEdgeInsets.zero
override func drawText(in rect: CGRect) {
let insetRect = UIEdgeInsetsInsetRect(rect, contentInsets)
super.drawText(in: insetRect)
}
@chrishannah
chrishannah / table.swift
Created June 8, 2018 08:43
Example code for the post "Hiding Extra Separators on a UITableView" on blog.chrishannah.me
import PlaygroundSupport
import UIKit
class DataSource: NSObject, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {