Skip to content

Instantly share code, notes, and snippets.

@swmcc
Last active January 27, 2026 12:47
Show Gist options
  • Select an option

  • Save swmcc/a11f0f76fa6011a45a08f77f6d1bb38a to your computer and use it in GitHub Desktop.

Select an option

Save swmcc/a11f0f76fa6011a45a08f77f6d1bb38a to your computer and use it in GitHub Desktop.
swm.cc GitHub activity data
[
{
"shortName": "jotter",
"fullName": "swmcc/jotter",
"commits": [
{
"message": "\ud83c\udf4e Replace Jotter Upload.app with compiled AppleScript droplet\n\nThe hand-crafted bash wrapper didn't receive dropped files properly.\nUsing osacompile creates a proper macOS droplet that handles drag-and-drop.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "53c93721c8ba624117a1df8ac09e5f167ddceb87",
"date": "2026-01-26T00:00:48Z"
},
{
"message": "\ud83d\udd10 Skip CSRF verification for API token requests\n\nAllows authenticated API requests (with Authorization header) to bypass\nCSRF protection, fixing 422 errors on uploads via jotter-upload script.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "1041a56b7e2956ef5dd4b3d8cf0e154ff7c5a330",
"date": "2026-01-25T20:40:57Z"
},
{
"message": "\ud83d\udd27 Use XDG config path for jotter-upload\n\nMove config from ~/.jotter-config to ~/.config/jotter/config\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "a09ed49cf5ff086de7dfb64f2ea9ec3928c0c913",
"date": "2026-01-25T20:32:06Z"
},
{
"message": "Bump kamal from 2.9.0 to 2.10.1 (#12)\n\nBumps [kamal](https://github.com/basecamp/kamal) from 2.9.0 to 2.10.1.\n- [Release notes](https://github.com/basecamp/kamal/releases)\n- [Commits](https://github.com/basecamp/kamal/compare/v2.9.0...v2.10.1)\n\n---\nupdated-dependencies:\n- dependency-name: kamal\n dependency-version: 2.10.1\n dependency-type: direct:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"sha": "0539044e4f1a24ae86702a342ec1833fd4a79c2c",
"date": "2026-01-25T11:01:45Z"
},
{
"message": "Bump thruster from 0.1.16 to 0.1.17 (#15)\n\nBumps [thruster](https://github.com/basecamp/thruster) from 0.1.16 to 0.1.17.\n- [Changelog](https://github.com/basecamp/thruster/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/basecamp/thruster/compare/v0.1.16...v0.1.17)\n\n---\nupdated-dependencies:\n- dependency-name: thruster\n dependency-version: 0.1.17\n dependency-type: direct:production\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"sha": "35b9e1849f21edf6b51586c8edcc720f736aa470",
"date": "2026-01-25T11:00:01Z"
},
{
"message": "Bump debug from 1.11.0 to 1.11.1 (#17)\n\nBumps [debug](https://github.com/ruby/debug) from 1.11.0 to 1.11.1.\n- [Release notes](https://github.com/ruby/debug/releases)\n- [Commits](https://github.com/ruby/debug/compare/v1.11.0...v1.11.1)\n\n---\nupdated-dependencies:\n- dependency-name: debug\n dependency-version: 1.11.1\n dependency-type: direct:development\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"sha": "4e7f68369da7b7b60bd1902ce9f59ef9a77246e5",
"date": "2026-01-25T10:58:10Z"
},
{
"message": "Bump bootsnap from 1.19.0 to 1.20.1 (#20)\n\nBumps [bootsnap](https://github.com/rails/bootsnap) from 1.19.0 to 1.20.1.\n- [Release notes](https://github.com/rails/bootsnap/releases)\n- [Changelog](https://github.com/rails/bootsnap/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/rails/bootsnap/compare/v1.19.0...v1.20.1)\n\n---\nupdated-dependencies:\n- dependency-name: bootsnap\n dependency-version: 1.20.1\n dependency-type: direct:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"sha": "7ed8e488649dd331a6b1ec6d28513de81d8978c5",
"date": "2026-01-25T10:53:44Z"
},
{
"message": "Bump pg from 1.6.2 to 1.6.3 (#22)\n\nBumps [pg](https://github.com/ged/ruby-pg) from 1.6.2 to 1.6.3.\n- [Changelog](https://github.com/ged/ruby-pg/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/ged/ruby-pg/compare/v1.6.2...v1.6.3)\n\n---\nupdated-dependencies:\n- dependency-name: pg\n dependency-version: 1.6.3\n dependency-type: direct:production\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"sha": "7f32b60771a3e79eb8d8fbee0113b89c96055072",
"date": "2026-01-25T10:52:57Z"
},
{
"message": "Bump bcrypt from 3.1.20 to 3.1.21 (#23)\n\nBumps [bcrypt](https://github.com/bcrypt-ruby/bcrypt-ruby) from 3.1.20 to 3.1.21.\n- [Release notes](https://github.com/bcrypt-ruby/bcrypt-ruby/releases)\n- [Changelog](https://github.com/bcrypt-ruby/bcrypt-ruby/blob/master/CHANGELOG)\n- [Commits](https://github.com/bcrypt-ruby/bcrypt-ruby/compare/v3.1.20...v3.1.21)\n\n---\nupdated-dependencies:\n- dependency-name: bcrypt\n dependency-version: 3.1.21\n dependency-type: direct:production\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"sha": "7b18f67e57a8501f9768b47b78bb2e163557304b",
"date": "2026-01-25T10:51:52Z"
},
{
"message": "Bump aws-sdk-s3 from 1.206.0 to 1.210.1 (#25)\n\nBumps [aws-sdk-s3](https://github.com/aws/aws-sdk-ruby) from 1.206.0 to 1.210.1.\n- [Release notes](https://github.com/aws/aws-sdk-ruby/releases)\n- [Changelog](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/CHANGELOG.md)\n- [Commits](https://github.com/aws/aws-sdk-ruby/commits)\n\n---\nupdated-dependencies:\n- dependency-name: aws-sdk-s3\n dependency-version: 1.210.1\n dependency-type: direct:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"sha": "b495cc2ef97144d407ee1f38b639319d479a35ae",
"date": "2026-01-25T10:49:54Z"
},
{
"message": "Bump importmap-rails from 2.2.2 to 2.2.3 (#26)\n\nBumps [importmap-rails](https://github.com/rails/importmap-rails) from 2.2.2 to 2.2.3.\n- [Release notes](https://github.com/rails/importmap-rails/releases)\n- [Commits](https://github.com/rails/importmap-rails/compare/v2.2.2...v2.2.3)\n\n---\nupdated-dependencies:\n- dependency-name: importmap-rails\n dependency-version: 2.2.3\n dependency-type: direct:production\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"sha": "e24339d8d6cb724f5d384824f94d9f5902b414d0",
"date": "2026-01-25T10:48:53Z"
},
{
"message": "\ud83d\udd0c Add JSON API support to uploads endpoint\n\nEnable native apps to upload images via API with JSON responses.\n- Add respond_to blocks for HTML and JSON formats\n- Accept params at root level (API) or nested under :photo (forms)\n- Return photo details including short_url on success\n- Return errors array on failure\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "12bea29fb916b82a79a215ee7898f36973827118",
"date": "2026-01-25T10:38:54Z"
},
{
"message": "\ud83d\udd13 Add CORS support for native app uploads\n\nConfigure rack-cors gem to allow cross-origin requests to the upload\nendpoint from native macOS and iOS apps.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "bdefc6009b82fd37fee6b2b83390a9ec466ad571",
"date": "2026-01-25T10:38:54Z"
},
{
"message": "\ud83d\udce4 Add macOS upload script and droplet app\n\nShell-based solution for uploading images to Jotter:\n- jotter-upload: CLI tool with clipboard and notification support\n- Jotter Upload.app: Dock droplet for drag-and-drop uploads\n- Config file support (~/.jotter-config)\n\nNo Xcode required - works with standard macOS tools.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "2200943eae7ec700b2c9dd691da9f61900be3928",
"date": "2026-01-25T10:38:54Z"
},
{
"message": "\ud83d\ude48 Ignore native-apps experiment directory\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "ffd86785643cd6116164379945366f9b9d9ad71a",
"date": "2026-01-25T10:38:54Z"
},
{
"message": "\ud83d\udd0c Add base64 image upload support for iOS Shortcuts\n\niOS Shortcuts can't easily do multipart form uploads, so add support\nfor base64-encoded images in JSON body. Includes magic byte detection\nfor content type when not specified.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "87f111ac0bbf427906f8144179f94fae92bcfd2a",
"date": "2026-01-25T10:38:54Z"
},
{
"message": "\ud83d\udcf1 Add iOS Shortcut setup guide\n\nStep-by-step instructions for creating an iOS Shortcut that uploads\nimages to Jotter via the share sheet using base64-encoded JSON.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "08f2cb8f2987842e644ab405cc9c05b0c3144fb8",
"date": "2026-01-25T10:38:54Z"
},
{
"message": "\u2b06\ufe0f Upgrade brakeman to 7.1.2",
"sha": "c1580be1d138ab9d5eb411b58c7234604c0b1983",
"date": "2026-01-25T10:38:54Z"
},
{
"message": "\u2b06\ufe0f Upgrade brakeman to 7.1.2",
"sha": "c1580be1d138ab9d5eb411b58c7234604c0b1983",
"date": "2026-01-25T10:34:48Z"
},
{
"message": "\ud83d\udc1b Fix album edit form using non-existent nested route",
"sha": "1a6d1ababee2e580a2f70da206f6425fbdf83933",
"date": "2026-01-25T10:11:35Z"
}
],
"lastDate": "2026-01-26T00:00:48Z"
},
{
"shortName": "thoughts",
"fullName": "swmcc/thoughts",
"commits": [
{
"message": "\u2728 Add CLI script for posting thoughts\n\n- Bash script with tag support (-t flag)\n- Config stored in ~/.config/thoughts/config\n- Supports piped input and direct arguments\n- Validates 140 character limit\n- Color-coded output\n- Init command for easy setup",
"sha": "807a3ba3175a05aa621cae4372503ee29c5bc883",
"date": "2026-01-25T19:00:41Z"
},
{
"message": "\ud83d\udcda Add CLI documentation\n\n- Installation instructions\n- Usage examples with tags\n- Configuration guide\n- Shell aliases and integrations",
"sha": "bcf607d825eeea4eb33e2ac90c41da33a8d79e8b",
"date": "2026-01-25T19:00:41Z"
},
{
"message": "\ud83d\udc1b Detect thought-cli User-Agent as CLI source\n\nAdd thought-cli to the CLI client detection pattern so thoughts\nposted via the CLI script are correctly identified as source=cli",
"sha": "e1c9cc483a73db3580c62ba03873e887e1332b75",
"date": "2026-01-25T19:00:41Z"
},
{
"message": "\ud83d\udcda Add CLI usage section to README",
"sha": "b85f5874a5b26944c06d3b6764c5e567aecadd81",
"date": "2026-01-25T19:00:41Z"
},
{
"message": "\u2728 Add source column to thoughts table\n\nTrack where thoughts are created from (web, cli, iphone).\nDefaults to 'web' for existing and new records.",
"sha": "7a96ae590639dcb4f9e29709a3f6746028bd801a",
"date": "2026-01-25T18:50:38Z"
},
{
"message": "\u2728 Add source detection logic and model validation\n\n- Add SourceDetectable concern to detect request origin from User-Agent\n- Detects iPhone/iPad Safari, CLI tools (curl, httpie, etc.), and web browsers\n- Add SOURCES constant and validation to Thought model\n- Add source_label helper for human-readable display",
"sha": "5d91a88b46b68c5e082ab0ef1e76f5867a21a505",
"date": "2026-01-25T18:50:38Z"
},
{
"message": "\u2728 Set source automatically when creating thoughts\n\n- Include SourceDetectable concern in admin and API controllers\n- Auto-detect source from User-Agent on thought creation\n- Include source in API JSON responses",
"sha": "3d67213f0fb3868332e90bcbfb5114e4dc63b778",
"date": "2026-01-25T18:50:38Z"
},
{
"message": "\u2728 Display source icon on thought card and detail page\n\n- Add source icon between username and timestamp\n- Use Heroicons (mini): computer-desktop, command-line, device-phone-mobile\n- Include hover tooltip showing \"Written from web/CLI/iPhone\"",
"sha": "e32c9b72de83de2f73f8f5c009694592cc00133e",
"date": "2026-01-25T18:50:38Z"
},
{
"message": "\u2705 Add tests for thought source tracking\n\n- Model tests for source validation and source_label helper\n- Concern tests for User-Agent detection logic\n- API request tests for source detection on thought creation",
"sha": "22dc5636bf730ba1fa69e95b8ff6eae8656443b8",
"date": "2026-01-25T18:50:38Z"
},
{
"message": "\ud83d\udc1b Fix source icon partial not receiving local variable\n\n- Use explicit partial: and locals: syntax for render\n- Replace case/when with if/elsif for better ERB compatibility",
"sha": "9e1d1dec23120ca15d33a9834a19758673c659f3",
"date": "2026-01-25T18:50:38Z"
},
{
"message": "\u2705 Add system tests for source icon display\n\n- Test source icon with tooltip appears on timeline\n- Test all three source types (web, cli, iphone)\n- Test source icon on individual thought page",
"sha": "e3b1a9b9ff6d8dd62f9b824dddc8a9232cf90da4",
"date": "2026-01-25T18:50:38Z"
},
{
"message": "\ud83d\udc1b Fix tooltip using SVG title element for cross-browser support\n\n- Move tooltip text from span title attribute to SVG title element\n- SVG title element is the standard way to provide tooltips for SVG icons\n- Works consistently across Chrome, Firefox, Safari\n- Update system tests to verify correct SVG paths and title elements",
"sha": "12592789dc17f602e7759a6283a592fedcd71d41",
"date": "2026-01-25T18:50:38Z"
},
{
"message": "\ud83d\udc1b Fix tooltip by using HTML title attribute with pointer-events-none\n\n- SVG title element doesn't reliably show tooltips in browsers\n- Use HTML title attribute on parent span instead\n- Add pointer-events-none to SVG so hover events pass through to parent\n- Add inline-flex to span for proper sizing",
"sha": "62e179d6ae3abe0f86aa2437f9470ac4e1a12d26",
"date": "2026-01-25T18:50:38Z"
},
{
"message": "\u2728 Add posted time editing and icon buttons in admin\n\n- Add datetime picker to edit created_at in thought form\n- Replace Edit/Delete text with pencil and trash icons\n- Permit created_at in controller strong params\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "4c0d6f9c770d5118aaa95746fd49d1b5362fddbe",
"date": "2026-01-24T03:32:53Z"
},
{
"message": "\ud83d\udc1b Store original URL for images instead of expiring S3 presigned URLs\n\nS3 presigned URLs expire (X-Amz-Expires=300 = 5 min), so storing them\nas link_image causes images to break after expiry. Now we store the\noriginal shortlink URL and let the browser follow redirects.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "d0a5ca8b9f89b368d11567baeb5a6a4ef275c939",
"date": "2026-01-24T03:12:45Z"
},
{
"message": "\ud83d\udc1b Fix link preview to detect S3 redirect URLs as images\n\n- Add follow_redirects method to resolve shortlink URLs (e.g., j.swm.cc)\n- Update image_url? to detect S3 URLs with content-type in query params\n- Check for response-content-type=image in URL query string\n- Check for filename with image extension in query params\n- Direct image links now show preview without OG fetch\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "78a4ec8fe0d739245b9d2f7e32b1ce6aeb67f262",
"date": "2026-01-24T02:26:27Z"
},
{
"message": "\ud83d\udc1b Make link preview callback defensive for missing columns\n\nSkip link preview fetching if the columns don't exist yet\n(e.g., migration hasn't run on production).\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "c3794d3ff8edbdad4107bc0401e26979be005fc3",
"date": "2026-01-24T02:19:38Z"
},
{
"message": "\u2728 Add link preview unfurling for URLs in thoughts\n\nWhen a thought contains a URL, automatically fetch Open Graph data\nand display a rich preview card with:\n- Thumbnail image\n- Title\n- Description\n- Domain name\n\nUses open_graph_reader gem to fetch OG metadata on save.\nPreview data is cached in the database.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "e564934f2096580e0cf20848c3f28b68da88e5f3",
"date": "2026-01-24T02:17:37Z"
},
{
"message": "\ud83d\udd17 Add Open Graph meta tags for link previews\n\nWhen sharing a thought link on social media, iMessage, Slack etc.,\nit will now show a preview with:\n- Thought content as title/description\n- Profile image as thumbnail\n- Site name\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "25517da0d9ccd2d5f03df0133d0b6a25a5fe9342",
"date": "2026-01-24T02:14:19Z"
},
{
"message": "\ud83d\udcf1 Add PWA support for admin interface\n\n- Add manifest.json for \"Add to Home Screen\" on iOS\n- Add Apple-specific meta tags for standalone app mode\n- Uses existing icon.png\n\nTo install: Open /admin on iPhone Safari, tap Share > Add to Home Screen\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "6bce22076699b5cd3ad57dba7dd50fb061e23546",
"date": "2026-01-24T02:04:35Z"
},
{
"message": "\ud83d\udd27 Remove Solid gems for simpler Hatchbox deployment\n\n- Comment out solid_cache, solid_queue, solid_cable from Gemfile\n- Use memory_store for caching instead of solid_cache\n- Use async adapter for Action Cable instead of solid_cable\n- Use async adapter for Active Job instead of solid_queue\n\nThese gems require separate databases which complicates Hatchbox\ndeployment. This simple app doesn't need them.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "9921a244ac077ee9561993796e6808c02cabbd66",
"date": "2026-01-24T01:48:19Z"
},
{
"message": "\ud83d\udd27 Simplify production database config for Hatchbox\n\nUse DATABASE_URL environment variable instead of multi-database\nsetup with separate cache/queue/cable databases.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "ec37eaab5507da94db3733283b8397f413d734fe",
"date": "2026-01-24T01:41:54Z"
},
{
"message": "\ud83e\udd16 - Rubocop fixes",
"sha": "6c05a170b29d20f2cf65ad86eee64f97a41da547",
"date": "2026-01-24T01:32:55Z"
}
],
"lastDate": "2026-01-25T19:00:41Z"
},
{
"shortName": "swmcc.github.io",
"fullName": "swmcc/swmcc.github.io",
"commits": [
{
"message": "\ud83d\udd24 Alphabetise \"What I am...\" dropdown menu items\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "1c88234d77b6b93342c70656fab558b1efd0b6e3",
"date": "2026-01-24T04:00:32Z"
},
{
"message": "\ud83d\udcad Add thoughts.swm.cc project page\n\nNew microblogging app replacing the markdown-based workflow that was\ntoo cumbersome on mobile. Rails 8 PWA with 140-character posts, tagging,\nand automatic OpenGraph generation.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "be8841a9539d17dcf642e99b4429a48066c466f5",
"date": "2026-01-24T04:00:32Z"
},
{
"message": "\ud83d\uddd1\ufe0f Remove thoughts functionality (now at thoughts.swm.cc)\n\n- Delete create-thought GitHub workflow\n- Delete thoughts content collection and pages\n- Delete quick-thought posting page\n- Remove thoughts from content config\n- Remove thoughts from RSS feed\n- Remove thoughts from terminal index\n\nThoughts are now hosted separately at thoughts.swm.cc\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "2daffceeb8a0a1251740ad1016053fd133b01bea",
"date": "2026-01-24T03:47:29Z"
},
{
"message": "\ud83d\udd17 Move Thoughts to \"What I am...\" dropdown as thinkin'\n\n- Remove Thoughts from main nav items\n- Add thinkin' link to \"What I am...\" dropdown (desktop + mobile)\n- Update footer to link to thoughts.swm.cc\n- Links to external thoughts.swm.cc domain\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "e970291740694ef7931a93b89fdcecab99dcf42e",
"date": "2026-01-24T03:45:53Z"
}
],
"lastDate": "2026-01-24T04:00:32Z"
},
{
"shortName": "whatisonthe.tv",
"fullName": "swmcc/whatisonthe.tv",
"commits": [
{
"message": "\u2728 Add make target to pull production database from Heroku\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"sha": "c980ec110f86f15b456331cd36f74d41cc04f734",
"date": "2026-01-22T23:09:38Z"
}
],
"lastDate": "2026-01-22T23:09:38Z"
}
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment