Skip to content

Instantly share code, notes, and snippets.

View ericclemmons's full-sized avatar
🏠
Working from home

Eric Clemmons ericclemmons

🏠
Working from home
View GitHub Profile
@ericclemmons
ericclemmons / .claude-commands-today.md
Created January 8, 2026 23:30
`/today` in Raycast to kick off `today` skill
description allowed-tools
Sync Twitter bookmarks to Obsidian vault with metadata and embedded media
Bash(bird:*), Read, Write, Edit, Glob, Grep, AskUserQuestion, WebFetch

Sync Twitter Bookmarks

Fetches Twitter bookmarks using the Bird CLI and creates/updates notes in the Bookmarks/ folder with full metadata and embedded media.

Sources to Sync:

#!/usr/bin/env bash
set -euo pipefail
COMMIT_MSG_FILE="$1"
COMMIT_SOURCE="${2-}"
# Allow opting out for a single commit or CI.
if [ "${OPENCODE_COMMIT_MSG_DISABLE:-}" = "1" ]; then
exit 0
@ericclemmons
ericclemmons / WorkerProject.ts
Created October 15, 2025 15:20
Alchemy resource for Worker Builds
import { Resource, type Context } from "alchemy";
import { CloudflareApi, createCloudflareApi } from "alchemy/cloudflare";
const DEFAULT_BUILD_COMMAND = "";
const DEFAULT_PREVIEW_DEPLOY_COMMAND = "npx wrangler versions upload";
const DEFAULT_PRODUCTION_DEPLOY_COMMAND = "npx wrangler deploy";
const DEFAULT_ROOT_DIRECTORY = "/";
interface JsonResponse<T> {
success: boolean;
// https://alchemy.run/concepts/resource/
import alchemy, { Resource, type Context } from "alchemy";
import {
CloudflareApi,
createCloudflareApi,
type AiGatewayResource,
type R2BucketResource,
} from "alchemy/cloudflare";
{
"meta": { "theme": "even" },
"basics": {
"name": "Eric Clemmons",
"label": "Open-source author and technical leader",
"email": "eric@clemmons.family",
"phone": "(832) 414-7673",
"url": "https://ericclemmons.com",
"summary": "Open-source author and technical leader specializing in full-stack applications with ergonomic APIs. 17+ years of experience scaling engineering teams and delivering high-impact solutions that drive measurable business outcomes. Expert in navigating ambiguity for remote & hybrid teams by working backwards from user experience, with a proven track record of reducing costs while improving performance and developer productivity.",
"location": {
// @ts-check
/**
* Run `tsc` and pipe output to this script. All errors will write a `@ts-expect-error` comment into the source.
*
* Usage:
*
* tsc --noEmit --project ... | ./ts-expect-error.js
*
* Example (from the monorepo root):
@ericclemmons
ericclemmons / codegen.ts
Created April 22, 2024 04:41
graphql-codgen config for the best fully-typed, client-side GraphQL experience with TypeScript
import type {CodegenConfig} from '@graphql-codegen/cli';
const config: CodegenConfig = {
config: {
namingConvention: {
// Ensure enum values are the same as their name, not a number or camelCased
enumValues: 'keep',
},
},
schema: ['src/**/schema.graphql'],
# https://github.com/dependabot/fetch-metadata#enabling-auto-merge
name: Auto-merge Dependabot
on: pull_request_target
permissions:
pull-requests: write
contents: write
jobs:
@ericclemmons
ericclemmons / [[...slugs]].tsx
Created July 12, 2021 16:14
Non-FB-scale MDX with shared layout/nav
import Layout from "@/components/Layout";
import { getContentPaths } from "@/utils/getContentPaths";
import { getPageFromSlug } from "@/utils/getPageFromSlug";
import { GetStaticProps } from "next";
import dynamic from "next/dynamic";
import { renderToStaticMarkup } from "react-dom/server";
export default function ContentPage({ __html, frontmatter, pages, slug }) {
const Content = dynamic(() => import(`../content/${slug}/index.mdx`), {
loading() {
@ericclemmons
ericclemmons / machine.js
Last active March 13, 2020 01:47
Generated by XState Viz: https://xstate.js.org/viz
// This state machine is trying to figure out how to allow a user to call `await Auth.getUser()` multiple times throughout their app and get the current user once it resolves.
// Utility to resolve a Promise externally
const defer = () => {
let res,rej;
const promise = new Promise((resolve, reject) => {
res = resolve;
rej = reject;