{"url":"https://www.michaelchurley.com/blog","markdown":"https://www.michaelchurley.com/blog.md","count":249,"posts":[{"title":"One-line install","slug":"omadesign-0-5-8-one-line-install","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-one-line-install","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-one-line-install.md","date":"2026-09-23","description":"One command installs omadesign to ~/.local/bin and a desktop entry under your home directory. Nothing is written to /usr.","tags":["omadesign","0.5.8","install"]},{"title":"Portable ARM64 and x86_64","slug":"omadesign-0-5-8-portable-arm64-and-x86-64","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-portable-arm64-and-x86-64","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-portable-arm64-and-x86-64.md","date":"2026-09-23","description":"Omadesign 0.5.8 ships native ARM64 and x86_64 tarballs built for glibc 2.35. Same studio on Asahi, Ubuntu 22.04+, and current Arch.","tags":["omadesign","0.5.8","binaries"]},{"title":"First five minutes","slug":"omadesign-0-5-8-first-five-minutes","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-first-five-minutes","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-first-five-minutes.md","date":"2026-09-23","description":"Launch omadesign, pick a size or one of the 52 templates, then draw. Design starts on R, P, and T. Pixel paints with B. Photo grades a folder.","tags":["omadesign","0.5.8","welcome"]},{"title":"Welcome logo 0.5.8","slug":"omadesign-0-5-8-welcome-logo-0-5-8","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-welcome-logo-0-5-8","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-welcome-logo-0-5-8.md","date":"2026-09-23","description":"The 0.5.8 welcome screen uses the corrected transparent logo, 25% larger, on a dark ground. Panels fade from the lighter theme color into that chrome.","tags":["omadesign","0.5.8","welcome"]},{"title":"Welcome segmented buttons","slug":"omadesign-0-5-8-welcome-segmented-buttons","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-welcome-segmented-buttons","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-welcome-segmented-buttons.md","date":"2026-09-23","description":"0.5.8 welcome controls use gradient segments, Phosphor utility icons, and squarer rounded project folders. The screen is the studio's front door.","tags":["omadesign","0.5.8","welcome"]},{"title":"Persistent title bar","slug":"omadesign-0-5-8-persistent-title-bar","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-persistent-title-bar","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-persistent-title-bar.md","date":"2026-09-23","description":"0.5.8 keeps the title bar visible so open-document thumbnails stay put. The menu is the Omadesign wordmark, without a second Open or Preferences link.","tags":["omadesign","0.5.8","chrome"]},{"title":"Filter icon states","slug":"omadesign-0-5-8-filter-icon-states","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-filter-icon-states","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-filter-icon-states.md","date":"2026-09-23","description":"The 0.5.8 welcome filter icon has no button background. Hover turns it blue. An active filter turns it red, so you can see the funnel is on.","tags":["omadesign","0.5.8","welcome"]},{"title":"Template chooser width","slug":"omadesign-0-5-8-template-chooser-width","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-template-chooser-width","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-template-chooser-width.md","date":"2026-09-23","description":"The 0.5.8 template chooser opens at its final width and stays there as the pointer moves in. The 52 starters do not jump under the cursor.","tags":["omadesign","0.5.8","templates"]},{"title":"Crash recovery swap","slug":"omadesign-0-5-8-crash-recovery-swap","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-crash-recovery-swap","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-crash-recovery-swap.md","date":"2026-09-23","description":"Idle a second and Omadesign writes ~/.local/share/omadesign/<id>.oma.swp. Save deletes it. The Recovered tab lists the leftovers. Recents lists files you opened.","tags":["omadesign","0.5.8","recovery"]},{"title":"Document tabs","slug":"omadesign-0-5-8-document-tabs","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-document-tabs","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-document-tabs.md","date":"2026-09-23","description":"Document tabs sit above the canvas. Ctrl+N starts a tab, Ctrl+O opens another, and a close on unsaved work asks Save, Discard, or Cancel.","tags":["omadesign","0.5.8","tabs"]},{"title":"Five personas one document","slug":"omadesign-0-5-8-five-personas-one-document","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-five-personas-one-document","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-five-personas-one-document.md","date":"2026-09-23","description":"Design, Layout, Pixel, Photo, and Motion share one Linux binary, one .oma, and one layer stack. You change the tool well, not the file.","tags":["omadesign","0.5.8","personas"]},{"title":"Design persona tools","slug":"omadesign-0-5-8-design-persona-tools","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-design-persona-tools","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-design-persona-tools.md","date":"2026-09-23","description":"Design is the mark, the poster, the layout. The first keys are Move V, Pen P, Rectangle R, and Type T, in the same .oma you will paint and animate.","tags":["omadesign","0.5.8","design"]},{"title":"Layout persona tools","slug":"omadesign-0-5-8-layout-persona-tools","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-layout-persona-tools","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-layout-persona-tools.md","date":"2026-09-23","description":"Layout builds screens in the same .oma as the drawing. Frame is F, rectangle is R, type is T. Export the selected frame as PNG, SVG, or HTML.","tags":["omadesign","0.5.8","layout"]},{"title":"Pixel persona tools","slug":"omadesign-0-5-8-pixel-persona-tools","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pixel-persona-tools","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pixel-persona-tools.md","date":"2026-09-23","description":"Pixel is for painting and retouching. Brush B, Eraser E, Clone J, and Wand W work on a pixel layer inside the same .oma as the vectors.","tags":["omadesign","0.5.8","pixel"]},{"title":"Photo persona tools","slug":"omadesign-0-5-8-photo-persona-tools","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-photo-persona-tools","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-photo-persona-tools.md","date":"2026-09-23","description":"Photo grades the capture with Crop C and the develop sliders, then Place in Design. Settings sit in a .omaphoto file. The camera original is never rewritten.","tags":["omadesign","0.5.8","photo"]},{"title":"Motion persona tools","slug":"omadesign-0-5-8-motion-persona-tools","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-motion-persona-tools","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-motion-persona-tools.md","date":"2026-09-23","description":"Motion animates the artboard you already drew. Space plays, K sets transform keys, and File exports Lottie or animated SVG. The rest pose stays the drawing.","tags":["omadesign","0.5.8","motion"]},{"title":"Shortcut HUD","slug":"omadesign-0-5-8-shortcut-hud","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-shortcut-hud","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-shortcut-hud.md","date":"2026-09-23","description":"The Shortcut HUD sits on the bottom edge. The upper row follows the tool. The lower row lists letter keys. Hold Ctrl, Shift, or Alt to see those commands. Ctrl+/ toggles it.","tags":["omadesign","0.5.8","shortcuts"]},{"title":"HUD modifiers while drawing","slug":"omadesign-0-5-8-hud-modifiers-while-drawing","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-hud-modifiers-while-drawing","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-hud-modifiers-while-drawing.md","date":"2026-09-23","description":"The Shortcut HUD keeps a constant height when modifiers change, so a drag does not jump. Hover + more for overflow. Hints never take the keyboard. F1 is the full list.","tags":["omadesign","0.5.8","shortcuts"]},{"title":"Omarchy theme chrome","slug":"omadesign-0-5-8-omarchy-theme-chrome","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-omarchy-theme-chrome","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-omarchy-theme-chrome.md","date":"2026-09-23","description":"Studio chrome follows Omarchy theme colors and the desktop font. Icons are Phosphor Light. Point OMADESIGN_FONT at a .ttf when you want a different UI face.","tags":["omadesign","0.5.8","theme"]},{"title":"Theme fallback chain","slug":"omadesign-0-5-8-theme-fallback-chain","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-theme-fallback-chain","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-theme-fallback-chain.md","date":"2026-09-23","description":"On launch, Omadesign reads the current Omarchy colors.toml, then the named theme file, then stock Catppuccin. The first file that is there wins.","tags":["omadesign","0.5.8","theme"]},{"title":"Move tool","slug":"omadesign-0-5-8-move-tool","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-move-tool","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-move-tool.md","date":"2026-09-23","description":"Move is V. Click selects, drag moves, eight handles scale, the top handle rotates. Shift adds or constrains. Alt-drag clones. Corner dots round a rectangle.","tags":["omadesign","0.5.8","vectors"]},{"title":"Layer reorder shortcuts","slug":"omadesign-0-5-8-layer-reorder-shortcuts","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-layer-reorder-shortcuts","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-layer-reorder-shortcuts.md","date":"2026-09-23","description":"Select a layer row, then Ctrl+[ or Ctrl+] to reorder it. Add Shift to send it to the back or front of its group. Each reorder is one undo.","tags":["omadesign","0.5.8","vectors"]},{"title":"Free transform","slug":"omadesign-0-5-8-free-transform","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-free-transform","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-free-transform.md","date":"2026-09-23","description":"Ctrl+T puts the selection into Move with scale and rotation handles ready. Live text stays live. Shape parameters stay editable. The command is also under Object.","tags":["omadesign","0.5.8","vectors"]},{"title":"Node tool","slug":"omadesign-0-5-8-node-tool","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-node-tool","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-node-tool.md","date":"2026-09-23","description":"Node is A. Drag points and Bézier handles, Shift-click to add, Alt-click to convert corner and smooth, Alt-drag to break symmetry, Delete to remove points.","tags":["omadesign","0.5.8","vectors"]},{"title":"Break path","slug":"omadesign-0-5-8-break-path","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-break-path","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-break-path.md","date":"2026-09-23","description":"Object → Break path turns a live shape into points that sit on the rotated artwork. The first node edit converts the same way. Selecting the path writes no undo.","tags":["omadesign","0.5.8","paths"]},{"title":"Flip horizontal vertical","slug":"omadesign-0-5-8-flip-horizontal-vertical","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-flip-horizontal-vertical","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-flip-horizontal-vertical.md","date":"2026-09-23","description":"Flip horizontal and Flip vertical mirror across the canvas axes you can see, rotation included. Undo restores the art. Live text needs Convert to path first.","tags":["omadesign","0.5.8","vectors"]},{"title":"Pen tool","slug":"omadesign-0-5-8-pen-tool","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pen-tool","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pen-tool.md","date":"2026-09-23","description":"Pen is P. Click for a corner, click-drag for a smooth point, and a twitch under 3px stays a corner. Shift holds 45°. Esc drops the last point, then cancels.","tags":["omadesign","0.5.8","pen"]},{"title":"Artboard tool","slug":"omadesign-0-5-8-artboard-tool","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-artboard-tool","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-artboard-tool.md","date":"2026-09-23","description":"Artboard is Shift+O. Draw a board, drag to move it, scale from the handles, rotate from the top handle. Alt-drag clones. Rename it in Transform.","tags":["omadesign","0.5.8","artboards"]},{"title":"Pencil freehand","slug":"omadesign-0-5-8-pencil-freehand","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pencil-freehand","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pencil-freehand.md","date":"2026-09-23","description":"Pencil is N. Drag a freehand curve on the same canvas as the pen. Hold Shift and the stroke locks to horizontal, vertical, or 45 degrees.","tags":["omadesign","0.5.8","drawing"]},{"title":"Shape tools","slug":"omadesign-0-5-8-shape-tools","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-shape-tools","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-shape-tools.md","date":"2026-09-23","description":"Rectangle R, ellipse O, polygon Y, star S, and line L drag on like any shape tool you already know. Shift constrains. Radius, sides, and inner radius stay in Transform until you edit nodes.","tags":["omadesign","0.5.8","shapes"]},{"title":"Corner radius multi-edit 0.5.8","slug":"omadesign-0-5-8-corner-radius-multi-edit-0-5-8","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-corner-radius-multi-edit-0-5-8","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-corner-radius-multi-edit-0-5-8.md","date":"2026-09-23","description":"In 0.5.8, Alt-drag a corner-radius handle with the Node tool and every corner on the path changes. Shift-select a set of corners, then drag one selected handle, and that set moves together.","tags":["omadesign","0.5.8","corners"]},{"title":"Type tool","slug":"omadesign-0-5-8-type-tool","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-type-tool","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-type-tool.md","date":"2026-09-23","description":"Type is T. Click, and the first keystroke replaces the word Type. Enter starts a new line. Esc or a click away finishes. Double-click comes back to edit.","tags":["omadesign","0.5.8","type"]},{"title":"OpenType character studio","slug":"omadesign-0-5-8-opentype-character-studio","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-opentype-character-studio","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-opentype-character-studio.md","date":"2026-09-23","description":"Character studio sets kerning, ligatures, tabular figures, and small caps on the text you already have. Project fonts from Brand → Typography show up in the font picker without a system install.","tags":["omadesign","0.5.8","type"]},{"title":"Gradient eyedropper","slug":"omadesign-0-5-8-gradient-eyedropper","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-gradient-eyedropper","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-gradient-eyedropper.md","date":"2026-09-23","description":"Gradient is G. Drag across a selected shape and the active fill or stroke keeps its stops. Eyedropper is I and samples the fill. X swaps fill and stroke. D restores defaults.","tags":["omadesign","0.5.8","color"]},{"title":"Trace raster to vector","slug":"omadesign-0-5-8-trace-raster-to-vector","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-trace-raster-to-vector","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-trace-raster-to-vector.md","date":"2026-09-23","description":"Trace is U. It turns the active pixel layer into vectors, with threshold, color count, and smoothness in the Trace studio. Object → Trace to vector runs the same command without switching tools.","tags":["omadesign","0.5.8","trace"]},{"title":"Zoom and hand","slug":"omadesign-0-5-8-zoom-and-hand","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-zoom-and-hand","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-zoom-and-hand.md","date":"2026-09-23","description":"Zoom is Z. Drag a box, click to zoom in, Alt-click to zoom out. Ctrl-click fits the artboard. Hand is H, and Space pans. Scroll zooms the canvas, not the panels.","tags":["omadesign","0.5.8","canvas"]},{"title":"Select same properties","slug":"omadesign-0-5-8-select-same-properties","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-select-same-properties","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-select-same-properties.md","date":"2026-09-23","description":"Select gathers All, None, Invert, Same Fill, Same Stroke, Same Effects, and objects with or without those properties. A match is the whole property. Hidden and locked objects stay out.","tags":["omadesign","0.5.8","selection"]},{"title":"Compound paths 0.5.8","slug":"omadesign-0-5-8-compound-paths-0-5-8","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-compound-paths-0-5-8","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-compound-paths-0-5-8.md","date":"2026-09-23","description":"In 0.5.8, repeated unions and subtractions stay editable compound paths. Holes stay holes. Double-click with Move or Node and you can move points, pull handles, insert, delete, and break a contour.","tags":["omadesign","0.5.8","paths"]},{"title":"Pathfinder ops","slug":"omadesign-0-5-8-pathfinder-ops","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pathfinder-ops","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pathfinder-ops.md","date":"2026-09-23","description":"Object → Pathfinder runs Union, Subtract, Intersect, XOR, and Divide on two or more vectors on the same layer. Stacking order matters. Each operation is one undo. Holes survive Divide.","tags":["omadesign","0.5.8","pathfinder"]},{"title":"Combine and release","slug":"omadesign-0-5-8-combine-and-release","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-combine-and-release","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-combine-and-release.md","date":"2026-09-23","description":"Group is Ctrl+G. Ungroup is Ctrl+Shift+G, and it does not fuse paths. Combine into a compound is Ctrl+8. Release compound is Ctrl+Shift+8. Artwork and guides do not mix in one combine.","tags":["omadesign","0.5.8","compounds"]},{"title":"Expand stroke","slug":"omadesign-0-5-8-expand-stroke","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-expand-stroke","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-expand-stroke.md","date":"2026-09-23","description":"Object → Expand stroke to outline turns the visible stroke into filled geometry, including caps, joins, and dashes. The fill you already had stays beneath. Compound outlines keep their holes.","tags":["omadesign","0.5.8","strokes"]},{"title":"Reshape distort skew","slug":"omadesign-0-5-8-reshape-distort-skew","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-reshape-distort-skew","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-reshape-distort-skew.md","date":"2026-09-23","description":"Object → Reshape opens Distort, Skew, Perspective, or a nine-handle Warp mesh. Shift constrains. Ctrl reverses snapping. Enter finishes. The first handle you move converts live text and parameter shapes to paths.","tags":["omadesign","0.5.8","reshape"]},{"title":"SVG FX stack","slug":"omadesign-0-5-8-svg-fx-stack","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-svg-fx-stack","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-svg-fx-stack.md","date":"2026-09-23","description":"The FX studio stacks SVG filters on the selection, then on the layer underneath. Blur, shadow, offset, color, turbulence, displacement. The parameters are the SVG parameters.","tags":["omadesign","0.5.8","effects"]},{"title":"FX export to SVG","slug":"omadesign-0-5-8-fx-export-to-svg","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-fx-export-to-svg","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-fx-export-to-svg.md","date":"2026-09-23","description":"FX parameters are the SVG parameters. The canvas shows them rasterized. SVG export writes a filter element and the fe primitives, so the graph you built is the graph you share.","tags":["omadesign","0.5.8","svg"]},{"title":"Layers eye lock","slug":"omadesign-0-5-8-layers-eye-lock","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-layers-eye-lock","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-layers-eye-lock.md","date":"2026-09-23","description":"Layers expand to the objects on them. The eye and the lock work per object. Click a name to select it on the canvas. A group expands, renames, hides, locks, and reorders as one unit.","tags":["omadesign","0.5.8","layers"]},{"title":"Pass through blending","slug":"omadesign-0-5-8-pass-through-blending","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pass-through-blending","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pass-through-blending.md","date":"2026-09-23","description":"Pass through lets child blend modes reach the backdrop outside an explicit group. Turn it off and the group isolates. Regular layers and Layout frames isolate on their own.","tags":["omadesign","0.5.8","blending"]},{"title":"Ruler guides","slug":"omadesign-0-5-8-ruler-guides","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-ruler-guides","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-ruler-guides.md","date":"2026-09-23","description":"Drag a horizontal guide from the top ruler and a vertical guide from the left. Delete, drag off the canvas, or use the context menu to remove one. Ctrl+; shows or hides ruler and object guides.","tags":["omadesign","0.5.8","guides"]},{"title":"Convert selection to guides","slug":"omadesign-0-5-8-convert-selection-to-guides","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-convert-selection-to-guides","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-convert-selection-to-guides.md","date":"2026-09-23","description":"Object → Guides → Convert selection to guides turns vectors into non-printing contours you can still edit. Curves, compounds, shapes, and live text keep their data. Release guides restores the artwork.","tags":["omadesign","0.5.8","guides"]},{"title":"Guides survive save","slug":"omadesign-0-5-8-guides-survive-save","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-guides-survive-save","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-guides-survive-save.md","date":"2026-09-23","description":"Guides stay in the .oma when you save, and they stay out of PNG, JPEG, SVG, and Lottie. A placed photo keeps its pixels.","tags":["omadesign","0.5.8","guides"]},{"title":"Lock unlock guides 0.5.8","slug":"omadesign-0-5-8-lock-unlock-guides-0-5-8","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-lock-unlock-guides-0-5-8","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-lock-unlock-guides-0-5-8.md","date":"2026-09-23","description":"0.5.8 puts Lock all guides and Unlock all guides on View → Guides as two commands. Guides start locked so type work does not nudge a rail.","tags":["omadesign","0.5.8","guides"]},{"title":"Ruler zero and units","slug":"omadesign-0-5-8-ruler-zero-and-units","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-ruler-zero-and-units","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-ruler-zero-and-units.md","date":"2026-09-23","description":"Drag the ruler corner to set zero. Double-click resets it. px, mm, cm, in, and pt follow document DPI and leave the artwork in pixels.","tags":["omadesign","0.5.8","rulers"]},{"title":"Snapping system","slug":"omadesign-0-5-8-snapping-system","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-snapping-system","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-snapping-system.md","date":"2026-09-23","description":"Snap to edges, centers, guides, the grid, and equal gaps. Ctrl+Shift+; toggles. Hold Ctrl during a drag to reverse that choice, then let go.","tags":["omadesign","0.5.8","snapping"]},{"title":"Shift constrain Alt clone","slug":"omadesign-0-5-8-shift-constrain-alt-clone","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-shift-constrain-alt-clone","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-shift-constrain-alt-clone.md","date":"2026-09-23","description":"Shift locks pen, brush, and moves to horizontal, vertical, or 45 degrees. Alt-drag clones. On a brush, Shift anchors at the last free point.","tags":["omadesign","0.5.8","modifiers"]},{"title":"Frames nest","slug":"omadesign-0-5-8-frames-nest","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-frames-nest","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-frames-nest.md","date":"2026-09-23","description":"Press F and drag a frame. Draw another inside it and it nests. Wrap a selection, or drop an image fill, in the same .oma as the drawing.","tags":["omadesign","0.5.8","layout"]},{"title":"Auto-layout stack","slug":"omadesign-0-5-8-auto-layout-stack","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-auto-layout-stack","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-auto-layout-stack.md","date":"2026-09-23","description":"Select a frame and turn on Stack children. The inspector checkbox reads Arrange children automatically. Direction, gap, padding, and layer order do the packing.","tags":["omadesign","0.5.8","layout"]},{"title":"Frame constraints","slug":"omadesign-0-5-8-frame-constraints","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-frame-constraints","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-frame-constraints.md","date":"2026-09-23","description":"A child of a frame pins with Min, Max, Stretch, Center, or Scale. The pins are stored on the object in the .oma and run when you resize the parent.","tags":["omadesign","0.5.8","layout"]},{"title":"Export frame","slug":"omadesign-0-5-8-export-frame","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-export-frame","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-export-frame.md","date":"2026-09-23","description":"File → Export frame PNG, SVG, or HTML writes the selected frame and its children. The rest of the artboard stays in the .oma.","tags":["omadesign","0.5.8","layout"]},{"title":"Layout templates","slug":"omadesign-0-5-8-layout-templates","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-layout-templates","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-layout-templates.md","date":"2026-09-23","description":"Layout starters are five frame documents: Fieldwork, mobile screen, landing hero, dashboard, and card stack. They sit beside the 52 vector templates. They are not five of those 52.","tags":["omadesign","0.5.8","templates"]},{"title":"Canvas comments","slug":"omadesign-0-5-8-canvas-comments","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-canvas-comments","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-canvas-comments.md","date":"2026-09-23","description":"Write a note, pin it on the canvas, and resolve it. The pin is stored in the .oma. The inspector shows how many are still open on the frame.","tags":["omadesign","0.5.8","layout"]},{"title":"Pixel layer","slug":"omadesign-0-5-8-pixel-layer","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pixel-layer","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pixel-layer.md","date":"2026-09-23","description":"Paint lives on a pixel layer in the same stack as the vectors. If the document is vector-only, add one from the Layers menu. The paths stay paths.","tags":["omadesign","0.5.8","pixel"]},{"title":"Brush eraser fill","slug":"omadesign-0-5-8-brush-eraser-fill","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-brush-eraser-fill","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-brush-eraser-fill.md","date":"2026-09-23","description":"Brush is B. Size is the bracket keys. Hardness is Shift plus the brackets. Eraser E, Fill K, Clone J, Smudge M. Alt-click sets the clone source.","tags":["omadesign","0.5.8","pixel"]},{"title":"Healing brush","slug":"omadesign-0-5-8-healing-brush","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-healing-brush","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-healing-brush.md","date":"2026-09-23","description":"Shift+J. Alt-click clean texture, then paint the blemish. The dab blends that texture into the local color. The source stays fixed for the stroke. Undo restores the whole stroke.","tags":["omadesign","0.5.8","pixel"]},{"title":"Selections pixel","slug":"omadesign-0-5-8-selections-pixel","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-selections-pixel","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-selections-pixel.md","date":"2026-09-23","description":"Marquee is Shift+M, elliptical marquee is Shift+O, lasso is Q, wand is W. Tolerance sits in Brush. Ants stay until Esc. Paint stays inside the selection.","tags":["omadesign","0.5.8","pixel"]},{"title":"Layer masks","slug":"omadesign-0-5-8-layer-masks","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-layer-masks","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-layer-masks.md","date":"2026-09-23","description":"Add a layer mask from the layer menu or the Pixel inspector. Reveal all, hide all, or start from the selection. Black hides. White reveals. The pixels stay put.","tags":["omadesign","0.5.8","masks"]},{"title":"Mask invert apply","slug":"omadesign-0-5-8-mask-invert-apply","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-mask-invert-apply","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-mask-invert-apply.md","date":"2026-09-23","description":"Invert flips coverage. Remove puts the original layer back. Apply to pixels bakes a raster and one undo restores both the pixels and the mask. Placed-image masks follow the transform.","tags":["omadesign","0.5.8","masks"]},{"title":"Open photos folder","slug":"omadesign-0-5-8-open-photos-folder","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-open-photos-folder","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-open-photos-folder.md","date":"2026-09-23","description":"Open a photo, browse a folder, drop files, or load samples. The library shows camera metadata when the file has it. Imports run in the background while you grade.","tags":["omadesign","0.5.8","photo"]},{"title":"Camera RAW decoder","slug":"omadesign-0-5-8-camera-raw-decoder","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-camera-raw-decoder","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-camera-raw-decoder.md","date":"2026-09-23","description":"LibRaw 0.22.2 is in the binary. DNG, CR2, CR3, NEF, ARW, RAF, ORF, RW2, and the rest of the recognized families decode to 16-bit linear sRGB. No converter download. The camera file stays put.","tags":["omadesign","0.5.8","raw"]},{"title":"Develop panel groups","slug":"omadesign-0-5-8-develop-panel-groups","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-develop-panel-groups","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-develop-panel-groups.md","date":"2026-09-23","description":"Develop is three groups: Light, Color, and Detail. Tone curve, color mixer, and color grading stay collapsed until you open them. Before is the default development. Auto light sets exposure from the preview.","tags":["omadesign","0.5.8","photo"]},{"title":"omaphoto sidecars","slug":"omadesign-0-5-8-omaphoto-sidecars","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-omaphoto-sidecars","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-omaphoto-sidecars.md","date":"2026-09-23","description":"Save settings writes photo.png.omaphoto beside the original. Open either file to resume. The pair is name, size, and modification time. The camera file is never rewritten.","tags":["omadesign","0.5.8","photo"]},{"title":"Photo undo history","slug":"omadesign-0-5-8-photo-undo-history","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-photo-undo-history","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-photo-undo-history.md","date":"2026-09-23","description":"Photo has its own Undo and Redo, on the selected photo. Quit asks Save all, Discard, or Cancel for unsaved photo settings before palettes and artwork, and it waits for the writes.","tags":["omadesign","0.5.8","photo"]},{"title":"Photo export bit depth","slug":"omadesign-0-5-8-photo-export-bit-depth","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-photo-export-bit-depth","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-photo-export-bit-depth.md","date":"2026-09-23","description":"Export JPEG, PNG, or TIFF in the background at full developed size, crop and rotation included. RAW PNG and TIFF keep 16-bit channels. Place in Design adds an 8-bit pixel layer and one undo.","tags":["omadesign","0.5.8","photo"]},{"title":"Tiled full-res preview","slug":"omadesign-0-5-8-tiled-full-res-preview","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-tiled-full-res-preview","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-tiled-full-res-preview.md","date":"2026-09-23","description":"The first view is a preview whose long edge is at most 1600 pixels. Zoom in and full-resolution tiles fill in from a background develop. The preview stays up until those tiles exist.","tags":["omadesign","0.5.8","photo"]},{"title":"Copy paste adjustments","slug":"omadesign-0-5-8-copy-paste-adjustments","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-copy-paste-adjustments","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-copy-paste-adjustments.md","date":"2026-09-23","description":"Copy a developed look with Ctrl+Shift+C and paste it onto a Library selection with Ctrl+Shift+V. Crop and rotation stay off unless you turn them on.","tags":["omadesign","0.5.8","photo"]},{"title":"Batch save settings","slug":"omadesign-0-5-8-batch-save-settings","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-batch-save-settings","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-batch-save-settings.md","date":"2026-09-23","description":"After a paste, Ctrl+S writes a .omaphoto sidecar for every selected photo. The batch is one Undo and one Redo. Categories travel on their own.","tags":["omadesign","0.5.8","photo"]},{"title":"omapreset library","slug":"omadesign-0-5-8-omapreset-library","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-omapreset-library","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-omapreset-library.md","date":"2026-09-23","description":"Save a named Photo look, filter the library, and move it as a .omapreset file. The preset keeps development values and categories, and a name clash keeps both.","tags":["omadesign","0.5.8","photo"]},{"title":"Whole folder apply","slug":"omadesign-0-5-8-whole-folder-apply","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-whole-folder-apply","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-whole-folder-apply.md","date":"2026-09-23","description":"Browse a folder, apply a copied look or a preset to the whole folder, and write one .omaphoto per photo in the background. Pixels stay untouched. Subfolders stay out.","tags":["omadesign","0.5.8","photo"]},{"title":"Folder job limits","slug":"omadesign-0-5-8-folder-job-limits","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-folder-job-limits","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-folder-job-limits.md","date":"2026-09-23","description":"A folder job stops at 10,000 photos and 32 MiB of settings history. Cancel leaves finished files undoable, and a sidecar edited outside the job is kept on Undo.","tags":["omadesign","0.5.8","photo"]},{"title":"Photo navigation","slug":"omadesign-0-5-8-photo-navigation","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-photo-navigation","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-photo-navigation.md","date":"2026-09-23","description":"In Photo, hold Space or use Hand to drag. Middle-drag and two-finger scroll pan. Pinch, Ctrl+scroll, and Alt+scroll zoom. Ctrl+0 fits. Ctrl+1 is 100%.","tags":["omadesign","0.5.8","photo"]},{"title":"Rest pose intact","slug":"omadesign-0-5-8-rest-pose-intact","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-rest-pose-intact","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-rest-pose-intact.md","date":"2026-09-23","description":"The artboard you drew is the rest pose. Motion keeps a clip of tracks in the .oma and does not rewrite that drawing. Still PNG, JPEG, and SVG export the rest pose.","tags":["omadesign","0.5.8","motion"]},{"title":"Motion presets","slug":"omadesign-0-5-8-motion-presets","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-motion-presets","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-motion-presets.md","date":"2026-09-23","description":"Select vectors and apply Draw stroke, Pop in, Slam, Shake, Fill up, the four Slides, Fly, Zoom, Buzz, or Fade in. Locked, hidden, and guide objects are skipped.","tags":["omadesign","0.5.8","motion"]},{"title":"Timing and energy","slug":"omadesign-0-5-8-timing-and-energy","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-timing-and-energy","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-timing-and-energy.md","date":"2026-09-23","description":"Duration sits above the motion presets. Timing & energy sets delay, stagger, intensity, and start-at-playhead. Each apply is its own Undo and only rewrites the channels it owns.","tags":["omadesign","0.5.8","motion"]},{"title":"Keyframe editing","slug":"omadesign-0-5-8-keyframe-editing","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-keyframe-editing","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-keyframe-editing.md","date":"2026-09-23","description":"Drag a shape to write keys at the playhead. The first key after zero also plants the rest pose at zero. K keys X, Y, rotation, and scale. Delete peels a key, then the animation, then the object.","tags":["omadesign","0.5.8","motion"]},{"title":"Playback controls","slug":"omadesign-0-5-8-playback-controls","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-playback-controls","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-playback-controls.md","date":"2026-09-23","description":"Space plays and pauses in Motion. Home and End jump the playhead. Loop is the repeat icon. Cycle ease on the key you selected. The preview stays in the persona.","tags":["omadesign","0.5.8","motion"]},{"title":"Export animated SVG","slug":"omadesign-0-5-8-export-animated-svg","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-export-animated-svg","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-export-animated-svg.md","date":"2026-09-23","description":"File → Export animated SVG… writes animated transforms and stroke and fill reveals, and it keeps masks and effects. Text is outlined in that file. The .oma text stays editable.","tags":["omadesign","0.5.8","motion"]},{"title":"Export Lottie","slug":"omadesign-0-5-8-export-lottie","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-export-lottie","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-export-lottie.md","date":"2026-09-23","description":"Export Lottie… writes a Bodymovin 5.x shape animation with trim paths and fill masks. Pixel layers, layer masks, and effects stop the export with a clear error. Use animated SVG for those.","tags":["omadesign","0.5.8","motion"]},{"title":"Import Lottie","slug":"omadesign-0-5-8-import-lottie","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-import-lottie","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-import-lottie.md","date":"2026-09-23","description":"Import Lottie… places a shape-layer Lottie on the timeline. The importer covers a basic shape subset. Keep the .oma for the full editable animation. Still exports remain the rest pose.","tags":["omadesign","0.5.8","motion"]},{"title":"Fifty-two templates","slug":"omadesign-0-5-8-fifty-two-templates","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-fifty-two-templates","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-fifty-two-templates.md","date":"2026-09-23","description":"Templates · 52 opens from the welcome screen or File → Template library. Search by name or idea, filter nine categories, and pick a built-in size or a custom width, height, and DPI.","tags":["omadesign","0.5.8","templates"]},{"title":"Templates offline editable","slug":"omadesign-0-5-8-templates-offline-editable","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-templates-offline-editable","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-templates-offline-editable.md","date":"2026-09-23","description":"A template opens as an unsaved document with editable paper, artwork, and copy. Your other tab stays put. Fonts are local. Portrait, square, and landscape layouts are distinct, and tiny sizes drop unreadable lines.","tags":["omadesign","0.5.8","templates"]},{"title":"Three right tabs","slug":"omadesign-0-5-8-three-right-tabs","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-three-right-tabs","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-three-right-tabs.md","date":"2026-09-23","description":"The right sidebar is three tabs. Inspect for the selected artwork, Palettes for reusable colors, and Brand for logos, images, fonts, and other assets.","tags":["omadesign","0.5.8","palettes"]},{"title":"Project library files","slug":"omadesign-0-5-8-project-library-files","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-project-library-files","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-project-library-files.md","date":"2026-09-23","description":"Project kits sit beside the work as .omacolors, .omatype, and .omabrand/. A saved document uses the nearest enclosing folder that has any of them, or starts beside the document.","tags":["omadesign","0.5.8","palettes"]},{"title":"Personal vs project palettes","slug":"omadesign-0-5-8-personal-vs-project-palettes","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-personal-vs-project-palettes","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-personal-vs-project-palettes.md","date":"2026-09-23","description":"Palettes are Personal across your work or Project in the current folder. Name a palette, filter it, add the current color, the selection, or a hex including #RRGGBBAA, then click a swatch onto Fill or Stroke.","tags":["omadesign","0.5.8","palettes"]},{"title":"Palette save export","slug":"omadesign-0-5-8-palette-save-export","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-palette-save-export","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-palette-save-export.md","date":"2026-09-23","description":"Palette Save is its own write, separate from the artwork. Load palettes… merges and suffixes name clashes. Export one palette or the whole collection. Duplicate and remove are there.","tags":["omadesign","0.5.8","palettes"]},{"title":"Palette conflict handling","slug":"omadesign-0-5-8-palette-conflict-handling","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-palette-conflict-handling","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-palette-conflict-handling.md","date":"2026-09-23","description":"Palette files refresh about every three seconds. Unsaved edits stay put and Save blocks if the file changed underneath. Export a copy or Reload saved colors. Quit asks before it leaves.","tags":["omadesign","0.5.8","palettes"]},{"title":"Brand bank load","slug":"omadesign-0-5-8-brand-bank-load","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-brand-bank-load","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-brand-bank-load.md","date":"2026-09-23","description":"Brand → Load bank… opens a project folder or its .omabrand directory. Create bank, name it, and Save. Add assets… copies files in. The originals stay where they were.","tags":["omadesign","0.5.8","brand"]},{"title":"Brand asset place","slug":"omadesign-0-5-8-brand-asset-place","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-brand-asset-place","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-brand-asset-place.md","date":"2026-09-23","description":"Filter brand tiles by name, path, or type. Thumbnails load in the background and refresh about every three seconds. Drag onto the canvas or double-click to center. Ctrl+Z undoes the place.","tags":["omadesign","0.5.8","brand"]},{"title":"Brand accepted formats","slug":"omadesign-0-5-8-brand-accepted-formats","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-brand-accepted-formats","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-brand-accepted-formats.md","date":"2026-09-23","description":"A brand bank takes PNG, JPEG, WebP, TIFF, BMP, GIF, SVG, and .oma. SVG uses the supported import subset. Save bank copy… clones the bank, its name, and its nested folders to another project.","tags":["omadesign","0.5.8","brand"]},{"title":"Brand typography kit","slug":"omadesign-0-5-8-brand-typography-kit","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-brand-typography-kit","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-brand-typography-kit.md","date":"2026-09-23","description":"Add fonts… copies TTF and OTF files into the project. Name the kit, save roles such as Heading and Body, and Apply them to text. The faces work inside Omadesign with no system install.","tags":["omadesign","0.5.8","typography"]},{"title":"Typography load save copy","slug":"omadesign-0-5-8-typography-load-save-copy","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-typography-load-save-copy","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-typography-load-save-copy.md","date":"2026-09-23","description":"Load kit… merges another .omatype and copies its fonts. Save copy… writes the kit and the faces into another project. Remove a role and the font file stays for artwork that already uses it.","tags":["omadesign","0.5.8","typography"]},{"title":"Project fonts travel","slug":"omadesign-0-5-8-project-fonts-travel","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-project-fonts-travel","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-project-fonts-travel.md","date":"2026-09-23","description":"Move the project and native .oma text stays editable, including new characters. Saving into another folder copies the faces that artwork uses. SVG export outlines project-font text. The .oma keeps the live text.","tags":["omadesign","0.5.8","typography"]},{"title":"Share project kit","slug":"omadesign-0-5-8-share-project-kit","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-share-project-kit","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-share-project-kit.md","date":"2026-09-23","description":"A project kit is .omacolors, .omatype, and the whole .omabrand folder beside the work. They are dotfiles. Show hidden files before you copy by hand. Fieldwork ships as a portable reference.","tags":["omadesign","0.5.8","project-kit"]},{"title":"Native oma format","slug":"omadesign-0-5-8-native-oma-format","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-native-oma-format","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-native-oma-format.md","date":"2026-09-23","description":"A .oma is JSON, PNG-packed rasters, and a motion clip in one file. Version 5 carries frames, auto-layout, constraints, and opt-in cloud metadata. Save imports as .oma to keep the editable document and the conversion notes.","tags":["omadesign","0.5.8","oma"]},{"title":"Open layered foreign docs","slug":"omadesign-0-5-8-open-layered-foreign-docs","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-open-layered-foreign-docs","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-open-layered-foreign-docs.md","date":"2026-09-23","description":"File → Open reads layered PSD, PSB, XCF, every PDF page, PDF-compatible AI, OpenRaster, SVG, and Affinity via the optional bridge. Each file opens in its own tab at its size. Save writes a .oma and leaves the source.","tags":["omadesign","0.5.8","import"]},{"title":"Place command","slug":"omadesign-0-5-8-place-command","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-place-command","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-place-command.md","date":"2026-09-23","description":"File → Place… is Ctrl+Shift+P. The artwork loads in the background, then you click or drag to place it. Nested layers and masks come along. Undo removes the placement in one step. Enter places at center. Esc cancels.","tags":["omadesign","0.5.8","place"]},{"title":"Drop to open or place","slug":"omadesign-0-5-8-drop-to-open-or-place","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-drop-to-open-or-place","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-drop-to-open-or-place.md","date":"2026-09-23","description":"Drop a layered document on the canvas or the welcome screen to open it. Ordinary images place. A .oma opens. Lottie imports. The status bar confirms copy, cut, and paste. Copy style is Ctrl+Alt+C. Paste style is Ctrl+Alt+V.","tags":["omadesign","0.5.8","place"]},{"title":"Conversion notes","slug":"omadesign-0-5-8-conversion-notes","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-conversion-notes","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-conversion-notes.md","date":"2026-09-23","description":"View → Document conversion notes lists what an import dropped or converted. The notes stay in the .oma. Affinity-only features, live Photoshop type, smart objects, effects, and private Illustrator data stay unrebuilt.","tags":["omadesign","0.5.8","import"]},{"title":"Export matrix","slug":"omadesign-0-5-8-export-matrix","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-export-matrix","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-export-matrix.md","date":"2026-09-23","description":"Export writes PNG at 1×, 2×, and 3×, plus JPEG, SVG, animated SVG, Lottie JSON, layered PSD and PSB, PDF, and OpenRaster. Layers a format cannot keep may become pixel layers, with notes. There is no native .af or .ai writer.","tags":["omadesign","0.5.8","export"]},{"title":"PSD PSB bridge","slug":"omadesign-0-5-8-psd-psb-bridge","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-psd-psb-bridge","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-psd-psb-bridge.md","date":"2026-09-23","description":"PSD and PSB open through a native layered reader and export as RGB 8-bit layers. Groups, names, masks, blends, and supported Normal color overlays can survive. Text and smart objects arrive as saved pixels.","tags":["omadesign","0.5.8","psd"]},{"title":"Affinity optional bridge","slug":"omadesign-0-5-8-affinity-optional-bridge","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-affinity-optional-bridge","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-affinity-optional-bridge.md","date":"2026-09-23","description":"Affinity files open through the optional converter from setup-affinity-import.sh. Vectors, text, pixels, groups, masks, and artboards can come across. Adjustments and history often do not. The app does not download the converter.","tags":["omadesign","0.5.8","affinity"]},{"title":"PDF AI import export","slug":"omadesign-0-5-8-pdf-ai-import-export","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pdf-ai-import-export","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-pdf-ai-import-export.md","date":"2026-09-23","description":"PDF pages open as artboards with paths, supported text, images, and optional-content layers. Export writes pages, vectors, and that layer metadata. An .ai contributes its PDF-compatible artwork. Private Illustrator data stays unrebuilt.","tags":["omadesign","0.5.8","pdf"]},{"title":"OpenRaster GIMP","slug":"omadesign-0-5-8-openraster-gimp","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-openraster-gimp","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-openraster-gimp.md","date":"2026-09-23","description":"OpenRaster imports and exports layers, stack.xml, a merged preview, and a thumbnail. GIMP .xcf opens in a native reader and does not write back. Text and effects arrive as pixels. Keep the .oma. Send ORA or PSD back.","tags":["omadesign","0.5.8","openraster"]},{"title":"Headless inspect convert","slug":"omadesign-0-5-8-headless-inspect-convert","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-headless-inspect-convert","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-headless-inspect-convert.md","date":"2026-09-23","description":"omadesign --inspect reports a PSD, Affinity file, XCF, NEF, or .omaphoto as JSON. --convert writes .oma, SVG, PNG, JPEG, PSD, PSB, PDF, or OpenRaster. The CLI uses the desktop readers. Converting a file onto itself is refused.","tags":["omadesign","0.5.8","cli"]},{"title":"RAW headless develop","slug":"omadesign-0-5-8-raw-headless-develop","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-raw-headless-develop","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-raw-headless-develop.md","date":"2026-09-23","description":"omadesign --convert photograph.dng --output photograph.tif develops a full-resolution 16-bit file through the Photo pipeline. JPEG is 8-bit. A matching .omaphoto is applied on its own. The camera file is never overwritten.","tags":["omadesign","0.5.8","raw"]},{"title":"Cloud opt-in","slug":"omadesign-0-5-8-cloud-opt-in","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-cloud-opt-in","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-cloud-opt-in.md","date":"2026-09-23","description":"Cloud stays off until you opt in. The .oma remains on disk. File → Sign in is the browser approval. Push project + review export is the upload. Unpublished work stays out of the gallery.","tags":["omadesign","0.5.8","cloud"]},{"title":"Sign in identity","slug":"omadesign-0-5-8-sign-in-identity","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-sign-in-identity","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-sign-in-identity.md","date":"2026-09-23","description":"File → Sign in… opens a browser device code. Approve only the code the desktop is showing. The site account holds the name and email. A name in a file does not, by itself, grant cloud access.","tags":["omadesign","0.5.8","cloud"]},{"title":"Enable sync invite","slug":"omadesign-0-5-8-enable-sync-invite","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-enable-sync-invite","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-enable-sync-invite.md","date":"2026-09-23","description":"Push project + review export uploads a versioned .oma and a flat PNG, then you save so the cloud link stays in the file. Owners invite a verified email as editor or reviewer. Other drafts on disk stay local.","tags":["omadesign","0.5.8","cloud"]},{"title":"Publish to showcase","slug":"omadesign-0-5-8-publish-to-showcase","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-publish-to-showcase","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-publish-to-showcase.md","date":"2026-09-23","description":"Publish selected export is a separate owner step. /showcase lists public flat images. /showcase/:id shows one. Source files, assets, and private review threads stay out. Unpublished and private ids stay off the gallery.","tags":["omadesign","0.5.8","showcase"]},{"title":"Collaborator project view","slug":"omadesign-0-5-8-collaborator-project-view","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-collaborator-project-view","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-collaborator-project-view.md","date":"2026-09-23","description":"/project/:id opens the signed-in workspace for that project. Pin, reply, and resolve on a flat export. Layout pins on the canvas stay with the frame. Without OMADESIGN_CLOUD_URL the desktop keeps ~/.local/share/omadesign/cloud-store.json.","tags":["omadesign","0.5.8","cloud"]},{"title":"Compete waitlist","slug":"omadesign-0-5-8-compete-waitlist","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-compete-waitlist","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-compete-waitlist.md","date":"2026-09-23","description":"/compete lists competitions, public entries, and withdrawal. A competition stays unpublished until it has a real brief and dates. Enter with a public showcase work. /account is identity. /api/cloud is the desktop transport.","tags":["omadesign","0.5.8","cloud"]},{"title":"Lua 5.4 embedded","slug":"omadesign-0-5-8-lua-5-4-embedded","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-lua-5-4-embedded","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-lua-5-4-embedded.md","date":"2026-09-23","description":"Omadesign 0.5.8 embeds Lua 5.4.9 and plugin API 1 inside the Linux packages. There is no separate runtime to install. An update leaves the plugins you already installed in place.","tags":["omadesign","0.5.8","plugins"]},{"title":"Manage plugins","slug":"omadesign-0-5-8-manage-plugins","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-manage-plugins","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-manage-plugins.md","date":"2026-09-23","description":"Plugins → Manage plugins installs a .lua file, a folder with main.lua, or an .omaplug bundle. Each plugin has an Enable checkbox. An update keeps a hidden backup of the previous folder. Reload after you edit.","tags":["omadesign","0.5.8","plugins"]},{"title":"Studio starter twelve","slug":"omadesign-0-5-8-studio-starter-twelve","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-studio-starter-twelve","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-studio-starter-twelve.md","date":"2026-09-23","description":"Studio starter ships twelve Lua actions on first install. A duotone, a shadow, an SVG icon, two brushes, a canvas tool, a pattern, a gradient, a palette, a batch nudge, and two behaviors that stay off until you opt in.","tags":["omadesign","0.5.8","plugins"]},{"title":"Plugin undo safety","slug":"omadesign-0-5-8-plugin-undo-safety","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-plugin-undo-safety","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-plugin-undo-safety.md","date":"2026-09-23","description":"A plugin runs off the UI thread. A finished document action is one Undo step. Errors, Cancel, and a document you edited mid-run leave the artwork untouched.","tags":["omadesign","0.5.8","undo"]},{"title":"Plugin categories","slug":"omadesign-0-5-8-plugin-categories","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-plugin-categories","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-plugin-categories.md","date":"2026-09-23","description":"Plugin actions declare a category. Filters, effects, icons, brushes, tools, behaviors, batch, patterns, gradients, and swatches each have a precondition, and the manager groups them that way.","tags":["omadesign","0.5.8","plugins"]},{"title":"Canvas tool plugins","slug":"omadesign-0-5-8-canvas-tool-plugins","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-canvas-tool-plugins","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-canvas-tool-plugins.md","date":"2026-09-23","description":"A tool plugin arms with Activate tool. The drag previews as a line. Editable artwork appears on release. Escape exits. Pixel filters and brush presets still need a raster layer.","tags":["omadesign","0.5.8","tools"]},{"title":"Opt-in behaviors","slug":"omadesign-0-5-8-opt-in-behaviors","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-opt-in-behaviors","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-opt-in-behaviors.md","date":"2026-09-23","description":"Document and selection behaviors ship off. One checkbox opts in, remembers the choice, and a behavior’s own output does not fire itself again.","tags":["omadesign","0.5.8","plugins"]},{"title":"Host API surface","slug":"omadesign-0-5-8-host-api-surface","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-host-api-surface","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-host-api-surface.md","date":"2026-09-23","description":"API 1 is a short list of oma calls. Shapes, fills, effects, brushes, palettes, SVG, pixels, and a status message. Each run gets a fresh Lua VM.","tags":["omadesign","0.5.8","plugins"]},{"title":"Plugin CLI batch","slug":"omadesign-0-5-8-plugin-cli-batch","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-plugin-cli-batch","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-plugin-cli-batch.md","date":"2026-09-23","description":"omadesign --plugin and --batch walk every immediate .oma in filename order, write new files, keep the inputs, and refuse a path that already exists.","tags":["omadesign","0.5.8","plugins"]},{"title":"Install list plugins CLI","slug":"omadesign-0-5-8-install-list-plugins-cli","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-install-list-plugins-cli","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-install-list-plugins-cli.md","date":"2026-09-23","description":"omadesign --install-plugin and --list-plugins run without a window. Brush, palette, and canvas tools still belong to the desktop. Document commands batch from the shell.","tags":["omadesign","0.5.8","plugins"]},{"title":"Plugin sandbox limits","slug":"omadesign-0-5-8-plugin-sandbox-limits","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-plugin-sandbox-limits","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-plugin-sandbox-limits.md","date":"2026-09-23","description":"A plugin cannot run programs, open the network, or read arbitrary files. The caps are 15 seconds, 64 MiB of Lua heap, and 20,000 edits. This release has no plugin marketplace.","tags":["omadesign","0.5.8","plugins"]},{"title":"Starter source path","slug":"omadesign-0-5-8-starter-source-path","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-starter-source-path","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-starter-source-path.md","date":"2026-09-23","description":"After install, the clean Studio starter tree is at ~/.local/share/omadesign/plugin-examples/studio-starter. Fork the repo, add a folder under plugins/, and open a pull request with the proof.","tags":["omadesign","0.5.8","plugins"]},{"title":"Adobe familiar tool keys","slug":"omadesign-0-5-8-adobe-familiar-tool-keys","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-adobe-familiar-tool-keys","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-adobe-familiar-tool-keys.md","date":"2026-09-23","description":"The tool letters are V A P N R O Y S L T G I U B E K J, Shift+J, M C W H Z. F1 opens the full list. The HUD at the bottom follows the tool you are holding.","tags":["omadesign","0.5.8","shortcuts"]},{"title":"File and edit keys","slug":"omadesign-0-5-8-file-and-edit-keys","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-file-and-edit-keys","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-file-and-edit-keys.md","date":"2026-09-23","description":"Undo is Ctrl+Z. Redo is Ctrl+Shift+Z, and Ctrl+Y also redos. Save, open, new, place, and export sit on the usual chords. Pixel Ctrl+D clears a selection. Super+D duplicates.","tags":["omadesign","0.5.8","shortcuts"]},{"title":"Arrange and transform keys","slug":"omadesign-0-5-8-arrange-and-transform-keys","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-arrange-and-transform-keys","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-arrange-and-transform-keys.md","date":"2026-09-23","description":"Ctrl+G groups and Ctrl+Shift+G ungroups. Compound is Ctrl+8 and release is Ctrl+Shift+8. Front and back, free transform, guides, snapping, the HUD, and F1 sit on the chords beside them.","tags":["omadesign","0.5.8","shortcuts"]},{"title":"View and motion keys","slug":"omadesign-0-5-8-view-and-motion-keys","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-view-and-motion-keys","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-view-and-motion-keys.md","date":"2026-09-23","description":"Ctrl+0 fits, Ctrl+1 is 100%, and Ctrl plus or minus zooms. Hold Space to pan. In Motion, Space plays, K sets keys, and Delete removes a key or the animation.","tags":["omadesign","0.5.8","shortcuts"]},{"title":"Native dialogs context","slug":"omadesign-0-5-8-native-dialogs-context","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-native-dialogs-context","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-native-dialogs-context.md","date":"2026-09-23","description":"Open, save, place, and export use the desktop file dialog. Right-click the canvas for Place, Trace, and the same edits. The status bar reports copy, cut, and paste.","tags":["omadesign","0.5.8","shortcuts"]},{"title":"Plugins offline docs","slug":"omadesign-0-5-8-plugins-offline-docs","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-plugins-offline-docs","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-plugins-offline-docs.md","date":"2026-09-23","description":"The 0.5.8 package carries Lua, the manual, the plugin guide, the creation skill, Studio starter, and the licenses. Author from the files on disk. The in-app Docs item still opens the website.","tags":["omadesign","0.5.8","docs"]},{"title":"One binary not three apps","slug":"omadesign-0-5-8-one-binary-not-three-apps","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-one-binary-not-three-apps","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-one-binary-not-three-apps.md","date":"2026-09-23","description":"Design, Layout, Pixel, Photo, and Motion are personas in one Linux binary. The letters V, P, T, and B stay put. F1 lists the rest while the same .oma stays open.","tags":["omadesign","0.5.8","personas"]},{"title":"Vectors pixels photo motion","slug":"omadesign-0-5-8-vectors-pixels-photo-motion","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-vectors-pixels-photo-motion","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-vectors-pixels-photo-motion.md","date":"2026-09-23","description":"Design, Pixel, Photo, and Motion share one layer stack in a .oma. Layout frames live in that file when the brief is a screen. The RAW stays beside it until you place.","tags":["omadesign","0.5.8","documents"]},{"title":"Brand kit on disk","slug":"omadesign-0-5-8-brand-kit-on-disk","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-brand-kit-on-disk","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-brand-kit-on-disk.md","date":"2026-09-23","description":"Palettes live in .omacolors, font roles in .omatype, and logos in .omabrand/. Copy the project folder. No account is required to open the kit on another machine.","tags":["omadesign","0.5.8","brand"]},{"title":"RAW sidecars not destructive","slug":"omadesign-0-5-8-raw-sidecars-not-destructive","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-raw-sidecars-not-destructive","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-raw-sidecars-not-destructive.md","date":"2026-09-23","description":"Save settings writes .omaphoto beside the camera file and leaves the pixels alone. Whole-folder apply writes sidecars only. Place in Design when the grade should enter the poster.","tags":["omadesign","0.5.8","photo"]},{"title":"Plugins without ExtendScript tax","slug":"omadesign-0-5-8-plugins-without-extendscript-tax","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-plugins-without-extendscript-tax","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-plugins-without-extendscript-tax.md","date":"2026-09-23","description":"0.5.8 runs Lua plugins inside the binary. Filters, effects, icons, brushes, tools, patterns, gradients, swatches, and a batch command. One undo. No separate runtime.","tags":["omadesign","0.5.8","plugins"]},{"title":"Import honesty export choice","slug":"omadesign-0-5-8-import-honesty-export-choice","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-import-honesty-export-choice","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-import-honesty-export-choice.md","date":"2026-09-23","description":"Open PSD, PDF, SVG, ORA, XCF, Affinity through the bridge, and RAW. Conversion notes stay in the .oma. Export PNG at 1× 2× 3×, SVG, Lottie, PSD, PDF, and ORA. There is no native AI or Affinity writer.","tags":["omadesign","0.5.8","files"]},{"title":"Cloud optional showcase explicit","slug":"omadesign-0-5-8-cloud-optional-showcase-explicit","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-cloud-optional-showcase-explicit","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-cloud-optional-showcase-explicit.md","date":"2026-09-23","description":"File → Sign in is optional. Push uploads a version when you ask. Publish to the showcase is a second step by the owner. Unpublished work stays off the public gallery. The .oma remains local.","tags":["omadesign","0.5.8","cloud"]},{"title":"Linux first creative suite","slug":"omadesign-0-5-8-linux-first-creative-suite","url":"https://www.michaelchurley.com/blog/omadesign-0-5-8-linux-first-creative-suite","markdown":"https://www.michaelchurley.com/blog/omadesign-0-5-8-linux-first-creative-suite.md","date":"2026-09-23","description":"curl installs omadesign into ~/.local/bin and writes nothing to /usr. Omarchy colors, Phosphor icons, ARM64 and x86_64, offline templates, and Lua inside the 0.5.8 package.","tags":["omadesign","0.5.8","linux"]},{"title":"Vanity phones and fake metrics scrubbed across five repos","slug":"vanity-phone-metrics-honesty-fleet","url":"https://www.michaelchurley.com/blog/vanity-phone-metrics-honesty-fleet","markdown":"https://www.michaelchurley.com/blog/vanity-phone-metrics-honesty-fleet.md","date":"2026-09-09","description":"Follow-up: ten vanity-phone and fake-metrics issues closed. yourzaxbys and iPro dropped 555 vanity numbers; s12.in hero stats became honest capability copy; freview was a false positive; ileague metrics already fixed on main.","tags":["follow-up","vanity-phone","fake-metrics","honesty","HurleyUS","portfolio"]},{"title":"Empty READMEs filled with real usage across three repos","slug":"empty-readme-fills-fleet","url":"https://www.michaelchurley.com/blog/empty-readme-fills-fleet","markdown":"https://www.michaelchurley.com/blog/empty-readme-fills-fleet.md","date":"2026-09-09","description":"Follow-up: six content-factory-gap empty README issues closed via three PRs. animated-gradient-border, fab-analytics, and shagent now document real install/run usage. No fake stars or metrics.","tags":["follow-up","readme","content-factory","michaelmonetized","portfolio"]},{"title":"Coming Soon shells replaced with honest status landers","slug":"coming-soon-waitlist-honesty-fleet","url":"https://www.michaelchurley.com/blog/coming-soon-waitlist-honesty-fleet","markdown":"https://www.michaelchurley.com/blog/coming-soon-waitlist-honesty-fleet.md","date":"2026-09-09","description":"Follow-up: waitlist Coming Soon shells closed across hustledesk, kitchen, merchwinner, coordinatorapp, iPro-main-web, and omnux. Planned SSO and Notify forms now say Planned/not shipped or Not available yet. ileague.app still Coming Soon after lander PR (Vercel/DNS park).","tags":["follow-up","coming-soon","waitlist","honesty","landers","HurleyUS","michaelmonetized"]},{"title":"LICENSE copyright aligned across ten repos","slug":"license-copyright-alignment-fleet","url":"https://www.michaelchurley.com/blog/license-copyright-alignment-fleet","markdown":"https://www.michaelchurley.com/blog/license-copyright-alignment-fleet.md","date":"2026-09-09","description":"Follow-up: 20 issues across 10 repos closed. LICENSE copyright aligned to Michael Hurley / owning org on stripe-convex, slopops, orclawstrator, nvibe, compare, agent-os, agent-computer-use, WhisperCPPonEverything, s12.in, and ileague-app; MIT added where missing. Sample PRs stripe-convex#18 and s12.in#35.","tags":["license","copyright","mit","follow-up","portfolio","HurleyUS","michaelmonetized"]},{"title":"hustle* suite: DEPLOYMENT_NOT_FOUND cleared on *.vercel.app landers","slug":"hustle-suite-vercel-app-restores","url":"https://www.michaelchurley.com/blog/hustle-suite-vercel-app-restores","markdown":"https://www.michaelchurley.com/blog/hustle-suite-vercel-app-restores.md","date":"2026-09-09","description":"Follow-up: hustledesk/crm/convert/chat/forms #1 and hustlemail #2 closed. Packs that showed DEPLOYMENT_NOT_FOUND now resolve on *.vercel.app hosts for desk, crm, convert, chat, forms, and mail. hustlemail also needed a PostCSS @tailwindcss/postcss fix. Custom DNS still parked overnight.","tags":["hustle","vercel","deployment","landers","follow-up","hustlemail"]},{"title":"hms: live again on hms-cyan-six.vercel.app","slug":"hms-cyan-six-vercel-live","url":"https://www.michaelchurley.com/blog/hms-cyan-six-vercel-live","markdown":"https://www.michaelchurley.com/blog/hms-cyan-six-vercel-live.md","date":"2026-09-09","description":"Follow-up: hms#1 closed. Live host https://hms-cyan-six.vercel.app is up after packs flagged a missing deploy.","tags":["hms","vercel","deployment","follow-up","hustle-management-system"]},{"title":"codefolio: DEPLOY.md landed, live URL still needs Convex env","slug":"codefolio-deploy-md-no-live-url","url":"https://www.michaelchurley.com/blog/codefolio-deploy-md-no-live-url","markdown":"https://www.michaelchurley.com/blog/codefolio-deploy-md-no-live-url.md","date":"2026-09-09","description":"Follow-up: codefolio#1 closed with DEPLOY.md only. No live URL yet; Convex env and codefolio.dev remain parked.","tags":["codefolio","deploy","convex","docs","follow-up"]},{"title":"simple: Firebase config env-only, service account wiped","slug":"simple-firebase-env-only-sa-wiped","url":"https://www.michaelchurley.com/blog/simple-firebase-env-only-sa-wiped","markdown":"https://www.michaelchurley.com/blog/simple-firebase-env-only-sa-wiped.md","date":"2026-09-09","description":"Follow-up: michaelmonetized/simple PR #12 closed Issue #7. Client Firebase is env-only and fails closed without logging values; serviceAccount/admin credential patterns gitignored; leftover local SA file wiped. Prior keep-Firebase notes still stand.","tags":["simple","firebase","secrets","security","follow-up","michaelmonetized"]},{"title":"launchpad: Clerk, Convex, and PostHog finally mount in layout","slug":"launchpad-clerk-convex-posthog-wired","url":"https://www.michaelchurley.com/blog/launchpad-clerk-convex-posthog-wired","markdown":"https://www.michaelchurley.com/blog/launchpad-clerk-convex-posthog-wired.md","date":"2026-09-09","description":"Follow-up: michaelmonetized/launchpad PR #7 closed Issue #3. Root layout mounts Clerk then Convex then PostHog; Convex uses @clerk/nextjs useAuth matching clerkMiddleware. Soft-guards when env is unset. Providers are no longer orphan files.","tags":["launchpad","clerk","convex","posthog","nextjs","follow-up","michaelmonetized"]},{"title":"mission-control-os: pending Clerk auth and agency create timeout","slug":"mission-control-os-pending-auth-agency-timeout","url":"https://www.michaelchurley.com/blog/mission-control-os-pending-auth-agency-timeout","markdown":"https://www.michaelchurley.com/blog/mission-control-os-pending-auth-agency-timeout.md","date":"2026-09-09","description":"Follow-up: Hustle-Launch/mission-control-os PR #64 (d09322c) closed Issues #50 and #51. Shared auth hooks keep pending sessions from looking signed-out on AgencyGate/PortalGate/cockpit; agency org create/select gets a hard timeout plus error instead of infinite Working. Prod redeploy still blocked on bad VERCEL_TOKEN (infra).","tags":["mission-control-os","clerk","auth","agency","hustle-launch","follow-up"]},{"title":"MyBathroomConversion: WP File Manager gone, Salespromis key moved to env","slug":"mybathroomconversion-wp-file-manager-gone-key-to-env","url":"https://www.michaelchurley.com/blog/mybathroomconversion-wp-file-manager-gone-key-to-env","markdown":"https://www.michaelchurley.com/blog/mybathroomconversion-wp-file-manager-gone-key-to-env.md","date":"2026-09-09","description":"Follow-up: HurleyUS/www.mybathroomconversion.com PR #7 (928819d) closed Issues #4 and #5. Removed vendored WP File Manager 7.2.9 (~906 files) and moved Salespromis Opt In onto SALESPROMIS_API_KEY env/constant. Rotate the old key; set env before leads post again.","tags":["mybathroomconversion","wordpress","security","wp-file-manager","salespromis","secrets","follow-up","hustle-launch"]},{"title":"BestWNC: I built a WNC directory that returns null instead of fake analytics","slug":"bestwnc-honest-analytics-local-directory","url":"https://www.michaelchurley.com/blog/bestwnc-honest-analytics-local-directory","markdown":"https://www.michaelchurley.com/blog/bestwnc-honest-analytics-local-directory.md","date":"2026-09-08","description":"BestWNC is the WNC directory where listings start free and owner analytics return null when the measurement layer cannot defend a chart. September 8 shipped honest null availability, claim/billing hardening, and honeypots after spam flooded the inbox.","tags":["bestwnc","local-directory","western-north-carolina","asheville","nextjs","convex","stripe","clerk","martech","analytics"]},{"title":"omadesign: I shipped a native Linux design suite in 13 days","slug":"omadesign-native-linux-studio-13-days","url":"https://www.michaelchurley.com/blog/omadesign-native-linux-studio-13-days","markdown":"https://www.michaelchurley.com/blog/omadesign-native-linux-studio-13-days.md","date":"2026-09-08","description":"omadesign is a native Rust + egui studio with Design, Pixel, Photo, and Motion personas on one document and layer stack. Four alphas in thirteen days, glibc 2.35 tarballs for aarch64 and x86_64, still alpha and shipping without Electron.","tags":["omadesign","rust","linux","egui","asahi","omarchy","design","photography","motion","martech"]},{"title":"GetAt.Me: I replaced the link list with a relationship console","slug":"getat-me-relationship-first-link-in-bio","url":"https://www.michaelchurley.com/blog/getat-me-relationship-first-link-in-bio","markdown":"https://www.michaelchurley.com/blog/getat-me-relationship-first-link-in-bio.md","date":"2026-09-08","description":"getat.me is a relationship-first link-in-bio: Next.js + Convex contacts and booking rails, not just clicks. Honest about what is live vs scaffold.","tags":["getat.me","link-in-bio","convex","clerk","nextjs","martech","creators","consultants","saas"]},{"title":"Naarchy 0.4.0: Preferences, doctor, and the privacy pass","slug":"naarchy-0-4-preferences-privacy","url":"https://www.michaelchurley.com/blog/naarchy-0-4-preferences-privacy","markdown":"https://www.michaelchurley.com/blog/naarchy-0-4-preferences-privacy.md","date":"2026-09-03","description":"Update 2026-09-09: Naarchy 0.4.0 is tagged on GitHub (v0.4.0 / f95ce49). Preferences, naarchy doctor, atomic stores, travel opt-in, IPC cleanup, 86 tests. EXTEND after the Sep 3 island post.","tags":["naarchy","linux","hyprland","omarchy","gtk4","rust","privacy","preferences","clipboard","open-source"]},{"title":"I rebuilt the Omarchy site in TanStack Start in three days","slug":"omarchy-site-tanstack-start-rebuild","url":"https://www.michaelchurley.com/blog/omarchy-site-tanstack-start-rebuild","markdown":"https://www.michaelchurley.com/blog/omarchy-site-tanstack-start-rebuild.md","date":"2026-09-03","description":"I ported the Omarchy marketing site and full manual into TanStack Start — 52 chapters, 16 news posts, Quattro hero etch, Vercel URL. Not the OS. The site.","tags":["omarchy","tanstack-start","tanstack-router","typescript","vercel","hyprland","quickshell","dhh","linux","martech"]},{"title":"Naarchy: a Dynamic Island for Linux that owns the notch","slug":"naarchy-linux-dynamic-island","url":"https://www.michaelchurley.com/blog/naarchy-linux-dynamic-island","markdown":"https://www.michaelchurley.com/blog/naarchy-linux-dynamic-island.md","date":"2026-09-03","description":"I built a native GTK4 Dynamic Island for Omarchy and Hyprland. It fills the 16\" M1 Pro camera hole, grows ears for a live timer, and takes over the screen when the countdown hits zero.","tags":["naarchy","linux","omarchy","hyprland","open-source"]},{"title":"uncap.us: I rebuilt the social layer around the repo","slug":"uncap-us-repo-native-social-layer","url":"https://www.michaelchurley.com/blog/uncap-us-repo-native-social-layer","markdown":"https://www.michaelchurley.com/blog/uncap-us-repo-native-social-layer.md","date":"2026-08-31","description":"I spent eight months turning a file-cabinet Git host into a repo-native work hub — Lens, origin sync, CLI/UnGit, TanStack Start. Live at uncap.us.","tags":["uncap","devtools","tanstack","convex","clerk","git","cli","martech","opensource","vercel"]},{"title":"Mack's BBQ Shack: I built a Main Street site that still feels like the pit","slug":"macks-bbq-shack-canton-condensation-site","url":"https://www.michaelchurley.com/blog/macks-bbq-shack-canton-condensation-site","markdown":"https://www.michaelchurley.com/blog/macks-bbq-shack-canton-condensation-site.md","date":"2026-08-30","description":"Mack's Shack BBQ is a private Next 16 / Bun / Convex / Resend Canton pit site with a condensation-glass hero, skeuomorphic chalkboard menu, and catering leads from notify@uncap.us. Live on www.macksbbqshack.com; sixty-seven commits through the Aug 30 Resend fix.","tags":["macks-bbq-shack","nextjs","convex","resend","catering","local-business","canton-nc","martech","hustle-launch","framer-motion"]},{"title":"Omnux: I wired Linux for Apple silicon without lying about the GPU","slug":"omnux-linux-apple-silicon-truth-table","url":"https://www.michaelchurley.com/blog/omnux-linux-apple-silicon-truth-table","markdown":"https://www.michaelchurley.com/blog/omnux-linux-apple-silicon-truth-table.md","date":"2026-08-27","description":"Omnux is the HurleyUS Linux-on-Apple-Silicon umbrella: truth table for what installs today, software-render honesty on M3, and the monorepo that coordinates docs, GPU, and report siblings.","tags":["omnux","asahi","omarchy","apple-silicon","linux","m3","gpu","hyprland","martech"]},{"title":"WNC History Tours: I shipped the booking shell before the tour pages existed","slug":"omnux-report-one-command-diagnostics-redaction","url":"https://www.michaelchurley.com/blog/omnux-report-one-command-diagnostics-redaction","markdown":"https://www.michaelchurley.com/blog/omnux-report-one-command-diagnostics-redaction.md","date":"2026-08-27","description":"omnux-report is an offline MIT Shell diagnostics tool (HEAD f9729a6) that ships a consenting redacted .tar.zst + SHA256 for Omnux on Apple Silicon, with SEP structure only. Validated on a real M1 Pro Omarchy box plus a ten-check fixture harness; mx-mac packaging and owner release still open.","tags":["omnux-report","omnux","asahi","apple-silicon","diagnostics","redaction","telemetry","sep","touchid","linux","omarchy"]},{"title":"slopops: I put my whole ops stack in one Omarchy bar popup","slug":"slopops-omarchy-ops-bar-panel","url":"https://www.michaelchurley.com/blog/slopops-omarchy-ops-bar-panel","markdown":"https://www.michaelchurley.com/blog/slopops-omarchy-ops-bar-panel.md","date":"2026-08-26","description":"slopops is a public Omarchy Quickshell bar widget (0.1.0, HEAD after two 2026-08-26 commits) with one icon and five tabs (Fleet / Deploys / Sentry / Traffic / Issues), bash JSON fetchers, optional secrets.env, and a badge that goes red/yellow/green without opening another Electron tray.","tags":["slopops","omarchy","qml","ops","tailscale","vercel","sentry","posthog","github","linux","martech"]},{"title":"Hurleyus: I put Catppuccin Mocha in Hurley rally livery on Omarchy","slug":"hurleyus-omarchy-catppuccin-rally-theme","url":"https://www.michaelchurley.com/blog/hurleyus-omarchy-catppuccin-rally-theme","markdown":"https://www.michaelchurley.com/blog/hurleyus-omarchy-catppuccin-rally-theme.md","date":"2026-08-26","description":"Hurleyus is the Omarchy Catppuccin Mocha theme pack with rally walls, Plymouth unlock, and an Asahi U-Boot 160x160 splash patch. Four commits; last push 65f4da3. Omarchy 4.0.2+ drops hyprland.lua unless you clone + symlink.","tags":["hurleyus","omarchy","catppuccin","mocha","theme","hyprland","asahi","u-boot","plymouth","linux","quattro","wallpaper"]},{"title":"omnux-gpu: I opened an MIT siege for M3 pixels and refused to call it a driver","slug":"omnux-gpu-mit-clean-room-m3-siege","url":"https://www.michaelchurley.com/blog/omnux-gpu-mit-clean-room-m3-siege","markdown":"https://www.michaelchurley.com/blog/omnux-gpu-mit-clean-room-m3-siege.md","date":"2026-08-24","description":"omnux-gpu is the clean-room MIT attempt at Apple M3 AGX: scaffold, fifteen public issues, capture-first method. No working driver. Hardware is the bottleneck.","tags":["omnux-gpu","omnux","asahi","apple-silicon","m3","gpu","agx","clean-room","mit","linux","reverse-engineering"]},{"title":"twelveux: I hosted a shadcn registry and shipped Glass in one afternoon","slug":"twelveux-hosted-shadcn-registry-glass","url":"https://www.michaelchurley.com/blog/twelveux-hosted-shadcn-registry-glass","markdown":"https://www.michaelchurley.com/blog/twelveux-hosted-shadcn-registry-glass.md","date":"2026-08-15","description":"I stood up twelveux: a hosted shadcn registry with Max, a phi Catppuccin theme, and pen.dev Glass. Playground on Vercel. Five commits. Same day.","tags":["twelveux","shadcn","glass","webgl","nextjs","catppuccin","max","martech","registry"]},{"title":"HMS: I replaced WordPress + Elementor with a live site that is the editor","slug":"hms-hustle-management-system-live-editor","url":"https://www.michaelchurley.com/blog/hms-hustle-management-system-live-editor","markdown":"https://www.michaelchurley.com/blog/hms-hustle-management-system-live-editor.md","date":"2026-08-14","description":"I built HMS (Hustle Management System) so pages, blog, shop, and blueprints are block trees on Vite+ / React 19 / Convex / Clerk. Same URL for visitors and ?edit=1 for operators. Six commits. Version 0.0.0.","tags":["hms","hustle-management-system","page-builder","convex","clerk","vite-plus","wordpress-alternative","elementor","woocommerce","martech","blocks"]},{"title":"Best Jeep Decals: I shipped a dark-first vinyl storefront for Jeep identity","slug":"best-jeep-decals-convex-stripe-storefront","url":"https://www.michaelchurley.com/blog/best-jeep-decals-convex-stripe-storefront","markdown":"https://www.michaelchurley.com/blog/best-jeep-decals-convex-stripe-storefront.md","date":"2026-08-08","description":"Private Next.js 16 Jeep vinyl e-commerce: Convex catalog, Clerk auth, Stripe checkout, wishlist, reviews. 30 seeded SKUs at $29.99. Live at bestjeepdecals.com.","tags":["best-jeep-decals","nextjs","convex","clerk","stripe","ecommerce","jeep","vinyl-decals","martech","hustle-launch"]},{"title":"reaferral: I built a free referral tracker so agents stop bleeding commissions into spreadsheets","slug":"reaferral-agent-referral-platform","url":"https://www.michaelchurley.com/blog/reaferral-agent-referral-platform","markdown":"https://www.michaelchurley.com/blog/reaferral-agent-referral-platform.md","date":"2026-08-08","description":"Reaferral is an agent referral platform: who sent it, what fee attaches, where it sits in the pipeline. Accountability, not a CRM dump.","tags":["reaferral","real-estate","referrals","convex","clerk","nextjs","martech","vercel","mdx","saas"]},{"title":"Your ZAXBYS: I built a franchise ops platform so the store and the above-store stop living in different spreadsheets","slug":"yourzaxbys-franchise-management-platform","url":"https://www.michaelchurley.com/blog/yourzaxbys-franchise-management-platform","markdown":"https://www.michaelchurley.com/blog/yourzaxbys-franchise-management-platform.md","date":"2026-08-08","description":"I shipped Your ZAXBYS as a Next.js 16 + Convex + Clerk franchise management platform (employees, stores, schedules, CAPs, audits) with a public marketing lander and a private dashboard, package 1.0.0, 46 commits, HEAD 705473f.","tags":["yourzaxbys","zaxbys","franchise","nextjs","convex","clerk","resend","sentry","martech","ops"]},{"title":"WNC History Tours: I shipped the booking shell before the tour pages existed","slug":"wnc-history-tours-booking-shell-before-detail-pages","url":"https://www.michaelchurley.com/blog/wnc-history-tours-booking-shell-before-detail-pages","markdown":"https://www.michaelchurley.com/blog/wnc-history-tours-booking-shell-before-detail-pages.md","date":"2026-08-08","description":"WNC History Tours is my Western North Carolina history-tour directory (Next.js 16, Convex, Clerk, Stripe deps). Homepage + schema + Blacksmith CI shipped; tour detail and checkout still missing. Domain answers Cloudflare 526.","tags":["wnc-history-tours","western-north-carolina","asheville","tour-booking","local-directory","nextjs","convex","clerk","stripe","martech","heritage-tourism"]},{"title":"modern-design-playground: I left agents running for ten hours and they rebuilt nine worlds","slug":"waynesville-zaxbys-single-store-ops-portal","url":"https://www.michaelchurley.com/blog/waynesville-zaxbys-single-store-ops-portal","markdown":"https://www.michaelchurley.com/blog/waynesville-zaxbys-single-store-ops-portal.md","date":"2026-08-08","description":"I shipped waynesville.yourzaxbys.com as a Next.js 16 + Convex + Clerk single-store portal for 424 Russ Ave: public events/careers/community out front, live shift metrics, Steritech CAPs, hiring, training, and attendance behind the door. Package 0.1.0, 235 commits, HEAD c9f97b7. Not the franchise SaaS sibling.","tags":["waynesville","yourzaxbys","zaxbys","single-store","nextjs","convex","clerk","steritech","ops","martech","wnc"]},{"title":"The National NC: live NC news feeds before the bias AI ships","slug":"thenationalnc-live-rss-before-bias-ai","url":"https://www.michaelchurley.com/blog/thenationalnc-live-rss-before-bias-ai","markdown":"https://www.michaelchurley.com/blog/thenationalnc-live-rss-before-bias-ai.md","date":"2026-08-08","description":"TheNationalNC ships live RSS before the bias-AI story: real feeds on the page, model claims parked until the pipes work.","tags":["thenationalnc","north-carolina","news-aggregator","media-bias","rss","nextjs","convex","clerk","catppuccin","martech"]},{"title":"s12.in: I shipped a short domain that tracks clicks and hosts files","slug":"s12-in-url-shortener-file-hosting","url":"https://www.michaelchurley.com/blog/s12-in-url-shortener-file-hosting","markdown":"https://www.michaelchurley.com/blog/s12-in-url-shortener-file-hosting.md","date":"2026-08-08","description":"s12.in is a private HurleyUS shortener + file host on Next 16.1.6, Convex, and Clerk with geo/device click recording and a 302 redirect spine. HEAD d6c074f; hero stats are still static JSX; Clerk on the observed deploy is pk_test.","tags":["s12.in","url-shortener","file-hosting","convex","clerk","nextjs","analytics","vercel","chrome-extension","martech"]},{"title":"Monarch Mountain Foundations: I migrated WordPress to Next — DNS still serves PHP","slug":"monarch-mountain-foundations-wordpress-to-next-dns-still-php","url":"https://www.michaelchurley.com/blog/monarch-mountain-foundations-wordpress-to-next-dns-still-php","markdown":"https://www.michaelchurley.com/blog/monarch-mountain-foundations-wordpress-to-next-dns-still-php.md","date":"2026-08-08","description":"Monarch Mountain Foundations is a full Next rebuild (Resend, Schema, gallery, CSP) whose www still serves PHP/8.3.33 on LiteSpeed while the Vercel alias sits with main auto-deploy off. HEAD c7e4e30; homepage motion still hotlinks wp-content.","tags":["monarch-mountain-foundations","highlands-nc","cashiers-nc","western-north-carolina","concrete-foundations","wordpress-migration","nextjs","vercel","resend","localbusiness-schema","martech","hustle-launch","client-site"]},{"title":"mockup-gallery: I shipped 10 industry mockups as a cold-outreach portfolio","slug":"mockup-gallery-ten-industry-cold-outreach","url":"https://www.michaelchurley.com/blog/mockup-gallery-ten-industry-cold-outreach","markdown":"https://www.michaelchurley.com/blog/mockup-gallery-ten-industry-cold-outreach.md","date":"2026-08-08","description":"I stood up mockup-gallery — ten conversion-focused industry landers in one tabbed Next.js 16 gallery for HurleyUS cold outreach. Live on Vercel. Tailwind v4 fight, then Blacksmith/Fallow/Sentry/PostHog, then index,follow.","tags":["mockup-gallery","hurleyus","cold-outreach","web-design","nextjs","tailwind","vercel","portfolio","martech","conversion"]},{"title":"MerchWinner: I shipped a POD course marketplace before the catalog had courses","slug":"merchwinner-pod-course-marketplace","url":"https://www.michaelchurley.com/blog/merchwinner-pod-course-marketplace","markdown":"https://www.michaelchurley.com/blog/merchwinner-pod-course-marketplace.md","date":"2026-08-08","description":"I shipped MerchWinner as a POD course marketplace on Next.js + Convex + Clerk + Stripe: catalog, checkout, and course rails in one stack, not a Google Sheet.","tags":["merchwinner","print-on-demand","course-marketplace","nextjs","convex","clerk","stripe","resend","catppuccin","martech","pod"]},{"title":"modern-design-playground: I left agents running for ten hours and they rebuilt nine worlds","slug":"modern-design-playground-afk-webgl-nine-worlds","url":"https://www.michaelchurley.com/blog/modern-design-playground-afk-webgl-nine-worlds","markdown":"https://www.michaelchurley.com/blog/modern-design-playground-afk-webgl-nine-worlds.md","date":"2026-08-08","description":"I shipped a WebGL instrument homepage and nine landing worlds, then left a marathon agent loop overnight after WebGL went blank. Live on mdp-seven.vercel.app.","tags":["modern-design-playground","webgl","threejs","tanstack","vite","shadcn","max","martech","vercel","afk","agents"]},{"title":"Kings Roofing NC: I didn't redesign the WordPress site — I lifted it to Next.js","slug":"kingsroofingnc-pixel-perfect-wp-to-next-lift","url":"https://www.michaelchurley.com/blog/kingsroofingnc-pixel-perfect-wp-to-next-lift","markdown":"https://www.michaelchurley.com/blog/kingsroofingnc-pixel-perfect-wp-to-next-lift.md","date":"2026-08-08","description":"Kings Roofing NC is a pixel-faithful WordPress-to-Next lift that kept #FF7620, the lion, color pickers, and metal-structure tree under Hustle-Launch/kingsroofingnc.com. Working surface is kingsroofingnccom.vercel.app (apex Cloudflare 526); HEAD 984746b.","tags":["kingsroofingnc","wordpress-migration","nextjs","western-north-carolina","roofing","local-business","resend","vercel","martech","pixel-perfect"]},{"title":"iLeague.golf: I built Patreon meets 18Birdies for golf creators — and left Clerk on pk_test","slug":"ileague-golf-patreon-meets-18birdies","url":"https://www.michaelchurley.com/blog/ileague-golf-patreon-meets-18birdies","markdown":"https://www.michaelchurley.com/blog/ileague-golf-patreon-meets-18birdies.md","date":"2026-08-08","description":"iLeague.golf is the HurleyUS golf creator platform: Patreon-meets-18Birdies with Stripe tiers and a fifteen percent fee. Distinct from the iTour national tour lander.","tags":["ileague","ileague-golf","golf","creator-economy","patreon","18birdies","stripe","convex","clerk","nextjs","expo","itour","hurleyus"]},{"title":"hurleyus.com: I shipped the parent site as a performance-pay membership lander","slug":"hurleyus-com-membership-growth-parent-site","url":"https://www.michaelchurley.com/blog/hurleyus-com-membership-growth-parent-site","markdown":"https://www.michaelchurley.com/blog/hurleyus-com-membership-growth-parent-site.md","date":"2026-08-08","description":"HurleyUS.com is live as a membership-growth revenue partner lander for private and resort golf clubs — Next.js 16, Resend, Sentry, optional Convex — after an A/B flip that kept HomeA.","tags":["hurleyus","golf","membership","nextjs","convex","resend","sentry","martech","vercel","parent-company"]},{"title":"GetFarmin: I scaffolded a farm equipment marketplace with escrow math first","slug":"getfarmin-farm-equipment-marketplace-scaffold","url":"https://www.michaelchurley.com/blog/getfarmin-farm-equipment-marketplace-scaffold","markdown":"https://www.michaelchurley.com/blog/getfarmin-farm-equipment-marketplace-scaffold.md","date":"2026-08-08","description":"I scaffolded GetFarmin as a Next.js farm-equipment marketplace with Convex listings and Clerk: tractor/implement catalog path, not a $49 SaaS seat. Honest about Connect onboarding still unfinished.","tags":["getfarmin","farm-equipment","marketplace","nextjs","convex","clerk","stripe-connect","escrow","agriculture","martech","catppuccin"]},{"title":"EverythingMonetized: I built a parody LMS where course bros sell courses about selling courses","slug":"everythingmonetized-parody-lms-course-bros","url":"https://www.michaelchurley.com/blog/everythingmonetized-parody-lms-course-bros","markdown":"https://www.michaelchurley.com/blog/everythingmonetized-parody-lms-course-bros.md","date":"2026-08-08","description":"I shipped EverythingMonetized.com, a Next.js 16 + Convex parody LMS with 5 AI course-bro personas, 10 absurd courses, admin CRUD, and a purchase flow that admits nothing ships, then left the live catalog at Showing 0 of 0 because Convex never got seeded on Vercel.","tags":["everythingmonetized","parody","satire","course-bro","lms","nextjs","convex","tailwind","martech","creator-economy","hurleyus"]},{"title":"DJ Side Three: WNC wedding DJ funnel after cutting Clerk","slug":"djsidethree-wnc-wedding-dj-funnel-after-clerk-cut","url":"https://www.michaelchurley.com/blog/djsidethree-wnc-wedding-dj-funnel-after-clerk-cut","markdown":"https://www.michaelchurley.com/blog/djsidethree-wnc-wedding-dj-funnel-after-clerk-cut.md","date":"2026-08-08","description":"djsidethree.com is a purple Next.js wedding-DJ landing with $500 / $1,200 / $1,500 packages, Convex inquiry, and an admin board. Feb 27 ripped Clerk, Turnstile, and Sentry to kill a production 500. Zod, rate limits, and Phosphor stayed.","tags":["djsidethree","wedding-dj","western-north-carolina","asheville","local-service","nextjs","convex","inquiry-form","phosphor","vercel"]},{"title":"Cravees: I built a catering martech agency site with dual pricing honesty","slug":"cravees-catering-martech-agency-site","url":"https://www.michaelchurley.com/blog/cravees-catering-martech-agency-site","markdown":"https://www.michaelchurley.com/blog/cravees-catering-martech-agency-site.md","date":"2026-08-08","description":"I built Cravees, a Next.js 16 + Convex + Clerk catering marketing agency site, with $299-$999 packages on the page and a different Stripe bronze/silver/gold ladder in code. Lead enums, ROI calculator, newsletter double opt-in. Live on www.cravees.com.","tags":["cravees","catering","martech","marketing-agency","nextjs","convex","clerk","stripe","roi-calculator","hospitality","local-seo","catppuccin"]},{"title":"Coordinator: I shipped an API queue control plane before the queue worker existed","slug":"coordinatorapp-api-queue-control-plane","url":"https://www.michaelchurley.com/blog/coordinatorapp-api-queue-control-plane","markdown":"https://www.michaelchurley.com/blog/coordinatorapp-api-queue-control-plane.md","date":"2026-08-08","description":"CoordinatorApp is an API queue control plane on Next.js + Convex: jobs, workers, and status you can operate, not a package demo.","tags":["coordinator","coordinatorapp","api-queue","rate-limiting","nextjs","convex","clerk","stripe","zapier","backpressure","hurleyus"]},{"title":"Convex NextFaster: I swapped Neon for a Convex e-commerce template before the demo store existed","slug":"convex-nextfaster-perf-meets-convex-ecommerce-scaffold","url":"https://www.michaelchurley.com/blog/convex-nextfaster-perf-meets-convex-ecommerce-scaffold","markdown":"https://www.michaelchurley.com/blog/convex-nextfaster-perf-meets-convex-ecommerce-scaffold.md","date":"2026-08-08","description":"I took NextFaster PPR/prefetch DNA, ripped out Neon/Drizzle storefront pages, and shipped a public Convex + Clerk + Stripe + Sentry + PostHog + Resend e-commerce template with ~1.1k lines of Convex schema/mutations and a marketing homepage that still links to a /products route that does not exist yet.","tags":["convex-nextfaster","nextfaster","nextjs","convex","clerk","stripe","sentry","posthog","resend","ecommerce","template","ppr","performance"]},{"title":"Citation Manager: I built an Uberall competitor with 958 directories — and left auth on three stacks","slug":"citation-manager-uberall-competitor-958-directories","url":"https://www.michaelchurley.com/blog/citation-manager-uberall-competitor-958-directories","markdown":"https://www.michaelchurley.com/blog/citation-manager-uberall-competitor-958-directories.md","date":"2026-08-08","description":"HurleyUS/citation-manager is an Uberall-framed local listings SaaS with a real 958-row directories.json registry, Convex schema, and 83 commits to HEAD 78e9fb1. Pack-day probe: citation-manager-pi.vercel.app returns 500 MIDDLEWARE_INVOCATION_FAILED.","tags":["citation-manager","citations","local-seo","nap","uberall","brightlocal","yext","directories","convex","nextjs","clerk","hurleyus","saas"]},{"title":"BreazyApp pocket PEO draft pack","slug":"breazyapp-pocket-peo-aes-before-stripe","url":"https://www.michaelchurley.com/blog/breazyapp-pocket-peo-aes-before-stripe","markdown":"https://www.michaelchurley.com/blog/breazyapp-pocket-peo-aes-before-stripe.md","date":"2026-08-08","description":"Next.js 16 + Convex + Clerk pocket PEO for chain restaurants. Four portals, live waitlist, field protection, billing UI without stripe package. HEAD 2402b35.","tags":["breazyapp","peo","hr","payroll","restaurants","nextjs","convex","clerk","hurleyus"]},{"title":"Bar-B-Que Wagon: I built a Bryson City Main Street smokehouse site","slug":"barbquewagon-bryson-city-hickory-smokehouse-site","url":"https://www.michaelchurley.com/blog/barbquewagon-bryson-city-hickory-smokehouse-site","markdown":"https://www.michaelchurley.com/blog/barbquewagon-bryson-city-hickory-smokehouse-site.md","date":"2026-08-08","description":"Bar-B-Que Wagon is a Next 16 / Bun / Convex / Resend smokehouse site for 610 Main St, Bryson City, with Zod catering leads and Yelp plates in the repo. Live on barbquewagoncom.vercel.app; apex DNS still dark; thirty-eight commits through the Aug 8 robots header.","tags":["barbquewagon","bar-b-que-wagon","nextjs","convex","resend","catering","local-business","bryson-city-nc","martech","json-ld","smokehouse"]},{"title":"Appalachian Estate Sales: I rebuilt the Elementor site in Next before the gallery existed","slug":"appestatesales-elementor-to-next-wnc-liquidation","url":"https://www.michaelchurley.com/blog/appestatesales-elementor-to-next-wnc-liquidation","markdown":"https://www.michaelchurley.com/blog/appestatesales-elementor-to-next-wnc-liquidation.md","date":"2026-08-08","description":"Appalachian Estate Sales is a private Next.js 16.1.7 + Convex + Resend rebuild (HEAD 7a87d72, 24 commits) with seven routes and live lead capture on www.appestatesales.com. Previous/Upcoming still embed Facebook; README still says Convex/Resend are coming soon.","tags":["appalachian-estate-sales","appestatesales","elementor","nextjs","western-north-carolina","waynesville","estate-sales","local-business","convex","resend","martech","hustle-launch"]},{"title":"SantaBox.org: I rebuilt a BestWNC copy-paste into a Christmas charity lootbox platform","slug":"santabox-charity-lootbox-rebuild","url":"https://www.michaelchurley.com/blog/santabox-charity-lootbox-rebuild","markdown":"https://www.michaelchurley.com/blog/santabox-charity-lootbox-rebuild.md","date":"2026-08-08","description":"SantaBox.org is a Next.js 16 + Convex + Clerk + Stripe Christmas gift-box charity rebuilt from a BestWNC directory copy-paste into a donate/wishlist/partner stack. Feb 13 deleted fabricated nonprofit logos before they became a liability. HEAD 67712cb.","tags":["santabox","charity","christmas","nonprofit","lootbox","donations","nextjs","convex","clerk","stripe","resend","vercel"]},{"title":"shipthing: I named it for shipping rates and shipped a contacts spine instead","slug":"shipthing-contacts-spine-not-carrier-rates","url":"https://www.michaelchurley.com/blog/shipthing-contacts-spine-not-carrier-rates","markdown":"https://www.michaelchurley.com/blog/shipthing-contacts-spine-not-carrier-rates.md","date":"2026-08-08","description":"ShipThing is the public michaelmonetized/shipthing spine: Next 16.1.1, Clerk, Convex contacts, Resend lead mail, Sentry, PostHog, and proxy.ts. Thirty-nine commits; HEAD 9f91d97. PLAN.md still lists unchecked USPS/UPS/FedEx boxes.","tags":["shipthing","nextjs","convex","clerk","resend","sentry","posthog","proxy-ts","contacts","shipping","vercel","michaelmonetized"]},{"title":"mission-control: I built a p10k Go TUI for the whole portfolio — not the agent thread plane","slug":"mission-control-go-tui-p10k-portfolio-ops","url":"https://www.michaelchurley.com/blog/mission-control-go-tui-p10k-portfolio-ops","markdown":"https://www.michaelchurley.com/blog/mission-control-go-tui-p10k-portfolio-ops.md","date":"2026-08-08","description":"Mission Control is the public Go Bubble Tea mc TUI for Vercel, git, Swift, and GitHub across a local portfolio, separate from Hurley Mission Control's Convex human|agent plane. Phase 1 is the local strip; Phase 2 scaffolds metered Fly VMs and BYO Claude without claiming the other product's name.","tags":["mission-control","go","bubbletea","tui","p10k","vercel","openclaw","convex","flyio","portfolio-ops","michaelmonetized"]},{"title":"glass-design-system: I shipped Apple SVG refraction, not the WebGL registry","slug":"glass-design-system-apple-svg-refraction-showcase","url":"https://www.michaelchurley.com/blog/glass-design-system-apple-svg-refraction-showcase","markdown":"https://www.michaelchurley.com/blog/glass-design-system-apple-svg-refraction-showcase.md","date":"2026-08-08","description":"March 2026 I built a Next.js 16 glass design system with SVG feDisplacementMap Apple Liquid Glass, animated conic borders, jelly nav, and an 80+ Catppuccin showcase, live on Vercel. Distinct from twelveux WebGL Glass.","tags":["glass-design-system","apple-glass","svg","displacement","catppuccin","nextjs","tailwind","shadcn","martech","design-system","twelveux-sibling"]},{"title":"ascii-commit-graph: GitHub's heatmap in my terminal — then I made the cd hook fast","slug":"ascii-commit-graph-terminal-heatmap-cd-hook-fastpath","url":"https://www.michaelchurley.com/blog/ascii-commit-graph-terminal-heatmap-cd-hook-fastpath","markdown":"https://www.michaelchurley.com/blog/ascii-commit-graph-terminal-heatmap-cd-hook-fastpath.md","date":"2026-07-31","description":"ascii-commit-graph is a public 209-line shell heatmap (README V1.0.4, HEAD 9221b76) with a zoxide cd hook and a Jul 2026 single-git log / one-GraphQL fast path. ROADMAP release checkbox still open; install snippet still mentions michael-k/.","tags":["ascii-commit-graph","bash","cli","git","github","heatmap","contribution-graph","zoxide","terminal","gh","ripgrep","michaelmonetized"]},{"title":"niri-macos: I ported niri's scrollable tiling to macOS, then wrote an autopsy on my own Swift","slug":"niri-macos-scrollable-tiling-swift-ax-port","url":"https://www.michaelchurley.com/blog/niri-macos-scrollable-tiling-swift-ax-port","markdown":"https://www.michaelchurley.com/blog/niri-macos-scrollable-tiling-swift-ax-port.md","date":"2026-06-22","description":"Native Swift 0.1.0 port of YaLTeR/niri's infinite horizontal strip to macOS via Accessibility APIs: four commits, ~226KB Swift, AUTOPSY.md roasting the early prototype, then nightly commits that answered it with 112 tests, ConfigManager, and a NiriCore library split. HEAD d21a739.","tags":["niri-macos","niri","swift","macos","tiling","window-manager","accessibility","scrollable-tiling","paperwm","yabai","skhd","spm","ipc","michaelmonetized"]},{"title":"iTour.golf: I rewrote the national creator-tour lander for May 2027 — production still serves the 2026 fake season","slug":"itour-golf-tour-lander-ahead-of-deploy","url":"https://www.michaelchurley.com/blog/itour-golf-tour-lander-ahead-of-deploy","markdown":"https://www.michaelchurley.com/blog/itour-golf-tour-lander-ahead-of-deploy.md","date":"2026-06-22","description":"iTour.golf is the HurleyUS national golf creator tour, separate from the iLeague creator platform. Repo HEAD markets a 36-week 2027 season; live www still shows a 2026 story. No Stripe in the web package.","tags":["itour","itour-golf","golf","golf-tour","creator-tour","sponsors","ileague","iconference","convex","nextjs","clerk","vercel","deploy-drift","hurleyus"]},{"title":"Kitchen: I built a cloud project store where files are rows and disk is a Mirror — no git","slug":"kitchen-cloud-native-project-store","url":"https://www.michaelchurley.com/blog/kitchen-cloud-native-project-store","markdown":"https://www.michaelchurley.com/blog/kitchen-cloud-native-project-store.md","date":"2026-06-22","description":"Kitchen is a public Next 16.2.9 + Convex + Clerk + Mirror project store (HEAD 97bec56, 34 commits, web 0.1.0) aimed at live sync without git ceremony verbs. Marketing routes return 200; discover/vision/mission still 404 and the working tree is dirty.","tags":["kitchen","cloud-native","sync","convex","clerk","nextjs","mirror","versioning","no-git","developer-tools","pierre","vercel"]},{"title":"Codefolio: I shipped a GitHub-sync portfolio SaaS with 4k lines of specs — and claimed a domain that isn't mine","slug":"codefolio-spec-first-github-portfolio-saas","url":"https://www.michaelchurley.com/blog/codefolio-spec-first-github-portfolio-saas","markdown":"https://www.michaelchurley.com/blog/codefolio-spec-first-github-portfolio-saas.md","date":"2026-06-22","description":"Private michaelmonetized/codefolio is a Next.js 16 + Clerk + Convex developer portfolio platform: /:username public pages, resume, dashboard analytics, Free/$9 Pro/$29 Team. Three commits. Marketing OG points at codefolio.dev, which currently serves someone else's portfolio. HEAD c499a72.","tags":["codefolio","developer-portfolio","github-sync","nextjs","convex","clerk","stripe","saas","proxy-ts","resume","analytics","michaelmonetized","spec-first"]},{"title":"HustlePay: guest claim tokens before the framework adapters stopped being TODOs","slug":"hustlepay-guest-claim-tokens-auth-agnostic-stripe","url":"https://www.michaelchurley.com/blog/hustlepay-guest-claim-tokens-auth-agnostic-stripe","markdown":"https://www.michaelchurley.com/blog/hustlepay-guest-claim-tokens-auth-agnostic-stripe.md","date":"2026-06-22","description":"Private michaelmonetized/hustlepay is auth-agnostic Stripe + Convex payments glue. One nightly commit shipped hp_guest_sessions claim tokens, Pay/ClaimAccount in @core, and seven hp_* tables — while @hustlepay/react still exports VERSION only.","tags":["hustlepay","stripe","convex","guest-checkout","claim-tokens","auth-agnostic","payments","turbo","bun","michaelmonetized","theo-stripe-recommendations"]},{"title":"bundx-init: every Next.js repo gets https://<repo>.localhost via Caddy","slug":"bundx-init-nextjs-unique-localhost-https-caddy","url":"https://www.michaelchurley.com/blog/bundx-init-nextjs-unique-localhost-https-caddy","markdown":"https://www.michaelchurley.com/blog/bundx-init-nextjs-unique-localhost-https-caddy.md","date":"2026-06-22","description":"bundx-init is a public curl-install shell CLI (HEAD c8b59ad, 3 commits) that gives each Next repo a hashed *.localhost HTTPS origin via Caddy and allowedDevOrigins. Fixture basic-next lands on port 6422; no live web app.","tags":["bundx-init","nextjs","caddy","localhost","https","clerk","allowedDevOrigins","bash","cli","dev-tooling","local-dev","michaelmonetized"]},{"title":"bashformer: terminal Flappy Bird in Ink — after I deleted the C/SDL pile","slug":"bashformer-ink-flappy-after-c-sdl-cleanup","url":"https://www.michaelchurley.com/blog/bashformer-ink-flappy-after-c-sdl-cleanup","markdown":"https://www.michaelchurley.com/blog/bashformer-ink-flappy-after-c-sdl-cleanup.md","date":"2026-06-22","description":"bashformer is a public dual-stack TTY game: Ink Flappy in index.tsx (~263 LOC) and a pure-bash Nerd Font platformer in bashformer.sh (~314 LOC). HEAD 541d2bc, 21 commits, Unreleased; Feb 21 deleted the C/SDL pile and fixed Pipe.scored.","tags":["bashformer","flappy-bird","ink","react","bun","typescript","terminal-game","bash","platformer","nerd-font","cli","michaelmonetized"]},{"title":"compare: back-to-back time lies — so I git-isolated the benchmark","slug":"compare-git-isolated-command-benchmarker","url":"https://www.michaelchurley.com/blog/compare-git-isolated-command-benchmarker","markdown":"https://www.michaelchurley.com/blog/compare-git-isolated-command-benchmarker.md","date":"2026-06-22","description":"Public michaelmonetized/compare is an 825-line bash CLI that snapshots a dirty tree, runs each command on its own compare/<slug> branch from a shared baseline, and logs POSIX time. Motivating examples: biome vs oxlint. VERSION 0.1.0. 3 commits. HEAD c5dbcd6. Second nightly is an empty tree.","tags":["compare","bash","cli","benchmark","posix-time","git-isolation","biome","oxlint","mdr","mermaid","devtools","michaelmonetized"]},{"title":"nvibe: I wired Cursor Agent + CodeRabbit into Neovim, then fought the window manager until \"it works!\"","slug":"nvibe-neovim-cursor-coderabbit-layout-until-it-works","url":"https://www.michaelchurley.com/blog/nvibe-neovim-cursor-coderabbit-layout-until-it-works","markdown":"https://www.michaelchurley.com/blog/nvibe-neovim-cursor-coderabbit-layout-until-it-works.md","date":"2026-06-22","description":"nvibe is a public Lua Neovim plugin (HEAD 56d0152, 35 commits) that auto-lays out Cursor Agent + CodeRabbit on the left and LazyGit/shells on the bottom with a hard NvChad dependency. Arc runs from Product Hunt README through \"it works!\" window-management hell, NvimTree #4/#5 fixes, a GitHub Actions gate that got deleted for \"Vercel is our only CI/CD,\" and June 22 nightlies. HEAD 56d0152.","tags":["nvibe","neovim","nvim","lua","nvchad","cursor-agent","coderabbit","lazygit","vibe-coding","nvim-tree","terminal","ai-coding","michaelmonetized"]},{"title":"hustlemail.com: $8/mo email-marketing lander with missing /signup","slug":"hustlemail-com-eight-dollar-lander-missing-signup","url":"https://www.michaelchurley.com/blog/hustlemail-com-eight-dollar-lander-missing-signup","markdown":"https://www.michaelchurley.com/blog/hustlemail-com-eight-dollar-lander-missing-signup.md","date":"2026-06-22","description":"Private Next 16 marketing shell for HustleMail (Free / $8 Pro / $24 Business, Mailchimp vs ConvertKit comparison table, docs index full of dead child links, CTAs to /signup and /login that do not exist). No README. 3 commits. HEAD ab984f2. Sibling Resend+Convex hustlemail mail client is a different repo.","tags":["hustlemail-com","hustlemail","email-marketing","marketing-site","nextjs","tailwind","pricing","convertkit","mailchimp","lander","michaelmonetized"]},{"title":"Sonny's Shining: I wrote a rubber-hose beat-em-up tragedy before I picked an engine","slug":"sonnys-shining-rubber-hose-beat-em-up","url":"https://www.michaelchurley.com/blog/sonnys-shining-rubber-hose-beat-em-up","markdown":"https://www.michaelchurley.com/blog/sonnys-shining-rubber-hose-beat-em-up.md","date":"2026-06-22","description":"I shipped Sonny's Shining as a Fleischer-noir beat-em-up bible (GDD, novel, screenplay) plus a Next.js 16 newspaper site with an $8 Stripe preorder aimed at Christmas 2026.","tags":["sonnys-shining","indie-game","beat-em-up","rubber-hose","noir","nextjs","stripe","gdd","fleischer","martech"]},{"title":"orclawstrator: I built the OpenClaw command center in Swift, then archived it for a Go TUI","slug":"orclawstrator-swift-appkit-to-go-tui-openclaw-gateway","url":"https://www.michaelchurley.com/blog/orclawstrator-swift-appkit-to-go-tui-openclaw-gateway","markdown":"https://www.michaelchurley.com/blog/orclawstrator-swift-appkit-to-go-tui-openclaw-gateway.md","date":"2026-06-22","description":"Orclawstrator is the dual-runtime OpenClaw agent command center: Feb 2026 Swift AppKit plus SQLite and Gateway WS on :3377, then a Jun nightly that archived AppKit under swift-appkit/ and made the Bubble Tea TUI the recommended surface on the same ~/.orclawstrator/cache.db. Eight commits. HEAD 01d9a20. Separate from mission-control and hurley-mission-control.","tags":["orclawstrator","openclaw","swift","appkit","go","bubbletea","tui","sqlite","graphite","vercel","github-cli","macos","agent-orchestration","michaelmonetized"]},{"title":"iPro.golf: the golf course & resort marketing agency lander — not iLeague, not iTour","slug":"ipro-golf-agency-lander-ecosystem-hub","url":"https://www.michaelchurley.com/blog/ipro-golf-agency-lander-ecosystem-hub","markdown":"https://www.michaelchurley.com/blog/ipro-golf-agency-lander-ecosystem-hub.md","date":"2026-06-22","description":"HurleyUS/iPro-main-web is the live agency site for courses and resorts (ipro.golf): Next 16 pages, retainers $1,997 to $9,997+, ecosystem Coming Soon shells, iconference.golf rewritten to /iconf. Sibling vault michaelmonetized/iPro was SKIP. Distinct from ileague creator SaaS and itour season lander. 10 commits, HEAD b8dfdba.","tags":["ipro","ipro-golf","golf-marketing","agency","golf-course","resort","country-club","ecosystem-hub","ileague","itour","iconference","nextjs","vercel","shadcn","hurleyus"]},{"title":"hustledesk.com: $8 flat helpdesk lander vs WordPress domain","slug":"hustledesk-com-eight-dollar-helpdesk-lander-wordpress-domain","url":"https://www.michaelchurley.com/blog/hustledesk-com-eight-dollar-helpdesk-lander-wordpress-domain","markdown":"https://www.michaelchurley.com/blog/hustledesk-com-eight-dollar-helpdesk-lander-wordpress-domain.md","date":"2026-06-22","description":"hustledesk-com is a three-commit Next 16 lander selling $8 flat helpdesk tickets while hustledesk.com still serves a WordPress Make extra income parking page. The app subdomain 301s to that WordPress home; the Vercel project alias is DEPLOYMENT_NOT_FOUND.","tags":["hustledesk-com","hustledesk","helpdesk","zendesk-alternative","support-tickets","marketing-site","nextjs","tailwind","pricing","wordpress","lander","michaelmonetized"]},{"title":"redactthing: streamer PII Chrome extension that still ships unused jQuery and a 404 lander","slug":"redactthing-streamer-pii-mv3-jquery-ghost-iframe-gap","url":"https://www.michaelchurley.com/blog/redactthing-streamer-pii-mv3-jquery-ghost-iframe-gap","markdown":"https://www.michaelchurley.com/blog/redactthing-streamer-pii-mv3-jquery-ghost-iframe-gap.md","date":"2026-06-22","description":"Public michaelmonetized/redactthing is a Manifest V3 Chrome extension for streamers: one-click redact/blur/mask/hide of emails, phones, and custom PII via MutationObserver. HEAD 5c4661c. 7 commits. June 22 nightly rewrote foreground.js to vanilla JS — jquery.js stays in the manifest unused. Google Sites fails on iframe piles. hustlelaunch.com/redactthing 404s. ROADMAP describes a different product.","tags":["redactthing","chrome-extension","manifest-v3","privacy","pii","streaming","mutation-observer","jquery","google-sites","hustlelaunch","michaelmonetized"]},{"title":"shipprep: default APPLY for the HurleyUS JS shipping standard","slug":"shipprep-default-apply-biome-tsgo-blacksmith-vercel-off","url":"https://www.michaelchurley.com/blog/shipprep-default-apply-biome-tsgo-blacksmith-vercel-off","markdown":"https://www.michaelchurley.com/blog/shipprep-default-apply-biome-tsgo-blacksmith-vercel-off.md","date":"2026-06-22","description":"Private Bun CLI (403-line bin/shipprep.mts) that migrates a Next/Bun project root onto Biome+tsgo scripts, Caddy localhost helpers, freview pre-push, Blacksmith ship.yml, and vercel.json with Git auto-deploys disabled on main/master. --audit is opt-in. 6 commits. HEAD c35a9d8.","tags":["shipprep","bun","cli","biome","tsgo","blacksmith","vercel","freview","shipping-standard","dev-tooling","caddy","michaelmonetized"]},{"title":"Assessment-Toolbar: pink SEO chrome bar that promises Lighthouse and double-injects itself","slug":"assessment-toolbar-chrome-mv3-lighthouse-missing-double-inject","url":"https://www.michaelchurley.com/blog/assessment-toolbar-chrome-mv3-lighthouse-missing-double-inject","markdown":"https://www.michaelchurley.com/blog/assessment-toolbar-chrome-mv3-lighthouse-missing-double-inject.md","date":"2026-06-22","description":"Assessment-Toolbar is a public Chrome MV3 pink SEO strip (HEAD 9652620, 6 commits, GPL-3.0) that ships SpyFu through Whois helpers but zero Lighthouse links despite Manifest/README claims. background.js dual-loads content.js; hustlelaunch.com/assessment-toolbar is 404.","tags":["assessment-toolbar","marketing-assessments","chrome-extension","manifest-v3","seo","spyfu","wave","lighthouse","content-scripts","hustlelaunch","michaelmonetized"]},{"title":"freview: README says five reviews — REVIEW.md actually stitches six","slug":"freview-five-reviews-six-sections-observability-gate","url":"https://www.michaelchurley.com/blog/freview-five-reviews-six-sections-observability-gate","markdown":"https://www.michaelchurley.com/blog/freview-five-reviews-six-sections-observability-gate.md","date":"2026-06-22","description":"freview (@hurleyus/freview 0.1.0, HEAD 23237d9, 22 commits) is a public zsh pre-push gate that always writes six REVIEW.md sections even though README still sells Five reviews, with observability as the undocumented sixth plus a Claude fallow-gate rewrite to push-only.","tags":["freview","fallow","scribe","pre-push","review","observability","sentry","posthog","blacksmith","zsh","bun","hurleyus"]},{"title":"hustleconvert.com: $8/mo popup lander, OptinMonster table, NXDOMAIN","slug":"hustleconvert-com-eight-dollar-popup-lander-nxdomain","url":"https://www.michaelchurley.com/blog/hustleconvert-com-eight-dollar-popup-lander-nxdomain","markdown":"https://www.michaelchurley.com/blog/hustleconvert-com-eight-dollar-popup-lander-nxdomain.md","date":"2026-06-22","description":"Private michaelmonetized/hustleconvert-com is a Next 16 popup marketing shell (Free / $8 Pro / $24 Team, OptinMonster vs Sumo table, docs index of dead child links). Auth CTAs point at app.hustleconvert.com; claimed domain NXDOMAIN; vercel.app DEPLOYMENT_NOT_FOUND. Stock create-next-app README. 3 commits. HEAD a5d3f13.","tags":["hustleconvert-com","hustleconvert","popups","exit-intent","conversion","optinmonster","sumo","marketing-site","nextjs","tailwind","pricing","lander","michaelmonetized"]},{"title":"hustlechat.com: Intercom-alt lander that claims Convex with no Convex dep","slug":"hustlechat-com-intercom-alt-convex-claims-parkweb","url":"https://www.michaelchurley.com/blog/hustlechat-com-intercom-alt-convex-claims-parkweb","markdown":"https://www.michaelchurley.com/blog/hustlechat-com-intercom-alt-convex-claims-parkweb.md","date":"2026-06-22","description":"Private Next 16 live-chat marketing shell — Free/$0 · Teams $8 · Premium $18 · Enterprise $28 vs Intercom $74+/Drift $2,500+/Crisp $25+. Copy says powered by Convex; package.json has next/react only. Fake @hustlechat/* SDKs, github.com/hustlechat 404, app/cdn NXDOMAIN. Live hustlechat.com is GoDaddy parkweb (/lander). Demo ChatWidget is setState. 3 commits. HEAD a570134.","tags":["hustlechat-com","hustlechat","live-chat","intercom-alternative","convex","marketing-site","nextjs","tailwind","pricing","parkweb","godaddy","lander","michaelmonetized"]},{"title":"buffer-cli: wp-to-buffer-pro parity in the terminal — OAuth, no scrape","slug":"buffer-cli-wpzinc-parity-agent-oauth-no-scrape","url":"https://www.michaelchurley.com/blog/buffer-cli-wpzinc-parity-agent-oauth-no-scrape","markdown":"https://www.michaelchurley.com/blog/buffer-cli-wpzinc-parity-agent-oauth-no-scrape.md","date":"2026-06-22","description":"buffer-cli is a public Bun + commander CLI (HEAD 778ecaf, 3 commits, ~1892 LOC) with WPZinc-shaped OAuth via localhost:9876 into ~/.buffer-cli. Gaps: no queue.ts, no --from, token refresh TODO, CHANGELOG still Unreleased.","tags":["buffer-cli","buffer","cli","typescript","bun","oauth","wpzinc","wp-to-buffer-pro","social-media","scheduler","agent","michaelmonetized"]},{"title":"hustlecrm.com: $8/user CRM lander vs legacy PHP login domain","slug":"hustlecrm-com-eight-per-user-crm-lander-legacy-php-domain","url":"https://www.michaelchurley.com/blog/hustlecrm-com-eight-per-user-crm-lander-legacy-php-domain","markdown":"https://www.michaelchurley.com/blog/hustlecrm-com-eight-per-user-crm-lander-legacy-php-domain.md","date":"2026-06-22","description":"Private Next 16 marketing shell for HustleCRM (HEAD 2c50bbb, 3 commits): HubSpot/Pipedrive/Salesforce comparison, $8/user/mo Pro + 14-day free trial, Kanban demo chrome, docs/API cards with hash hrefs. Live hustlecrm.com still serves a 2023 Bootstrap PHP login; Vercel aliases 404.","tags":["hustlecrm-com","hustlecrm","crm","pipeline","kanban","hubspot-alternative","salesforce-alternative","marketing-site","nextjs","tailwind","pricing","php","lander","michaelmonetized"]},{"title":"animated-gradient-border: transparent glass with a spinning conic ring","slug":"animated-gradient-border-transparent-mask-composite","url":"https://www.michaelchurley.com/blog/animated-gradient-border-transparent-mask-composite","markdown":"https://www.michaelchurley.com/blog/animated-gradient-border-transparent-mask-composite.md","date":"2026-06-22","description":"animated-gradient-border is a public CSS lab (HEAD 5e9b611, 5 commits, empty README) that keeps a spinning conic ring via mask-composite: exclude so the video plate shows through the middle. Sibling to glass-design-system AnimatedBorder; open index.html locally.","tags":["animated-gradient-border","css","glassmorphism","conic-gradient","mask-composite","css-property","transparent-border","hustlelaunch","static-html","michaelmonetized"]},{"title":"hustleforms.com: $8/mo CRM form lander, Typeform table, NXDOMAIN","slug":"hustleforms-com-eight-dollar-crm-form-lander-nxdomain","url":"https://www.michaelchurley.com/blog/hustleforms-com-eight-dollar-crm-form-lander-nxdomain","markdown":"https://www.michaelchurley.com/blog/hustleforms-com-eight-dollar-crm-form-lander-nxdomain.md","date":"2026-06-22","description":"Private michaelmonetized/hustleforms-com is a Next 16 marketing shell (Free / $8 Pro / $24 Business, Typeform/Jotform/Wufoo table, docs hash-anchor index). CTAs hit local /signup|/login|/contact with no pages; hustleforms.com NXDOMAIN; vercel.app DEPLOYMENT_NOT_FOUND. Stock create-next-app README. 3 commits. HEAD 80c54f4.","tags":["hustleforms-com","hustleforms","forms","form-builder","crm","typeform","jotform","wufoo","marketing-site","nextjs","tailwind","pricing","lander","michaelmonetized"]},{"title":"mkproject: bash scaffold that ships .env-safe git init + RUNAFTER","slug":"mkproject-bash-scaffold-template-git-init-runafter","url":"https://www.michaelchurley.com/blog/mkproject-bash-scaffold-template-git-init-runafter","markdown":"https://www.michaelchurley.com/blog/mkproject-bash-scaffold-template-git-init-runafter.md","date":"2026-06-22","description":"Public 76-line Shell CLI that copies ~/.config/mkproject/template, git inits with branch+commit message from .env, and runs RUNAFTER (default code .). The tool that created empty-junk siblings mkproject-1 and 49. 9 commits. HEAD 321012c.","tags":["mkproject","bash","cli","scaffold","git-init","template","dotenv","dev-tooling","project-bootstrap","michaelmonetized"]},{"title":"new-design-gallery: I shipped a catalog UX, not another tabbed lander kit","slug":"new-design-gallery-embla-catalog-not-landers","url":"https://www.michaelchurley.com/blog/new-design-gallery-embla-catalog-not-landers","markdown":"https://www.michaelchurley.com/blog/new-design-gallery-embla-catalog-not-landers.md","date":"2026-06-22","description":"I stood up new-design-gallery — Embla carousel, category filters, Radix lightbox, Web Share/clipboard, and per-slug detail routes for 11 catalog cards. Live on new-design-gallery.vercel.app. Same March 28 day as mockup-gallery; different product.","tags":["new-design-gallery","design-gallery","nextjs","embla","tailwind","catppuccin","vitest","vercel","portfolio","martech","catalog"]},{"title":"WhisperCPPonEverything: Ctrl+W streaming STT menubar, cyan glow, whisper-stream","slug":"whispercpponeverything-ctrl-w-streaming-stt-cyan-glow","url":"https://www.michaelchurley.com/blog/whispercpponeverything-ctrl-w-streaming-stt-cyan-glow","markdown":"https://www.michaelchurley.com/blog/whispercpponeverything-ctrl-w-streaming-stt-cyan-glow.md","date":"2026-06-22","description":"Private Swift Package macOS menubar dictation (WhisperCPPonEverything 2.0.0, HEAD d33e5e2, 11 commits): Ctrl+W toggles idle/streaming, spawns Homebrew whisper-stream + ggml-medium, injects via CGEvent with suffix-prefix dedupe and a soft cyan 20-layer glow, plus macOS 15+ listen/post event access. README still describes the batch orange/silence path; renamed from VoiceType.","tags":["whispercpponeverything","whisper.cpp","whisper-stream","speech-to-text","stt","dictation","menubar","macos","swift","swift-package","cgevent","accessibility","local-ai","michaelmonetized"]},{"title":"neovim-ide: the GIGACHAD of NvChad is a tmux layout (ollama ASCII, cursor-agent reality)","slug":"neovim-ide-tmux-gigachad-layout-cursor-agent","url":"https://www.michaelchurley.com/blog/neovim-ide-tmux-gigachad-layout-cursor-agent","markdown":"https://www.michaelchurley.com/blog/neovim-ide-tmux-gigachad-layout-cursor-agent.md","date":"2026-06-22","description":"Public michaelmonetized/neovim-ide: zsh + tmux launcher that builds an IDE-shaped pane grid (Agent | Neovim | Tasks/Git + Console/Terminal). Banner still draws ollama; init starts cursor-agent. README says MIT, LICENSE.md is GPL-3.0, package.json ISC. install.sh is 0 bytes. Ink CLI never calls tmux. 9 commits. HEAD 38ed773.","tags":["neovim-ide","neovim","nvim","tmux","nvchad","zsh","cursor-agent","lazygit","ink","bun","ide-layout","michaelmonetized"]},{"title":"devhost: Ink TUI + Caddy :80 multi-project .localhost manager","slug":"devhost-ink-tui-caddy-port80-multihost","url":"https://www.michaelchurley.com/blog/devhost-ink-tui-caddy-port80-multihost","markdown":"https://www.michaelchurley.com/blog/devhost-ink-tui-caddy-port80-multihost.md","date":"2026-06-22","description":"Private michaelmonetized/devhost is a Bun+Ink host manager: sequential ports from 3001, /etc/hosts DEVHOST markers, Caddy :80 reverse_proxy to each project, start/stop/open lifecycle + TUI. 1 commit (+1426). HEAD db69995. Live config still lists bestwnc-com.localhost. Distinct from bundx-init HTTPS Next patcher.","tags":["devhost","caddy","ink","tui","bun","localhost","local-dev","reverse-proxy","hosts-file","cli","react","michaelmonetized"]},{"title":"shagent: Bun MCP + OpenRouter free loop after I deleted the Zsh shell harness","slug":"shagent-bun-mcp-openrouter-after-zsh-harness-delete","url":"https://www.michaelchurley.com/blog/shagent-bun-mcp-openrouter-after-zsh-harness-delete","markdown":"https://www.michaelchurley.com/blog/shagent-bun-mcp-openrouter-after-zsh-harness-delete.md","date":"2026-06-22","description":"Public michaelmonetized/shagent: May init was a 258-line Zsh THOUGHT/COMMAND OpenRouter harness (rg/fd/eza/bat, mcp-cli, qmd). Jun 22 nightly deleted src/shagent.sh and shipped Bun CLI + MCP filesystem client + OpenRouter JSON tool loop (max 15 turns, default openrouter/free). Empty README. Marketing index.html is fiction (Rusty P. Shackelford). 3 commits. HEAD 61ecd7d. Sibling orclawstrator is a different repo.","tags":["shagent","bun","typescript","mcp","model-context-protocol","openrouter","cli","agent","zsh","filesystem-mcp","chrome-devtools-mcp","michaelmonetized"]},{"title":"nfglyph: Bun raw-ANSI Nerd Font picker — fuzzy names, Linux quit fixed","slug":"nfglyph-bun-ansi-nerd-font-picker-linux-quit","url":"https://www.michaelchurley.com/blog/nfglyph-bun-ansi-nerd-font-picker-linux-quit","markdown":"https://www.michaelchurley.com/blog/nfglyph-bun-ansi-nerd-font-picker-linux-quit.md","date":"2026-06-03","description":"Public michaelmonetized/nfglyph: zero-dep Bun TUI glyph picker with vim motions. Jan 30 shipped Unicode range-scan + hex search; Jun 1 upgraded to Nerd Fonts 3.4.0 glyphs.json (50,174 named) + fuzzyMatch; Jun 3 fixed Linux quit (keepAlive vs process.exit) and clipboard cascade pbcopy->wl-copy->xclip->xsel. README still says 15k+ / hex-only. 4 commits. HEAD 1dfdc82.","tags":["nfglyph","nerd-fonts","glyph-picker","tui","bun","typescript","ansi","vim","clipboard","linux","fuzzy-search","cli","michaelmonetized"]},{"title":"svganimator: Electron Svgator clone → Canaveral monorepo SVG keyframe studio","slug":"svganimator-electron-to-canaveral-keyframe-export-studio","url":"https://www.michaelchurley.com/blog/svganimator-electron-to-canaveral-keyframe-export-studio","markdown":"https://www.michaelchurley.com/blog/svganimator-electron-to-canaveral-keyframe-export-studio.md","date":"2026-05-14","description":"Public HurleyUS/svganimator: May 3 Electron Svgator-inspired animator + inspiration scrape; May 4 exports + migrate to Bun Canaveral monorepo. HEAD keeps package name canaveral but product identity SVG Animator; @canaveral/svg (963 LOC Zod schemas, svg/lottie/gif/mkv), TanStack web studio, Electron shell, Expo card. 13 commits. HEAD 86bb4a2. Sibling surfaces: private HurleyUS/canaveral launch pad; local draw-on Bun SVGanimator; tsxsvg plan-only.","tags":["svganimator","svg","animation","keyframes","lottie","export","canaveral","bun","tanstack-start","tanstack-router","zustand","zod","electron","expo","resvg","blacksmith","freview","fallow","hurleyus"]},{"title":"Canaveral: Bun TanStack Start launch pad — web, Electron, Expo, Caddy","slug":"canaveral-bun-tanstack-start-web-desktop-mobile-caddy","url":"https://www.michaelchurley.com/blog/canaveral-bun-tanstack-start-web-desktop-mobile-caddy","markdown":"https://www.michaelchurley.com/blog/canaveral-bun-tanstack-start-web-desktop-mobile-caddy.md","date":"2026-05-14","description":"Canaveral is a private HurleyUS Bun monorepo launch pad (TanStack Start web, Electron, Expo, shared) with in-repo Caddy at canaveral.localhost:5337 and a ten-check freview gate. HEAD df2c041; eleven commits; AGENTS.md still oversells the Biome to house to freview path while package.json lint is oxlint-only.","tags":["canaveral","tanstack-start","tanstack-router","bun","monorepo","caddy","localhost","electron","expo","clerk","convex","stripe","resend","sentry","posthog","biome","tsgo","freview","fallow","blacksmith","hurleyus"]},{"title":"HurleyUS Agent SOP: Ship or shut up, OpenClaw memory layers, DHH gstack mandate","slug":"hurleyus-sop-ship-or-shut-up-openclaw-dhh-gstack","url":"https://www.michaelchurley.com/blog/hurleyus-sop-ship-or-shut-up-openclaw-dhh-gstack","markdown":"https://www.michaelchurley.com/blog/hurleyus-sop-ship-or-shut-up-openclaw-dhh-gstack.md","date":"2026-03-31","description":"Public single-file AGENT_SOP.md (548 lines, v1.0, HEAD c418e5e, 2 commits) for HurleyUS agents: Ship or shut up, ~/.openclaw/workspace memory layers, hard rules, Graphite/send-agent, plus PR #2 DHH research-first + gstack + deploy discipline. Docs-only; distinct from hurley-mission-control.","tags":["hurleyus-sop","agent-sop","openclaw","gstack","dhh","graphite","nextjs-16","convex","operations","hurleyus","agent-ops","standard-operating-procedure"]},{"title":"notion-cli: OpenClaw/Claude Code Notion API skill — CRUD, filters, Markdown","slug":"notion-cli-openclaw-skill-crud-markdown-property-filter","url":"https://www.michaelchurley.com/blog/notion-cli-openclaw-skill-crud-markdown-property-filter","markdown":"https://www.michaelchurley.com/blog/notion-cli-openclaw-skill-crud-markdown-property-filter.md","date":"2026-03-28","description":"Public michaelmonetized/notion-cli: Bun/TS Notion API CLI for agents — db/page/pages/block/search subcommands, -p/-n property filters, page→Markdown, SKILL.md + setup for OpenClaw/Codex. package 1.0.0 vs banner v2.0.0; DELIVERY still flat list-databases; spaces/page/search modules unused by cli. 1 commit. HEAD 5309974.","tags":["notion-cli","notion","cli","typescript","bun","openclaw","claude-code","agent","markdown","skill","crud","michaelmonetized"]},{"title":"resendld: OpenClaw Resend inbound daemon — poll, hooks/agent, Caddy UI","slug":"resend-listening-daemon-openclaw-poll-hooks-agent-caddy","url":"https://www.michaelchurley.com/blog/resend-listening-daemon-openclaw-poll-hooks-agent-caddy","markdown":"https://www.michaelchurley.com/blog/resend-listening-daemon-openclaw-poll-hooks-agent-caddy.md","date":"2026-03-27","description":"Public michaelmonetized/resend-listening-daemon (resendld 0.0.0-rc.0, HEAD 4fbec17, 46 commits): Bun daemon polls Resend /emails/receiving every 5s via pure fetch, stores markdown under ~/.openclaw/workspace/mail/, dispatches to OpenClaw /hooks/agent (cron fallback), with Convex + TanStack Start web at https://resendld.localhost via Caddy. install.sh covers macOS+Arch; afternoon of resend-cli PATH hell before zero-CLI.","tags":["resend-listening-daemon","resendld","resend","openclaw","daemon","email","bun","typescript","convex","tanstack-start","caddy","hooks","telegram","macos","arch-linux","michaelmonetized"]},{"title":"codemail: mail.config.ts founder email — per-domain, not per-seat","slug":"codemail-mail-config-as-code-founder-email-infra","url":"https://www.michaelchurley.com/blog/codemail-mail-config-as-code-founder-email-infra","markdown":"https://www.michaelchurley.com/blog/codemail-mail-config-as-code-founder-email-infra.md","date":"2026-03-26","description":"Private michaelmonetized/codemail: Turborepo mail stack where mail.config.ts is law (Convex + Clerk + Resend + Fly SMTP + Next web mail/dashboard). Pricing Free Forever BYO keys / $8 Simple / $80 Managed. README still lists IMAP; PLAN marks IMAP out of MVP. Live codemail-web.vercel.app 200; codemail.vercel.app 500. 27 commits. HEAD e9fece4.","tags":["codemail","email","mail-config","infrastructure","convex","clerk","resend","smtp","nextjs","turborepo","founder","michaelmonetized"]},{"title":"milkup: TipTap+Convex WYSIWYG that still ships a Milkdown README","slug":"milkup-tiptap-convex-wysiwyg-stale-milkdown-readme","url":"https://www.michaelchurley.com/blog/milkup-tiptap-convex-wysiwyg-stale-milkdown-readme","markdown":"https://www.michaelchurley.com/blog/milkup-tiptap-convex-wysiwyg-stale-milkdown-readme.md","date":"2026-03-25","description":"Public michaelmonetized/milkup: same-day 9-commit arc (2026-03-25). Milkdown+Convex POC → mock strip → TipTap WYSIWYG + Convex listMedia → React19/Next14.2 CVE pin → Next16 → Opus QA deletes milkdown-video-plugin. README still markets Next15/Milkdown/MOCK_MEDIA/!video[](). HEAD 45fb587. Video insert is ![Video](url). No upload mutations.","tags":["milkup","tiptap","wysiwyg","convex","nextjs","react","markdown","html-to-markdown","media-picker","milkdown","typescript","michaelmonetized"]},{"title":"simple: Next.js 16 Firebase auth starter — social login, keep-Firebase decision","slug":"simple-nextjs-firebase-auth-social-keep-decision","url":"https://www.michaelchurley.com/blog/simple-nextjs-firebase-auth-social-keep-decision","markdown":"https://www.michaelchurley.com/blog/simple-nextjs-firebase-auth-social-keep-decision.md","date":"2026-03-23","description":"Public michaelmonetized/simple: Next 16 + React 19 Firebase Auth/Firestore starter — email+password, Twitter/Facebook/Google connect, AuthProvider, CRUD helpers, clamp spacing + Catppuccin tokens. Launch-week: CVE bumps, security headers, console strip, docs keep-Firebase vs Convex. HEAD da7e0b0 · 10 commits. Vercel homepage DEPLOYMENT_NOT_FOUND; create-next-app README; login page still named RegisterPage.","tags":["simple","nextjs","react","firebase","firestore","auth","social-login","typescript","tailwind","vercel","security-headers","convex","starter","boilerplate","michaelmonetized"]},{"title":"hurley-mission-control: I put humans and agents in the same thread model","slug":"hurley-mission-control-human-agent-comms","url":"https://www.michaelchurley.com/blog/hurley-mission-control-human-agent-comms","markdown":"https://www.michaelchurley.com/blog/hurley-mission-control-human-agent-comms.md","date":"2026-03-22","description":"Hurley Mission Control is the Convex + Clerk + Next plane where users.kind is human|agent. Deliveries, idempotent sends, 2s poll. Not the Go TUI. Not mission-control-os. Daemon still stubs.","tags":["hurley-mission-control","mission-control","convex","clerk","nextjs","agents","openclaw","hurleyus","realtime","deliveries"]},{"title":"ConnectedIn: MV3 LinkedIn auto-connect Chrome extension","slug":"connectedin-mv3-linkedin-auto-connect-chrome-extension","url":"https://www.michaelchurley.com/blog/connectedin-mv3-linkedin-auto-connect-chrome-extension","markdown":"https://www.michaelchurley.com/blog/connectedin-mv3-linkedin-auto-connect-chrome-extension.md","date":"2026-03-21","description":"Public michaelmonetized/ConnectedIn is a Manifest V3 Chrome extension that auto-clicks LinkedIn Connect buttons with configurable 100-5000ms delays, popup stats, chrome.storage.sync persistence, and a ~1,100 connects/week rate-limit warning. Same-afternoon 2-commit ship (init + INSTALL.md). HEAD a6236fa. Gaps: no content_scripts registration, missing images/icons.","tags":["connectedin","linkedin","chrome-extension","manifest-v3","auto-connect","content-script","popup","rate-limit","martech","michaelmonetized","hurleyus"]},{"title":"Agent OS: Bun + Ink + WebSocket shell-native orchestrator","slug":"agent-os-bun-ink-websocket-zsh-orchestrator","url":"https://www.michaelchurley.com/blog/agent-os-bun-ink-websocket-zsh-orchestrator","markdown":"https://www.michaelchurley.com/blog/agent-os-bun-ink-websocket-zsh-orchestrator.md","date":"2026-03-21","description":"HurleyUS Agent OS is a public Ink + WebSocket + interactive-zsh orchestrator (HEAD f66fffa, 2 commits) with a Mission Control Phase 1 seed and a separate Anthropic core.ts persona queue. Local only on ws://localhost:9999; SDK dep missing and .env still tracked.","tags":["agent-os","hurleyus","bun","ink","websocket","zsh","orchestrator","mission-control","openclaw","anthropic","terminal-ui","michaelmonetized"]},{"title":"stripe-convex: I shipped a Theo-compliant Stripe+Convex library — and never published the package","slug":"stripe-convex-email-payments-theo-unpublished","url":"https://www.michaelchurley.com/blog/stripe-convex-email-payments-theo-unpublished","markdown":"https://www.michaelchurley.com/blog/stripe-convex-email-payments-theo-unpublished.md","date":"2026-03-20","description":"Public michaelmonetized/stripe-convex is a TypeScript Stripe + Convex payment library (email-indexed sc_* tables, cart/coupons, Pay/AddToCart/Checkout/Has, 19 webhook events, Theo sync/portal helpers). package.json 0.1.0 with a release workflow and README version badge, yet zero GitHub Releases and registry 404; LICENSE still says Michael Shilman. HEAD 22e099e (PR #13). 11 commits.","tags":["stripe-convex","stripe","convex","payments","subscriptions","cart","coupons","typescript","webhooks","theo","t3","saas","billing","michaelmonetized"]},{"title":"MyBathroomConversion.com: Elementor Opt-In → SalesPromis, then I deleted the xdebug_info() probe","slug":"mybathroomconversion-elementor-salespromis-xdebug-purge","url":"https://www.michaelchurley.com/blog/mybathroomconversion-elementor-salespromis-xdebug-purge","markdown":"https://www.michaelchurley.com/blog/mybathroomconversion-elementor-salespromis-xdebug-purge.md","date":"2026-02-27","description":"www.mybathroomconversion.com is a SalesPromis/Hustle Launch Elementor lander whose child theme already POSTs Opt In leads to api.salespromis.com while PLAN.md once claimed lead capture Not Started. Feb 27 HEAD dc5a091 deleted webroot xdebug_info(); WP File Manager 7.2.9 and a hardcoded API key remain.","tags":["mybathroomconversion","wordpress","elementor","wp-engine","salespromis","remodelingloans","leadgen","bathroom-remodel","security","xdebug","hustle-launch"]},{"title":"Boilerplate: Clerk + Drizzle + Stripe Next shell, CVE-bumped to 16","slug":"boilerplate-clerk-drizzle-stripe-next16-cve","url":"https://www.michaelchurley.com/blog/boilerplate-clerk-drizzle-stripe-next16-cve","markdown":"https://www.michaelchurley.com/blog/boilerplate-clerk-drizzle-stripe-next16-cve.md","date":"2026-02-22","description":"boilerplate is a private michaelmonetized Next shell with Clerk, Drizzle/@vercel/postgres subscriptions, and a Stripe webhook, CVE-bumped to Next 16.1.6 at HEAD 6f2dd2f. Live on boilerplate-fawn-gamma.vercel.app and boilerplate.hustlelaunch.com; marketing routes are still ten-line stubs.","tags":["boilerplate","nextjs","clerk","drizzle","vercel-postgres","stripe","catppuccin","hustlelaunch","saas-starter","cve","resend","michaelmonetized"]},{"title":"launchpad: NYE 2024 Hustle Launch boilerplate — README stack, unwired providers","slug":"launchpad-nye2024-boilerplate-providers-unwired","url":"https://www.michaelchurley.com/blog/launchpad-nye2024-boilerplate-providers-unwired","markdown":"https://www.michaelchurley.com/blog/launchpad-nye2024-boilerplate-providers-unwired.md","date":"2026-02-06","description":"Public michaelmonetized/launchpad is the NYE 2024 Hustle Launch premier-framework claim (Next 15 + shadcn + Clerk/Convex/PostHog providers + Resend /api/send) while app/page.tsx is still Create Next App, providers never mount in layout, no convex/ folder, Stripe unused except Theo STRIPE.md, and launchpad.hustlelaunch.com is NXDOMAIN. 8 commits. HEAD 5447591.","tags":["launchpad","hustlelaunch","nextjs","boilerplate","clerk","convex","resend","posthog","stripe","shadcn","starter","michaelmonetized"]},{"title":"iLeague-app: the generic influencer monorepo before the golf rebrand","slug":"ileague-app-influencer-monorepo-before-golf-rebrand","url":"https://www.michaelchurley.com/blog/ileague-app-influencer-monorepo-before-golf-rebrand","markdown":"https://www.michaelchurley.com/blog/ileague-app-influencer-monorepo-before-golf-rebrand.md","date":"2026-02-04","description":"Public HurleyUS/ileague-app is the Jan 9 2026 Bun monorepo (Next.js 15 + Expo 52 + Convex + Clerk + Stripe Connect) for a generic influencer/fan league platform (violet #7c3aed, isInfluencer schema, gaming-to-lifestyle categories). HEAD 7af9d80 (Feb 4) wires mobile leagues to Convex and adds eas.json; www.ileague.app is Coming Soon static, distinct from ileague.golf.","tags":["ileague-app","ileague","influencer","creator-economy","monorepo","bun","nextjs","expo","convex","clerk","stripe-connect","scaffold","before-golf","hurleyus"]},{"title":"SalesPromis: GitHub still versions a WP Engine Elementor funnel — live left for Lovable","slug":"salespromis-wp-elementor-dump-vs-lovable-live","url":"https://www.michaelchurley.com/blog/salespromis-wp-elementor-dump-vs-lovable-live","markdown":"https://www.michaelchurley.com/blog/salespromis-wp-elementor-dump-vs-lovable-live.md","date":"2026-01-31","description":"HurleyUS/SalesPromis is a private WordPress wp-content dump of an Elementor SSDI qualify funnel (Salert + HurryTimer + custom ssdi-qualify.js). Live salespromis.com is already a Lovable/Vite SPA. Two commits. HEAD only added a Stripe cursor rule.","tags":["salespromis","wordpress","elementor","wp-engine","ssdi","lead-gen","lovable","hurleyus","salert","hurrytimer","martech"]},{"title":"fab-analytics: same-day PHP+JS GA drop-in that writes JSON to disk","slug":"fab-analytics-same-day-php-js-ga-drop-in-json-disk","url":"https://www.michaelchurley.com/blog/fab-analytics-same-day-php-js-ga-drop-in-json-disk","markdown":"https://www.michaelchurley.com/blog/fab-analytics-same-day-php-js-ga-drop-in-json-disk.md","date":"2024-07-10","description":"Public michaelmonetized/fab-analytics is a 0.1.3-rc first-party Google Analytics drop-in: fab-analytics.js posts pageviews, mailto/tel clicks, and form submit/abandonment to a PHP endpoint that writes logs/{domain}/*.json under hustlelaunch.com. 31 commits in one July 2024 day to first production run; HEAD 8218088 cleanup. Empty README/LICENCE. Sibling BestWNC 2026 directory analytics is a different product.","tags":["fab-analytics","first-party-analytics","google-analytics-drop-in","php","javascript","json-logs","elementor","hustlelaunch","form-abandonment","martech","michaelmonetized","hurleyus"]},{"title":"Jennings Custom Homes: post-malware WP rebuild checklist — still on Bluehost","slug":"jenningscustomhomes-post-malware-checklist-still-on-bluehost","url":"https://www.michaelchurley.com/blog/jenningscustomhomes-post-malware-checklist-still-on-bluehost","markdown":"https://www.michaelchurley.com/blog/jenningscustomhomes-post-malware-checklist-still-on-bluehost.md","date":"2024-06-06","description":"Public Hustle-Launch/jenningscustomhomes is a 4-file WordPress ops checklist for a Highlands/Cashiers NC luxury builder rebuild after Bluehost malware. Five commits Jun 4-6 2024; HEAD ad1f91f flips nine boxes to [x] and leaves TrustIndex plus login details open. Live www.jenningscustomhomes.com still resolves to Bluehost LiteSpeed at 75.98.174.238.","tags":["jenningscustomhomes","wordpress","elementor","bluehost","malware-recovery","checklist","highlands-nc","cashiers-nc","custom-homes","hustle-launch","spf","martech"]}]}