<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://iamdanielmarino.com/">
  <title>Daniel Marino</title>
  <subtitle>Product designer living in New Hampshire</subtitle>
  <link href="https://iamdanielmarino.com/feed.xml" rel="self"/>
  <link href="https://iamdanielmarino.com/"/>
  <updated>2026-05-15T23:04:33Z</updated>
  <id>https://iamdanielmarino.com/</id>
  <author>
    <name>Daniel Marino</name>
    <email></email>
  </author>
    <entry>
      <title>Voxel editors kind of suck, so I’m vibe coding one</title>
      <link href="https://iamdanielmarino.com/posts/voxel-editors-kind-of%E2%80%93suck-so-im-vibe%E2%80%93coding%E2%80%93one/"/>
      <updated>2026-05-14T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/voxel-editors-kind-of%E2%80%93suck-so-im-vibe%E2%80%93coding%E2%80%93one/</id>
      <content xml:lang="en" type="html">&lt;p&gt;I’ve been working on a new CSS-only game idea, and finally settled on voxel-like artwork. But building voxels in HTML/CSS isn’t that fun. I was vibe coding a web-based editor to go along with it, but it started getting sluggish and complicated to use. I more or less abandoned it in favor of using a real voxel editor to create the artwork — I figured I’d export the work and use AI to convert it to HTML/CSS.&lt;/p&gt;
&lt;h2&gt;The voxel editor landscape is rough&lt;/h2&gt;
&lt;p&gt;I tried a handful of voxel editors: MagicaVoxel, Goxel, and Voxelator.&lt;/p&gt;
&lt;p&gt;The first thing I learned is that it’s apparently required for a voxel editor to have “oxel” the name.&lt;/p&gt;
&lt;p&gt;The second thing I learned is that voxel editors kind of suck. The UI is either too complex or too unintuitive to learn. &lt;a href=&quot;https://goxel.xyz/&quot;&gt;Goxel&lt;/a&gt; was the closest to &lt;em&gt;easy-to-use&lt;/em&gt;, but it died while exporting my file. Not great.&lt;/p&gt;
&lt;p&gt;Also, I’m on a Mac. None of those titles feel native — they all feel like Windows apps in a wrapper. That’s a deal-breaker for me. I’m used to polished software like &lt;a href=&quot;https://figma.com/&quot;&gt;Figma&lt;/a&gt;, &lt;a href=&quot;https://www.affinity.studio/&quot;&gt;Affinity&lt;/a&gt;, &lt;a href=&quot;https://www.sketch.com/&quot;&gt;Sketch&lt;/a&gt;, &lt;a href=&quot;https://zed.dev/&quot;&gt;Zed&lt;/a&gt;, and &lt;a href=&quot;https://retcon.app/&quot;&gt;Retcon&lt;/a&gt;. I want software that feels native, looks good, and is smooth. I really struggle to use anything that’s less.&lt;/p&gt;
&lt;h2&gt;Enter Roxel&lt;/h2&gt;
&lt;p&gt;So I’m taking a detour from the game. I’m now vibe coding a voxel editor called &lt;strong&gt;Roxel&lt;/strong&gt;, and &lt;a href=&quot;https://github.com/starzonmyarmz/roxel&quot;&gt;I’m doing it in the open&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/roxel.jpg&quot; alt=&quot;Roxel&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;Rust is fast, and you can build good-looking native apps with it for Mac and Windows (&lt;a href=&quot;https://zed.dev/&quot;&gt;Zed&lt;/a&gt; is a great example). The stack ended up being Rust + &lt;a href=&quot;https://bevy.org/&quot;&gt;Bevy&lt;/a&gt; + &lt;a href=&quot;https://www.egui.rs/&quot;&gt;egui&lt;/a&gt; — or so Claude tells me.&lt;/p&gt;
&lt;h2&gt;On vibe coding something you can’t write&lt;/h2&gt;
&lt;p&gt;Here’s the honest part: I can’t write Rust. But I can &lt;em&gt;review&lt;/em&gt; Rust — and it turns out that’s enough.&lt;/p&gt;
&lt;p&gt;I’ve got Claude Code running in a terminal in the background most of the day. I’ve been in the game long enough to know what quality software looks and feels like. I know what makes a good codebase: lean, simple, tested, CI, the usual. I’ve used enough design software to know what an efficient workflow feels like — the tools, the layout, the UI, the UX.&lt;/p&gt;
&lt;p&gt;That taste is the thing I’m actually bringing to the project. The Rust is just the medium.&lt;/p&gt;
&lt;h2&gt;Where it’s headed&lt;/h2&gt;
&lt;p&gt;It’s been a few days of vibing, but I’m impressed enough with how it’s coming along that I really feel like this app has wheels. Claude and I worked on building out a logo, identity, and branding together. I think it could be a solid contender for the indie or hobby designer.&lt;/p&gt;
&lt;p&gt;But I’m not putting pressure on myself. I’m building it for me, so I can make a single game. Maybe it’ll turn into a viable app. Maybe I’ll find a niche. Maybe I’ll find the one or two things other voxel editors don’t have.&lt;/p&gt;
&lt;p&gt;Either way — I’ve got a working voxel editor on my Mac that I didn’t have a week ago. That’s already a win.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Letting Claude Teach Me</title>
      <link href="https://iamdanielmarino.com/posts/letting-claude-teach-me/"/>
      <updated>2026-05-04T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/letting-claude-teach-me/</id>
      <content xml:lang="en" type="html">&lt;p&gt;Now that I use AI regularly to help write code and complete tasks, I find myself in a position where I’m not learning as much as I used to. That feels a bit crummy.&lt;/p&gt;
&lt;p&gt;Fairly often, Claude writes code I don’t fully understand. For example: I know enough TypeScript to &lt;em&gt;be dangerous&lt;/em&gt;, but I’m definitely not an expert. Recently I had Claude take some typing I thought was overcomplicated and drastically simplify it. The new version was clearly better — I just couldn’t tell you &lt;em&gt;why&lt;/em&gt;. So I asked Claude to explain it in simple terms. Sure enough, it did.&lt;/p&gt;
&lt;p&gt;I guess that’s a silver lining to using AI: it can at least explain why it did what it did. A coworker mentioned he has Claude write one-off explanations with examples whenever this happens, and I liked that idea. So I built a &lt;a href=&quot;https://github.com/starzonmyarmz/dotfiles/tree/main/claude/.claude/skills/til&quot;&gt;skill&lt;/a&gt; around it. The skill looks at my uncommitted code, breaks it down, and writes a short blog article for me to read. I’m a fan of &lt;a href=&quot;https://www.joshwcomeau.com/&quot;&gt;Josh Comeau’s blog&lt;/a&gt; and the way he uses interactive examples to teach a concept, so I made that part of the skill too — Claude generates interactive examples alongside the explanation, then packages everything up in a small Vite environment.&lt;/p&gt;
&lt;p&gt;The first iteration was expensive to run. At least 3 minutes, and roughly 10K tokens. I’m fine burning tokens, but I’m also thrifty 😬. The second iteration kept the Vite environment and styles already wired up, so Claude only had to write the article and the examples. That brought it down to about a minute and 7K tokens. Better — though I’d still like to get the token usage lower.&lt;/p&gt;
&lt;p&gt;The blog format is great, but it’s a lot of work (for Claude) to generate all of this just to delete it when I’m done reading. It’d be nice to have these articles persist somewhere I could revisit later, or share with other people. That brought me to my current iteration.&lt;/p&gt;
&lt;p&gt;It’s an &lt;a href=&quot;https://github.com/starzonmyarmz/til&quot;&gt;Astro project&lt;/a&gt; that lives on GitHub. The skill works roughly the same way — review uncommitted code, generate a post complete with interactive examples — but now it publishes to a &lt;a href=&quot;https://til.iamdanielmarino.com/&quot;&gt;TIL subdomain&lt;/a&gt; where I can read the articles at my leisure or pass them along.&lt;/p&gt;
&lt;p&gt;It’s all vibe coded, and that feels appropriate. I’m up front about it on the site itself: &lt;em&gt;Things Claude changed that I didn’t understand — explained… by Claude.&lt;/em&gt; I’ll probably keep tinkering to bring the token usage down further, but it was a fun project to put together, and I’m happy to let Claude teach me what it’s doing.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>What I’m Using in 2026</title>
      <link href="https://iamdanielmarino.com/posts/what-im-using-2026/"/>
      <updated>2026-01-04T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/what-im-using-2026/</id>
      <content xml:lang="en" type="html">&lt;p&gt;This is an updated list of what I’m using in 2026. I’m only sharing what’s changed since &lt;a href=&quot;https://iamdanielmarino.com/posts/what-im-using-2025&quot;&gt;last year’s list&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Applications&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.google.com/chrome/&quot;&gt;Chrome&lt;/a&gt; — Chrome was on my list last year, but I’m mentioning it again because I actually used Brave for most of 2025. I like Brave, and honestly I can’t even remember why I switched back to Chrome 🤷🏻.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chatgpt.com/&quot;&gt;ChatGPT&lt;/a&gt; — I hate that I’m listing AI tools, but if I’m going to be transparent, it has to be here. I use it a bit for code, but mostly for rewording messages or rubber-ducking ideas.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.claude.com/product/claude-code&quot;&gt;Claude Code&lt;/a&gt; — I &lt;a href=&quot;https://iamdanielmarino.com/posts/vibe-coding-and-the-existential-dread-of-progress/&quot;&gt;wrote about my thoughts and reluctance to embrace&lt;/a&gt; AI for coding. My company pays for it, so I use it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://endel.io/&quot;&gt;Endel&lt;/a&gt; — I’m &lt;a href=&quot;https://en.wikipedia.org/wiki/Neurodiversity&quot;&gt;neurodiverse&lt;/a&gt; and have been trying to be more intentional about using tools that help me stay focused. Endel is super cool and has a lot of genuinely helpful features.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hyper.is/&quot;&gt;Hyper&lt;/a&gt; — I was previously using &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt;, but switched to Hyper mostly because it feels prettier. That’s probably a dumb reason since I could have customized iTerm2, but I installed Hyper on my new machine and never felt the need to switch back.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://retcon.app/&quot;&gt;Retcon&lt;/a&gt; — My team is pretty opinionated about Git history, and rewriting history via the command line or VS Code started to feel tedious. Several coworkers use &lt;a href=&quot;https://github.com/jesseduffield/lazygit&quot;&gt;LazyGit&lt;/a&gt;, but I didn’t want another terminal-based tool. Retcon does exactly what it promises and lets me handle more advanced Git workflows without having to be a Git super-nerd.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.notion.com/&quot;&gt;Notion&lt;/a&gt; — I was using &lt;a href=&quot;https://bear.app/&quot;&gt;Bear&lt;/a&gt; for notes, but didn’t feel like I was getting enough value out of paying for it. That’s not a knock against Bear—it’s a great product. Notion’s free plan works just fine for me. I also tried &lt;a href=&quot;https://obsidian.md/&quot;&gt;Obsidian&lt;/a&gt; this year and liked it, but parts of it felt quirky. It also seemed like a bigger time investment to make it feel as polished as Notion or Bear.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt; — I tried &lt;a href=&quot;https://zed.dev/&quot;&gt;Zed&lt;/a&gt; for a bit, and there are things I really like about it. That said, I ran into a few weird and buggy behaviors that I just couldn’t get past.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Equipment&lt;/h2&gt;
&lt;p&gt;I got a 2025 M4 MacBook Pro when I started my new job this year. It’s more than powerful enough for anything I need to do.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Money Filter</title>
      <link href="https://iamdanielmarino.com/posts/the-money-filter/"/>
      <updated>2025-11-30T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/the-money-filter/</id>
      <content xml:lang="en" type="html">&lt;p&gt;One of the biggest challenges I’ve faced as a web designer is how often people expect a website for next to nothing. Somewhere along the way, the perception formed that a website is a commodity—quick, cheap, and interchangeable. So when someone asks what I charge (for a very basic marketing site), I usually reply, &lt;em&gt;“That’ll cost around $5,000.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That number isn’t a gimmick—it’s a filter. It immediately reveals who understands the craft behind the screen, who values quality, and who’s serious about investing in their own business. It separates those looking for something fast and inexpensive from those seeking something &lt;em&gt;purposeful&lt;/em&gt; and &lt;em&gt;crafted&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It used to frustrate me when people balked at the cost. Now? I see it as a helpful sorting mechanism. It shows me who I actually want to work with.&lt;/p&gt;
&lt;h2&gt;The Cost of “Cheap”&lt;/h2&gt;
&lt;p&gt;There’s no shortage of DIY website builders promising professional results at a low price. And honestly—sometimes that’s &lt;em&gt;fine&lt;/em&gt;. If you just need something quick and functional, a template might be all you need.&lt;/p&gt;
&lt;p&gt;But a boutique website is something entirely different.&lt;/p&gt;
&lt;p&gt;When you hire me, you’re not buying convenience—you’re investing in craft. A boutique site is designed &lt;em&gt;and&lt;/em&gt; engineered specifically for you. It’s not a template dressed up with new colors. It’s built intentionally, shaped around your goals, your audience, your brand’s personality, and the experience you want people to have.&lt;/p&gt;
&lt;p&gt;And cheap solutions often come with hidden costs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lost conversions&lt;/li&gt;
&lt;li&gt;poor usability and performance&lt;/li&gt;
&lt;li&gt;accessibility issues&lt;/li&gt;
&lt;li&gt;a generic, forgettable brand presence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The value of a bespoke website isn’t just in what it &lt;em&gt;does&lt;/em&gt;. It’s in &lt;em&gt;how&lt;/em&gt; it’s made—and what it communicates about you.&lt;/p&gt;
&lt;h2&gt;Why Bespoke Work Matters&lt;/h2&gt;
&lt;p&gt;When I build a custom website, it’s not just about aesthetics. It’s about alignment—making sure every part of the experience supports your story, your content, and your clients’ needs. Every choice—typography, layout, semantics, performance—is intentional.&lt;/p&gt;
&lt;p&gt;Anyone can make a website that &lt;em&gt;looks&lt;/em&gt; good.
&lt;em&gt;I handcraft websites that feel right and function beautifully.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As a &lt;strong&gt;design engineer&lt;/strong&gt;, I don’t hand off a static mockup and hope the final result captures the original intent. I design with the intent to build, carrying the project from concept to code so the final experience is cohesive, thoughtful, and true to the vision. That’s what boutique design is: every pixel and every line of code has purpose.&lt;/p&gt;
&lt;h2&gt;The Bottom Line&lt;/h2&gt;
&lt;p&gt;If you only need a website, you don’t need me.&lt;/p&gt;
&lt;p&gt;But if you want a &lt;em&gt;boutique digital experience&lt;/em&gt;—something that reflects your values, your vision, and your commitment to quality—then I’m the right fit.&lt;/p&gt;
&lt;p&gt;You’re not paying for a website. You’re paying for craftsmanship, collaboration, and care. And while not everyone values that, the right clients do. My pricing isn’t just a number—it’s a filter that helps me focus on the people who appreciate the work, the craft, and the impact it can create.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How I Handletter</title>
      <link href="https://iamdanielmarino.com/posts/how-i-handletter/"/>
      <updated>2025-09-19T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/how-i-handletter/</id>
      <content xml:lang="en" type="html">&lt;p&gt;When I first got into hand-lettering, I had a hard time finding people who shared their &lt;em&gt;full&lt;/em&gt; process—especially the digitizing phase. So here’s a look at how I typically work. Everyone’s process is different, and a lot depends on your style and how you plan to present the piece. For me, since I don’t have the steadiest hand, I tend to embrace rough, scrappy, distressed looks. Most of my work ends up digital anyway, so mistakes can be fixed later. Here’s a short process video I made a while back.&lt;/p&gt;
&lt;iframe width=&quot;100%&quot; src=&quot;https://www.youtube-nocookie.com/embed/5FnhKEcAM4E?si=65vKvS4Y2KdvPrhf&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;h2&gt;Thumbnails &amp;amp; Sketching&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Start with quick thumbnail ideas on scrap paper.&lt;/li&gt;
&lt;li&gt;Refine the chosen direction with a pencil on Bristol Paper.&lt;/li&gt;
&lt;li&gt;If possible, I use a drawing pencil (softer, lighter lead makes cleanup easier).&lt;/li&gt;
&lt;li&gt;After inking, I clean up with an art gum eraser.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Inking&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;My go-tos are &lt;strong&gt;Microns&lt;/strong&gt; in different thicknesses. In the video I sharedI used a &lt;code&gt;.08&lt;/code&gt; for outlines and &lt;code&gt;Graphic 1&lt;/code&gt; for filling letters.&lt;/li&gt;
&lt;li&gt;I used a &lt;strong&gt;Gelly Roll 10&lt;/strong&gt; to add &lt;em&gt;cut-outs&lt;/em&gt;, create depth, and fix small mistakes 😬.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Digitizing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I scan the inked artwork using &lt;a href=&quot;https://apps.apple.com/us/app/scanner-pro-scan-documents/id333710667&quot;&gt;Scanner Pro&lt;/a&gt; on iOS.&lt;/li&gt;
&lt;li&gt;Clean up in &lt;a href=&quot;https://www.pixelmator.com/pro/&quot;&gt;Pixelmator Pro&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Add textures for distress and wear (I’ve collected a bunch of texture packs over the years).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Where I’ve Used This&lt;/h2&gt;
&lt;p&gt;This is basically the same process I followed for my &lt;a href=&quot;https://states.iamdanielmarino.com/&quot;&gt;State Motto&lt;/a&gt; series, and most of my other lettering projects.&lt;/p&gt;
&lt;p&gt;Don’t be afraid to lean into your natural tendencies (like a scrappier style if your hand isn’t steady) and use the digital phase to enhance or correct. Trial and error is a huge part of it.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Vibe Coding and the Existential Dread of Progress</title>
      <link href="https://iamdanielmarino.com/posts/vibe-coding-and-the-existential-dread-of-progress/"/>
      <updated>2025-07-19T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/vibe-coding-and-the-existential-dread-of-progress/</id>
      <content xml:lang="en" type="html">&lt;p&gt;Does anyone else hate the term &lt;em&gt;vibe coding&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;I’ve been pretty resistant to incorporating AI directly into my development workflow. I use it all the time to clean up emails, Slack messages, and blog posts (including this one). It’s helped me plan vacations, write my cover letter for &lt;a href=&quot;https://www.planningcenter.com/&quot;&gt;Planning Center&lt;/a&gt;, and even gain insights from journaling. But coding? That felt like crossing a line.&lt;/p&gt;
&lt;p&gt;At first, I confined AI to repetitive tasks—&lt;a href=&quot;https://iamdanielmarino.com/posts/daily-inspirational-word/&quot;&gt;formatting long word lists into arrays&lt;/a&gt;, deciphering cryptic console errors, or exploring how to integrate Vite into a Rails codebase still using Sprockets. All helpful, but I steered clear of anything that touched “real” engineering.&lt;/p&gt;
&lt;p&gt;Still, AI isn’t going anywhere. And as much as I hate admitting how much I rely on it, it genuinely makes my life easier. So I gave &lt;em&gt;vibe coding&lt;/em&gt; a shot. Spoiler: I’m sold—with a few caveats.&lt;/p&gt;
&lt;h2&gt;Vibe Coding an Alfred Workflow&lt;/h2&gt;
&lt;p&gt;I’d played with basic &lt;a href=&quot;https://www.alfredapp.com/&quot;&gt;Alfred workflows&lt;/a&gt; before, using the built-in UI or tools like &lt;a href=&quot;https://www.npmjs.com/package/alfy&quot;&gt;Alfy&lt;/a&gt;. But I had an idea for something more complex—and neither the time nor the motivation to learn how to build it from scratch.&lt;/p&gt;
&lt;h3&gt;The Problem&lt;/h3&gt;
&lt;p&gt;At Planning Center, our design system has 300+ tokens (and counting). To grab one, I’d open our Storybook instance, scroll to the search bar, type in a few characters, click to copy, then return to my editor to paste it. Repeat that a few dozen times a day, and the friction starts to add up.&lt;/p&gt;
&lt;h3&gt;The Solution&lt;/h3&gt;
&lt;p&gt;An &lt;a href=&quot;https://github.com/starzonmyarmz/pco-tapestry-tokens-alfred&quot;&gt;Alfred workflow&lt;/a&gt; that lets me search tokens via fuzzy matching, press Enter to copy, and paste directly—eliminating multiple steps and speeding up my flow.&lt;/p&gt;
&lt;h2&gt;Using Claude Code&lt;/h2&gt;
&lt;p&gt;I’ve tried ChatGPT and GitHub Copilot. They both work well (though I find Copilot’s integration with VS Code a bit invasive). I’m not ready to pay out of pocket, so I started using Claude Code through Planning Center’s access.&lt;/p&gt;
&lt;p&gt;Setup took less than 10 minutes. &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/overview&quot;&gt;Anthropic’s documentation&lt;/a&gt; is clear, and their tips on effective usage are actually helpful.&lt;/p&gt;
&lt;h2&gt;Building the Workflow with Claude Code&lt;/h2&gt;
&lt;p&gt;I kicked things off with a prompt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I want an Alfred extension where I can enter “tt” followed by characters, and tokens from &lt;s&gt;URL redacted&lt;/s&gt; will be shown using fuzzy search.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude generated a Python script… that didn’t work. It produced a workflow Alfred couldn’t import. So I responded with:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Alfred extension fails to import.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude replied something like, &lt;em&gt;“You’re right, let me fix that,”&lt;/em&gt; and, impressively, it did.&lt;/p&gt;
&lt;p&gt;After about three hours of iterative prompts and debugging, I had a &lt;a href=&quot;https://github.com/starzonmyarmz/pco-tapestry-tokens-alfred&quot;&gt;fully functional Alfred workflow&lt;/a&gt; that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stores design tokens as a JSON database&lt;/li&gt;
&lt;li&gt;Caches data locally&lt;/li&gt;
&lt;li&gt;Refreshes if unused for over an hour&lt;/li&gt;
&lt;li&gt;Fuzzy-finds tokens on input&lt;/li&gt;
&lt;li&gt;Displays color swatches for color-based tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also used Claude to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generate 100+ color swatches (since Alfred can’t use data URIs)&lt;/li&gt;
&lt;li&gt;Write a Bash script that builds the workflow with semantic versioning&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don’t know much Python, but I know enough to skim the output and feel confident in the structure. And because this was a small, siloed project, I wasn’t concerned about maintainability or codebase conventions.&lt;/p&gt;
&lt;h2&gt;The Cost&lt;/h2&gt;
&lt;p&gt;Aside from the monthly AI access fee, the entire three-hour build process cost around $10 in usage tokens. That’s ~$3.33/hour—far below the value of my time. And now, every use of the workflow saves me 10+ seconds. That adds up quickly.&lt;/p&gt;
&lt;p&gt;If I’d tried to build this from scratch, it easily could’ve taken 10+ hours and been half as effective. That’s not even accounting for generating the color swatch images.&lt;/p&gt;
&lt;p&gt;I did spend about an hour trying to get Claude to scrape the tokens directly from the design system site, but that turned out to be unreliable. Still, the final solution works and required zero extra effort from the rest of my team.&lt;/p&gt;
&lt;h2&gt;The Pros and Cons of AI in the Workflow&lt;/h2&gt;
&lt;h3&gt;Pros&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Efficiency Boost&lt;/strong&gt;: Great at handling menial but necessary tasks—JSON formatting, token lookups, error decoding, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rapid Prototyping&lt;/strong&gt;: I built a working Alfred workflow in a single evening. Even if it were only a prototype, it would’ve been valuable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Creative Leverage&lt;/strong&gt;: Designers and PMs can use AI to sketch out ideas and flows, helping engineers jump into development faster.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cons&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Skill Stagnation&lt;/strong&gt;: Over-reliance on AI could erode problem-solving ability or deeper understanding of frameworks and languages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Job Displacement&lt;/strong&gt;: AI is replacing some roles. At Planning Center, leadership has been clear AI won’t replace people—only support them. But the broader industry picture is less certain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environmental Cost&lt;/strong&gt;: Running large AI models consumes a lot of energy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Price Tag&lt;/strong&gt;: Even if it saves time, AI access and usage can get expensive—especially if you’re footing the bill.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;So Why Do I Still Feel Icky?&lt;/h2&gt;
&lt;p&gt;It took me a while to name the feeling, but I got there: &lt;strong&gt;I’m grieving the loss of what it means to be an engineer.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I’ve spent over 20 years solving problems, building UIs, and turning ideas into code. I’ve always taken pride in being able to take a design and bring it to life. But now, what it means to be an engineer is changing—and that’s uncomfortable.&lt;/p&gt;
&lt;p&gt;I don’t want to become just a prompt wrangler. But I also don’t want to be the person who gets left behind because they refused to adapt. The logic is clear: why pay one engineer for 10 hours of work when another can produce the same result in two with AI?&lt;/p&gt;
&lt;h2&gt;Finding the Sweet Spot&lt;/h2&gt;
&lt;p&gt;I think the answer lies somewhere in the middle.&lt;/p&gt;
&lt;p&gt;Engineers should still understand their craft—be able to reason through problems, write maintainable code, and build features from scratch when needed. But AI should be a tool we use intentionally to reduce toil and accelerate progress.&lt;/p&gt;
&lt;p&gt;We don’t call it cheating when someone uses code completion. Why should this be any different?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Making an Escape Room with only HTML and CSS</title>
      <link href="https://iamdanielmarino.com/posts/making-an-escape-room-with-only-html-and-css/"/>
      <updated>2025-03-31T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/making-an-escape-room-with-only-html-and-css/</id>
      <content xml:lang="en" type="html">&lt;p&gt;&lt;strong&gt;Beware! This post includes spoilers!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I recently built an escape room game called &lt;a href=&quot;https://csscape-room.iamdanielmarino.com/&quot;&gt;CSScape Room&lt;/a&gt;. This isn’t my first JavaScript-free web game, but HTML and CSS have evolved significantly since my previous attempts, with newer additions allowing for more complex selectors and native interactions. Rather than saving this idea for a game jam, I built it purely for fun, which freed me from theme constraints and time pressure.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/escape-room-north.png&quot; alt=&quot;Screenshot of CSScape Room&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;I’ve enjoyed escape room games since childhood, and it was nostalgic to recreate that experience myself. This project pushed my artistic limits while challenging me to design puzzles and translate them into complex HTML and CSS. The learning process was fun, challenging, and sometimes tedious—mostly through trial and error.&lt;/p&gt;
&lt;h2&gt;Process&lt;/h2&gt;
&lt;p&gt;My creative process isn’t linear—it’s a blend of designing, puzzle creation, and coding that constantly influences each other. I frequently had to redesign or recode elements as the project evolved. There was also that time I accidentally deleted half my CSS because I wasn’t backing up to GitHub... lesson learned! 😬&lt;/p&gt;
&lt;p&gt;This might sound chaotic, and honestly, it was. If you’re wondering where to start with a project like this, I began by prototyping the room navigation system. I figured that was the minimum viable feature—if I couldn’t make that work, I’d abandon the project. The solution I eventually found seems simple in retrospect, but I went through several iterations to discover it.&lt;/p&gt;
&lt;p&gt;This flexible approach makes sense for my creative projects. As I build something, both the in-progress work and my growing skills inevitably influences the entire project. I’m comfortable with this non-linear process—it also suits my ADHD brain, where I tend to lose interest if I work on the same thing for too long.&lt;/p&gt;
&lt;h2&gt;Artwork&lt;/h2&gt;
&lt;p&gt;I’d wanted to design a pixel art-styled game for some time but never felt confident enough to attempt it during a game jam because of the learning curve. I watched tutorials from &lt;a href=&quot;https://www.youtube.com/adamcyounis&quot;&gt;Adam Yunis&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/channel/UCsn9MzwyPKeCE6MEGtMU4gg&quot;&gt;Mort&lt;/a&gt; to get a crash course in pixel art best practices.&lt;/p&gt;
&lt;p&gt;Initially, progress was slow. I had to figure out 2D perspective with vanishing points, determine a color palette, practice shading techniques, and decide how much detail to include. While I tried to adhere to pixel art “rules,” I definitely broke some along the way.&lt;/p&gt;
&lt;p&gt;One challenge I set for myself was using only 32 colors to capture the feeling of an older gaming console. Once I got comfortable with shading and dithering, working within this constraint became easier. An added benefit to using 32 colors was it resulted in smaller image sizes—the game’s 79 images account for only about 25% of the total payload.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/escape-room-colors.png&quot; alt=&quot;Color palette&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;I attempted to design sprites using dimensions in multiples of eight, but I’ll admit I became less strict about this as the project progressed. At a certain point, I was struggling enough with the color and styling limitations that this guideline became more of a starting point than a rule.&lt;/p&gt;
&lt;p&gt;I considered creating my own font, but after exhausting myself with all the artwork, I opted for Google’s PixelifySans instead.&lt;/p&gt;
&lt;p&gt;Almost all animation frames were individually drawn (except for the “one” TV animation). This was tedious, but I was determined to stay true to old-school techniques! I did use CSS to streamline some animations—for instance, I used &lt;code&gt;animation-direction: alternate&lt;/code&gt; on the poster page curl to create a palindrome effect, halving the number of required sprites.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/escape-room-poster.png&quot; alt=&quot;Poster frames&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;h2&gt;Mechanics&lt;/h2&gt;
&lt;p&gt;Like my previous game &lt;a href=&quot;https://starzonmyarmz.itch.io/hiero&quot;&gt;Heiro&lt;/a&gt;, this project primarily uses checkbox and radio button mechanics. However, the addition of the &lt;code&gt;:has()&lt;/code&gt; pseudo-selector opened up many more possibilities. I also utilized the &lt;code&gt;popover&lt;/code&gt; API to create more detailed interactions.&lt;/p&gt;
&lt;h3&gt;Checkbox and Radio Selection&lt;/h3&gt;
&lt;p&gt;Triggering interactions by toggling checkboxes and radio buttons isn’t new, but the &lt;code&gt;:has()&lt;/code&gt; selector is a game-changer! Before this existed, you had to structure your markup so interactive elements were siblings. The &lt;code&gt;:has()&lt;/code&gt; selector makes this far more flexible because you no longer need to rely on a specific HTML structure.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;#element&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;:has(#checkbox:checked) #element&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Using this pattern, &lt;code&gt;:has()&lt;/code&gt; looks for &lt;code&gt;#checkbox&lt;/code&gt; anywhere on the page, meaning you don’t have to rely on &lt;code&gt;#checkbox&lt;/code&gt;, its corresponding &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt;, or &lt;code&gt;#element&lt;/code&gt; being siblings. The markup structure is no longer a constraint. Most of this game functions on toggling checkboxes and radios to unlock, collect, and use items.&lt;/p&gt;
&lt;h3&gt;Navigation&lt;/h3&gt;
&lt;p&gt;I almost gave up on the current implementation, and used basic compass notation to avoid visual transitions between directions. After several failed attempts, I found a solution. The tricky part was determining how to transition into a direction from either left or right, depending on which arrow was clicked.&lt;/p&gt;
&lt;p&gt;My solution is conceptually simple but difficult to explain! First, I used radio buttons to determine which direction you’re facing (since you can only face one direction at a time). Second, I needed a way to determine if you’re entering a direction from west or east. This required eight radio buttons—two for each direction.&lt;/p&gt;
&lt;p&gt;For example, if you’re facing east (having come from facing north), you have two possible directions to go: west (returning to face north) or east (to face south). I needed to make the radio buttons visible that would take you north from east, and south from west.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/escape-room-navigation.png&quot; alt=&quot;Visual explaining how navigation works&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;The CSS looks something like this:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:has(#east-from-west:checked) :is(
  [for=&quot;south-from-west&quot;],
  [for=&quot;north-from-east&quot;])&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This pattern was implemented for each direction, along with animations to ensure each room view slid in and out correctly.&lt;/p&gt;
&lt;h3&gt;Zooming In&lt;/h3&gt;
&lt;p&gt;I initially focused so much on checkbox mechanics that I assumed I’d need the same approach for zooming in on specific areas. Then I had a &amp;quot;Duh!&amp;quot; moment and realized the &lt;code&gt;popover&lt;/code&gt; API would be perfect. Here’s the basic markup for looking at an individual book:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;popovertarget&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Zoom in&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;popover&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Book content goes here --&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;popovertarget&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;popovertargetaction&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Close&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Turning the Lights Off&lt;/h3&gt;
&lt;p&gt;I procrastinated on implementing this feature because I thought I’d need to create darkened variations of all artwork. I don’t recall what inspired me to try blend modes, but I’m glad I did—the solution was surprisingly simple.&lt;/p&gt;
&lt;p&gt;When the light switch checkbox is toggled, a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; becomes visible with a dark background color and &lt;code&gt;mix-blend-mode: multiply&lt;/code&gt;. This multiplies the colors of the blending and base layers, resulting in a darker appearance.&lt;/p&gt;
&lt;h3&gt;Playing the Crossword&lt;/h3&gt;
&lt;p&gt;This required &lt;a href=&quot;https://github.com/starzonmyarmz/csscape-room/blob/main/styles/east.css#L204-L234&quot;&gt;surprisingly complex CSS&lt;/a&gt;. Each square has three letters plus a blank tile, meaning four radio buttons. The &lt;code&gt;:checked&lt;/code&gt; letter has a &lt;code&gt;z-index&lt;/code&gt; of 3 to display above other letters, but also has &lt;code&gt;pointer-events: none&lt;/code&gt; so clicks pass through to the next letter underneath (with &lt;code&gt;z-index: 2&lt;/code&gt;). The remaining tiles have a &lt;code&gt;z-index&lt;/code&gt; of 1.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/escape-room-crossword.png&quot; alt=&quot;Visual explaining how crossword puzzle works&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;The CSS becomes even trickier when the last tile is &lt;code&gt;:checked&lt;/code&gt;, requiring some &lt;a href=&quot;https://github.com/starzonmyarmz/csscape-room/blob/main/styles/east.css#L227&quot;&gt;creative selector gymnastics&lt;/a&gt; to target the first radio button in the stack again.&lt;/p&gt;
&lt;h2&gt;Tools&lt;/h2&gt;
&lt;p&gt;I created all artwork using &lt;a href=&quot;https://www.aseprite.org/&quot;&gt;Aseprite&lt;/a&gt;, which is specifically designed for pixel art. I probably only used a fraction of its features, and I’m not sure it actually made my life easier—it might have made things more difficult at times. I’m not giving up on it yet, though. I suspect I’ll occasionally discover features that make me think, “Oh, that’s way easier than what I was doing!”&lt;/p&gt;
&lt;p&gt;I started coding with basic HTML and CSS but eventually found navigation difficult with such a long HTML file. It also became tedious writing the same attributes for every &lt;code&gt;&amp;lt;img /&amp;gt;&lt;/code&gt; element. I migrated the project to &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; to improve organization and create custom shortcodes for simplifying component creation. I used the &lt;code&gt;html-minifier-terser&lt;/code&gt; npm package, which integrates well with Eleventy.&lt;/p&gt;
&lt;p&gt;I chose native CSS over &lt;a href=&quot;https://sass-lang.com/&quot;&gt;Sass&lt;/a&gt; for several reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CSS now has native nesting for better organization and leaner code&lt;/li&gt;
&lt;li&gt;CSS has built-in variables&lt;/li&gt;
&lt;li&gt;HTTP/2 handles asset loading efficiently, eliminating the major benefit of bundling CSS files&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The game uses 12 CSS files with 12 &lt;code&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;/code&gt; tags. The only Sass feature I missed was the ability to loop through style patterns for easier maintenance, but this wasn’t a significant issue.&lt;/p&gt;
&lt;p&gt;The game is hosted on GitHub Pages. During deployment, it runs an npm command to minify CSS using &lt;a href=&quot;https://lightningcss.dev/&quot;&gt;Lightning CSS&lt;/a&gt;. I mentioned accidentally deleting half my CSS earlier—this happened because I initially used Eleventy’s recommended approach with the &lt;code&gt;clean-css&lt;/code&gt; npm package. I strongly advise against using this! This package doesn’t work with native CSS nesting. While losing code was frustrating, I rewrote much of it more efficiently, so there was a silver lining.&lt;/p&gt;
&lt;h2&gt;Nice to Haves&lt;/h2&gt;
&lt;p&gt;I initially wanted to make this game fully accessible, but the navigation system doesn’t translate well for screen reader users. I tried implementing a more compass-like navigation approach for keyboard users, but it proved unreliable and conflicted with the side-to-side approach.&lt;/p&gt;
&lt;p&gt;Adding text labels for interactive elements was challenging because you can’t track the &lt;code&gt;:focus&lt;/code&gt; state of a &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; element. While you can track the &lt;code&gt;:focus&lt;/code&gt; of the corresponding &lt;code&gt;&amp;lt;input /&amp;gt;&lt;/code&gt;, it wasn’t consistently reliable.&lt;/p&gt;
&lt;p&gt;The main keyboard accessibility issue is that the game exists as one long HTML page. When you navigate to face a different direction, keyboard focus remains elsewhere on the page, requiring extensive tabbing to reach navigation elements or item selection.&lt;/p&gt;
&lt;p&gt;I ultimately decided to make the game deliberately inaccessible by adding &lt;code&gt;tabindex=&amp;quot;-1&amp;quot;&lt;/code&gt; to all keyboard-accessible elements. I’d rather users recognize immediately that they can’t play with assistive technology than become frustrated with a partially broken experience.&lt;/p&gt;
&lt;p&gt;Sound would have been a nice addition, but I encountered the same issues as with my previous game Heiro. You can toggle the visibility of an &lt;code&gt;&amp;lt;embed&amp;gt;&lt;/code&gt; element, but once it’s visible, you can’t hide it again—meaning there’s no way to toggle sound on and off.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://csscape-room.iamdanielmarino.com/&quot;&gt;CSScape Room&lt;/a&gt; was a fun but exhausting four-month project. It began as an experiment to see if creating a JavaScript-free escape room was possible—and the answer is definitely yes. I’ve only touched on some aspects here, so if you’re interested in the technical details, check out the source code on GitHub. Finally, I’d like to thank all my playtesters for their valuable feedback!&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Self-avoiding Walk</title>
      <link href="https://iamdanielmarino.com/posts/self-avoiding-walk/"/>
      <updated>2025-03-23T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/self-avoiding-walk/</id>
      <content xml:lang="en" type="html">&lt;p&gt;I’m a bit late to this, but back in summer 2024 I participated in the &lt;a href=&quot;https://itch.io/jam/ost-composing-jam-7&quot;&gt;OST Composing Jam&lt;/a&gt;. The goal of this jam is to compose an original soundtrack (minimum of 3 minutes) of any style for an imaginary game. While I’ve composed a lot of video game music, I’ve never created an entire soundtrack around a single concept.&lt;/p&gt;
&lt;iframe style=&quot;border: 0; width: 100%; height: 310px;&quot; src=&quot;https://bandcamp.com/EmbeddedPlayer/album=3143278153/size=large/bgcol=ffffff/linkcol=eb4d55/artwork=small/transparent=true/&quot; seamless=&quot;&quot;&gt;&lt;a href=&quot;https://danielmarino.bandcamp.com/album/self-avoiding-walk&quot;&gt;Self Avoiding Walk by Daniel Marino&lt;/a&gt;&lt;/iframe&gt;
&lt;p&gt;To be honest, I wasn’t entirely sure where to start. I was torn between trying to come up with a story for a game to inspire the music, and just messing around with some synths and noodling on the keyboard. I did a little bit of both, but nothing really materialized.&lt;/p&gt;
&lt;h2&gt;Synth + Metal ≈ Synthmetal&lt;/h2&gt;
&lt;p&gt;Feeling a bit paralyzed, I fired up the ’ole &lt;a href=&quot;https://rmg.iamdanielmarino.com/&quot;&gt;RMG sequencer&lt;/a&gt; for inspiration. I saved a handful of randomized melodies and experimented with them in Reaper. After a day or two I landed on something I liked which was about the first 30 seconds or so of the second track: &amp;quot;Defrag.&amp;quot;&lt;/p&gt;
&lt;p&gt;I love metal bands like Tesseract, Periphery, The Algorithm, Car Bomb, and Meshuggah. I tried experimenting with incorporating syncopated guttural guitar sounds with the synths. After several more days I finished &amp;quot;Defrag&amp;quot;—which also included &amp;quot;Kernel Panic&amp;quot; before splitting that into its own track. I didn’t have a clue what to do next, nor did I have a concept. Composing the rest of the music was a bit of a blur because I bounced around from song to song—iterating on the leitmotif over and over with different synths, envelopes, time signatures, rhythmic displacement, pitch shifting, and tweaking underlying chord structures.&lt;/p&gt;
&lt;h2&gt;Production&lt;/h2&gt;
&lt;p&gt;The guitars were recorded using DI with my Fender Squire and &lt;a href=&quot;https://www.sweetwater.com/store/detail/UMC202HD--behringer-u-phoria-umc202hd-usb-audio-interface&quot;&gt;Behringer Interface&lt;/a&gt;. I’m primarily using the ML Sound Labs &lt;a href=&quot;https://ml-sound-lab.com/products/amped-roots&quot;&gt;Amped Roots Free&lt;/a&gt; amp sim because the metal presets are fantastic and rarely need much fuss to get it sounding good. I also used &lt;a href=&quot;https://www.bluecataudio.com/Products/Product_FreeAmp/&quot;&gt;Blue Cat Audio free amp&lt;/a&gt; sim for clean guitars.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/self-avoiding-walk-reaper.webp&quot; alt=&quot;Screenshot Defrag in Reaper&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;All the other instruments were MIDI tracks either programmed via piano roll or recorded with my &lt;a href=&quot;https://www.arturia.com/minilab-mkii/resources&quot;&gt;Arturia MiniLab MKII&lt;/a&gt;. I used a variety of synth effects from &lt;a href=&quot;https://iamdanielmarino.com/posts/what-im-using-2025/&quot;&gt;my library of VSTs&lt;/a&gt;. I recorded this music before acquiring my Fender Squire Bass guitar, so bass was also programmed.&lt;/p&gt;
&lt;h2&gt;Theme and Story&lt;/h2&gt;
&lt;p&gt;At some point I had five songs that all sounded like they could be from the same game. The theme for this particular jam was &amp;quot;Inside my world.&amp;quot; I had to figure out how I could write a story that corresponded with the theme and could align with the songs. I somehow landed on the idea of the main actor realizing his addiction to AI, embarking on a journey to &amp;quot;unplug.&amp;quot; The music reflects his path to recovery, capturing the emotional and psychological evolution as he seeks to overcome his dependency. After figuring this out, I thought it would be cool to name all the songs using computer terms that could be metaphors for the different stages of recovery.&lt;/p&gt;
&lt;h2&gt;Track listing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Worm&lt;/strong&gt; – In this dark and haunting opening track, the actor grapples with his addiction to AI, realizing he can no longer think independently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defrag&lt;/strong&gt; – This energetic track captures the physical and emotional struggles of the early stages of recovery.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kernel Panic&lt;/strong&gt; – Menacing and eerie, this track portrays the actor’s anxiety and panic attacks as he teeters on the brink during the initial phases of recovery.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dæmons&lt;/strong&gt; – With initial healing achieved, the real challenge begins. The ominous and chaotic melodies reflect the emotional turbulence the character endures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Time to Live&lt;/strong&gt; – The actor, having come to terms with himself, experiences emotional growth. The heroic climax symbolizes the realization that recovery is a lifelong journey.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Album art&lt;/h2&gt;
&lt;p&gt;At the time I was messing around with &lt;a href=&quot;https://en.wikipedia.org/wiki/Self-avoiding_walk&quot;&gt;Self-avoiding walks&lt;/a&gt; in generative artwork explorations. I felt like the whole concept of avoiding the self within the context of addiction and recovery metaphorically worked. So I tweaked some algorithms and generated the self-avoiding walk using JavaScript and the &lt;a href=&quot;https://p5js.org/&quot;&gt;P5.js&lt;/a&gt; library. I then layered the self-avoiding walk over a &lt;a href=&quot;https://unsplash.com/photos/a-close-up-of-a-brown-and-yellow-substance-Smpy9LZmksY&quot;&gt;photo I found visually interesting&lt;/a&gt; on Unsplash using a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode&quot;&gt;CSS blend mode&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/self-avoiding-walk-artwork.jpg&quot; alt=&quot;Self-avoiding Walk album art&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;h2&gt;Jam results&lt;/h2&gt;
&lt;p&gt;I placed around the top 50% out of over 600 entries. I would have liked to have placed higher, but despite my ranking, I thoroughly enjoyed composing the music! I’m very happy with the music, its production quality, and I also learned a lot. I would certainly participate in this style of composition jam again!&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>What I’m Using in 2025</title>
      <link href="https://iamdanielmarino.com/posts/what-im-using-2025/"/>
      <updated>2025-01-24T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/what-im-using-2025/</id>
      <content xml:lang="en" type="html">&lt;p&gt;I’ve always been fascinated to see what other apps or workflows others are using in their day-to-day lives. Every now and then I learn about a new app or some cool trick I didn’t previously know. I doubt anyone seriously cares about what I’m using, but figured I’d list them out anyway—if for no other reason than to keep a historical record at this point in time.&lt;/p&gt;
&lt;h2&gt;Applications&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.alfredapp.com/&quot;&gt;Alfred&lt;/a&gt; — I have a lifelong license, and I like it. No point in fixing something that isn’t broken. I primarily use it for app switching, but also use it for math, and to &lt;a href=&quot;https://iamdanielmarino.com/posts/my-gif-workflow-using-eleventy-netlify-alfred/&quot;&gt;search for gifs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.aseprite.org/&quot;&gt;Aseprite&lt;/a&gt; — Sometimes I do pixel art! Even if the UI is clunky, and some keyboard shortcuts aren’t always convenient, there are some unique features that help facilitate creating pixel art.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.audacityteam.org/&quot;&gt;Audacity&lt;/a&gt; — I rarely use it, but sometimes it’s easier to make some quick audio edits with Audacity than to use a full blown &lt;a href=&quot;https://en.wikipedia.org/wiki/Digital_audio_workstation&quot;&gt;DAW&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bear.app/&quot;&gt;Bear&lt;/a&gt; — This is the note-taking, task-tacking app I’ve landed on. The UI is beautiful and it feels snappy. It syncs, so I can use it on my iPhone too.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.google.com/chrome/&quot;&gt;Chrome&lt;/a&gt; — I used &lt;a href=&quot;https://arc.net/&quot;&gt;Arc&lt;/a&gt; for the better part of 2024, but after they announced they were done working on it to focus on a new AI-powered browser, I peaced out. There are a couple of features I really missed, but was able to find some extensions to fill those gaps: &lt;a href=&quot;https://chromewebstore.google.com/detail/copy-current-tab-url/kjfaieigmkklodbpcnadhkmbfjapgljd&quot;&gt;Copy Current Tab URL&lt;/a&gt;, &lt;a href=&quot;https://chromewebstore.google.com/detail/meetings-page-auto-closer/pbgidoglkjhfgjhalbbiiahdlokjcplb&quot;&gt;Meetings Page Auto Closer for Zoom&lt;/a&gt;, &lt;a href=&quot;https://chromewebstore.google.com/detail/open-figma-app/hgeipfdfhbmmgbkdjbeplocahpgkpkal&quot;&gt;Open Figma app&lt;/a&gt;, and &lt;a href=&quot;https://chromewebstore.google.com/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa&quot;&gt;JSON Formatter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.figma.com/&quot;&gt;Figma&lt;/a&gt; — I use it because it’s what we use at work. I’m happy enough with Figma.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; — Has a few features that I like that makes me chose this over Mac’s native Terminal app.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pixelmator.com/pro/&quot;&gt;Pixelmator Pro&lt;/a&gt; — I haven’t paid the Adobe tax for a long time, and it feels good. I started using Pixelmator because at the time it was the best alternative available. I’m comfortable with Pixelmator at this point. I don’t really use image editors often these days, so I probably won’t switch anytime soon.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reaper.fm/&quot;&gt;Reaper&lt;/a&gt; — My DAW of choice when composing music. It’s very customizable, easyish enough to learn, and the price is right. It also has a die hard community, so I’m always able to find help when I need it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt; — I’ve tried a lot of code editors. I prefer &lt;a href=&quot;https://www.sublimetext.com/&quot;&gt;Sublime’s&lt;/a&gt; UI over VS Code, but VS Code does a lot of things more easily than Sublime does, so I put up with the UI.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://music.youtube.com/&quot;&gt;YouTube Music&lt;/a&gt; — I still miss &lt;a href=&quot;https://en.wikipedia.org/wiki/Rdio&quot;&gt;Rdio&lt;/a&gt;. YouTube Music works well enough I guess. Paying for YouTube Music has the benefit of not seeing ads on YouTube.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Command-line Tools&lt;/h2&gt;
&lt;p&gt;These aren’t apps per se, but these are some tools that I use to help manage packages or that I use regularly when developing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://deno.com/&quot;&gt;Deno&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://brew.sh/&quot;&gt;Homebrew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sindresorhus/pure&quot;&gt;pure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/paulirish/statikk&quot;&gt;statikk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vite.dev/&quot;&gt;Vite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://volta.sh/&quot;&gt;Volta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/yt-dlp/yt-dlp&quot;&gt;yt-dlp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Equipment&lt;/h2&gt;
&lt;p&gt;I have one computer and I use it for everything, and I’m okay with that. It’s more than powerful enough for work, composing music, making games, and occasionaly playing games.&lt;/p&gt;
&lt;p&gt;Although I have a dedicated home office, lately I tend to work more on the go, often with just my laptop—whether that’s at a cafe, a &lt;a href=&quot;https://thecoworkinghouse.com/&quot;&gt;coworking space&lt;/a&gt;, or even just moving around the house.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2021 M1 MacBook Pro&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sweetwater.com/store/detail/K240S--akg-k240-studio-semi-open-pro-studio-headphones&quot;&gt;AKG K240 Studio Headphones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.arturia.com/minilab-mkii/resources&quot;&gt;Arturia MiniLab MKII Controller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sweetwater.com/store/detail/UMC202HD--behringer-u-phoria-umc202hd-usb-audio-interface&quot;&gt;Behringer UMC202HD USB Audio Interface&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sweetwater.com/store/detail/StratMinIBK2--squier-mini-strat-black-with-laurel-fingerboard&quot;&gt;Fender Squire Strat Guitar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/gp/product/B0CSLMDCLY&quot;&gt;Fender Squire Bass Guitar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.shure.com/en-US/products/microphones/sm57?variant=SM57-LC&quot;&gt;Shure SM57&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Virtual Instruments&lt;/h2&gt;
&lt;p&gt;This is quite specific for composing music, so if that does’t interest you, feel free to stop reading here. This list is not exhaustive as I’m regularly trying out new VSTs. These are some staples that I use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🎹 &lt;a href=&quot;https://www.arturia.com/products/software-instruments/analoglab/overview&quot;&gt;Arturia Analog Lab V (Intro)&lt;/a&gt; — My Arturia controller came with this software. It has over 500 presets and I love exploring the variety of sounds.&lt;/li&gt;
&lt;li&gt;🎸 &lt;a href=&quot;https://plugins4free.com/plugin/2082/&quot;&gt;Bass Grinder (Free)&lt;/a&gt; — I recently came across this VST, and it has a great crunchy overdrive sound for bass guitar.&lt;/li&gt;
&lt;li&gt;🥁 &lt;a href=&quot;https://www.powerdrumkit.com/&quot;&gt;Manda Audio Power Drum Kit&lt;/a&gt; — Even though you can use this for free, I paid the $9 because it is fantastic. The drums sound real and are great for all styles of music.&lt;/li&gt;
&lt;li&gt;🎸 &lt;a href=&quot;https://ml-sound-lab.com/products/amped-roots&quot;&gt;ML Amped Roots (Free)&lt;/a&gt; — What I like about this is that I get great metal guitar out of the box without having to add pedals or chaining other effects.&lt;/li&gt;
&lt;li&gt;🥁 &lt;a href=&quot;https://ml-sound-lab.com/pages/ml-drums&quot;&gt;ML Drums (Free)&lt;/a&gt; — I just started experimenting with this, and the drum tones are amazing. The free set up is pretty limited, but I like how I can add on to the base drum kit to meet my needs rather than having having to buy one big extensive drum VST.&lt;/li&gt;
&lt;li&gt;🎹 &lt;a href=&quot;https://labs.spitfireaudio.com/&quot;&gt;Spitfire LABS&lt;/a&gt; — More variety of eclectic sounds.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also use several built-in VSTs made by Reaper for delay, EQ, reverb, pitch-shifting, and other effects. Reaper’s VSTs are insanely powerful enough for my needs and are much less CPU intensive.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Daily Inspirational Word</title>
      <link href="https://iamdanielmarino.com/posts/daily-inspirational-word/"/>
      <updated>2024-05-28T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/daily-inspirational-word/</id>
      <content xml:lang="en" type="html">&lt;p&gt;Over the past couple of years I’ve gotten into journaling. Recently I’ve been
using a method where you’re given a single inspirational word as a prompt, and
go from there. Unfortunately, the process of finding, saving, and accessing
inspirational words was a bit of a chore:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Google a list of “366 inspirational words”.&lt;/li&gt;
&lt;li&gt;Get taken to a blog bloated with ads and useless content all in an effort to
generate SEO cred.&lt;/li&gt;
&lt;li&gt;Copy/paste the words into Notion.&lt;/li&gt;
&lt;li&gt;Fix how the words get formatted becasue Notion is weird, and I have OCD about
formatting text.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While this gets the job done, I felt like there was room to make this a more
pleasant experience. All I really wanted was a small website that serves a
single inspirational word on a daily basis without cruft or ads. This would
allow me to get the content I want without having to scroll through a long list.
I also don&#39;t want to manage or store the list of words. Once I&#39;ve curated a list
of words, I want to be done with it.&lt;/p&gt;
&lt;h2&gt;Creating a microsite&lt;/h2&gt;
&lt;p&gt;I love a good microsite, and so I decided to create one that takes all the chore
out of obtaining a
&lt;a href=&quot;https://daily-inspirational-word.iamdanielmarino.com/&quot;&gt;daily inspirational word&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/daily_inspirational_word.jpeg&quot; alt=&quot;Daily Inspirational Word screenshot&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;The website is built with all vanilla tech, and doesn’t use any frameworks! It’s
nice and lean, and it’s footprint is only 6.5kb.&lt;/p&gt;
&lt;h3&gt;Inspirational words&lt;/h3&gt;
&lt;p&gt;While I’m not a huge fan of AI, I did leverage ChatGPT on obtaining 366
inspirational words. The benefit to ChatGPT was being able to get it to return
the words as an array—cutting down on the tedium of having to convert the words
I already had into an array. The &lt;a href=&quot;https://github.com/starzonmyarmz/daily-inspirational-word/blob/main/words.json&quot;&gt;words are stored in it’s own JSON file&lt;/a&gt;, and I
use an &lt;a href=&quot;https://github.com/starzonmyarmz/daily-inspirational-word/blob/main/script.js&quot;&gt;async/await function to pull in the words&lt;/a&gt;, and then process the data upon
return.&lt;/p&gt;
&lt;h2&gt;Worth the effort&lt;/h2&gt;
&lt;p&gt;I find these little projects fun and exciting because the scope is super tight,
and makes for a great opportunity to learn new things. It’s definitely an
overengineered solution to my problem, but it is a much more pleasant
experience. And perhaps it will serve other people as well.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>My current prototyping environment</title>
      <link href="https://iamdanielmarino.com/posts/my-current-prototyping-environment/"/>
      <updated>2024-04-18T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/my-current-prototyping-environment/</id>
      <content xml:lang="en" type="html">&lt;p&gt;The other day I shared &lt;a href=&quot;https://iamdanielmarino.com/posts/why-i-still-prefer-prototyping-using-code/&quot;&gt;why I prefer coding prototypes&lt;/a&gt; rather than using design apps to create them. My prototyping environment has evolved over the years. I love to hear how others build prototypes, so I thought I’d share where I’m at now. Maybe you’ll find it useful.&lt;/p&gt;
&lt;h2&gt;A single repository&lt;/h2&gt;
&lt;p&gt;I currently have a &lt;a href=&quot;https://github.com/starzonmyarmz/prototypes&quot;&gt;single GitHub repo&lt;/a&gt; housing all of my prototypes. I do this primarily so I don’t have to remember where any given prototype lives. They all live in the same place! Another benefit is if I pull in a library or some CSS component, I can reuse it in other prototypes without having to go out and grab it from the source again.&lt;/p&gt;
&lt;h2&gt;My old setup&lt;/h2&gt;
&lt;p&gt;In the past I used &lt;a href=&quot;https://sinatrarb.com/&quot;&gt;Sinatra&lt;/a&gt; hosted on Heroku. Having Ruby and a basic server (Such as &lt;a href=&quot;https://github.com/ruby/webrick&quot;&gt;Webrick&lt;/a&gt;) in the backend was pretty nice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I could code up some fairly complex prototypes out with realistic url schemes.&lt;/li&gt;
&lt;li&gt;Gems! If I needed fake data, I could use the &lt;a href=&quot;https://github.com/faker-ruby/faker&quot;&gt;Faker gem&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If I wanted a table with a 100 rows, I could easily generate that with a super simple loop.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But it got clunky. Spinning up a new prototype wasn’t very efficient. Setting up the urls took time. Deploying to Heroku wasn’t always straight forward. Heroku also got rid of their free plan, and I didn’t want to go looking for a new service. Maybe I’m making excuses.&lt;/p&gt;
&lt;h2&gt;A dumb server&lt;/h2&gt;
&lt;p&gt;Now I just use HTML, CSS (vanilla), and Javascript with no special backend. I don’t have Node.js running, and I don’t use a package manager like NPM or Yarn. To start a server I navigate to the prototype directory in iTerm, and run &lt;a href=&quot;https://github.com/paulirish/statikk&quot;&gt;Statikk&lt;/a&gt;. Easy peasy. This setup requires no upkeep, so I can focus on actually prototyping!&lt;/p&gt;
&lt;p&gt;I have a basic file structure for keeping prototypes separate. I typically use &lt;a href=&quot;https://preactjs.com/&quot;&gt;Preact&lt;/a&gt; for scaffolding. To &lt;code&gt;import&lt;/code&gt;  Preact or other NPM packages I use &lt;a href=&quot;https://esm.sh/&quot;&gt;esm.sh&lt;/a&gt;. When I push changes to the GitHub repo it’s deployed to GitHub pages. I can then share a public URL to folks that need to review the prototype.&lt;/p&gt;
&lt;h2&gt;One glaring problem&lt;/h2&gt;
&lt;p&gt;There’s only one issue I’ve run into using this setup, and its not even related to the setup! The &lt;a href=&quot;https://porchlight.design/&quot;&gt;Porchlight design system&lt;/a&gt; (which we use at &lt;a href=&quot;https://www.getharvest.com/&quot;&gt;Harvest&lt;/a&gt;) doesn’t have it’s styles or components available to consume publicly via CDN. Womp womp.&lt;/p&gt;
&lt;p&gt;I can get around the CSS issue. I end up having to copy the compiled CSS from the design system and paste it into a new file in my prototype environment. And I’m kind of out of luck with the JavaScript: I have to code these up from scratch. Although, I suppose I could copy the compiled components, and paste them into my prototype environment.&lt;/p&gt;
&lt;p&gt;The easiest fix is probably to introduce a package manager, but I’d rather not. We have talked about making the design system’s CSS and components available via CDN–it’s just a matter of getting around to it.&lt;/p&gt;
&lt;h2&gt;Prototype!&lt;/h2&gt;
&lt;p&gt;So that’s my current prototyping setup. Maybe it will help inspire you to setup your own prototyping environment. Whether you use code or a design app–you should prototype!&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Why I Still Prefer to Prototype Using Code</title>
      <link href="https://iamdanielmarino.com/posts/why-i-still-prefer-prototyping-using-code/"/>
      <updated>2024-04-16T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/why-i-still-prefer-prototyping-using-code/</id>
      <content xml:lang="en" type="html">&lt;p&gt;There are several design apps available at a product designers disposal, and I’ve used several of them over the years. I think these days, most everyone is using Figma, but whatever app you’re using—most of them typically have some sort of prototyping feature. Typically they have required very little coding to get a prototype up and running.&lt;/p&gt;
&lt;p&gt;Despite the advances in the ability to prototype using design tools, I still prefer to use HTML, CSS, and JavaScript.&lt;/p&gt;
&lt;h2&gt;Greater Flexibility&lt;/h2&gt;
&lt;p&gt;I find myself needing much more flexibility than what prototyping in Figma offers. I think it’s cool that they’re regularly adding features to make prototyping more flexible, but it’s becoming so complicated and time consuming to figure out. A lot of the new features that Figma has been adding—like variables—is essentially coding! It doesn’t really simplify or speed things up for me. At some point there’s usually a moment where I think this would have been faster if I had just built this prototype in code.&lt;/p&gt;
&lt;p&gt;When animating designs in a prototyping tool, there’s only so much control over how the transitions work or what they look like. With CSS and JavaScript, I have complete control over how a design animates or transitions.&lt;/p&gt;
&lt;h2&gt;Safer Portability&lt;/h2&gt;
&lt;p&gt;When I think of portability, there’s a couple of things that come to mind: being able to easily share a prototype with someone else, and being able to access a prototype regardless of the design tool I’m using.&lt;/p&gt;
&lt;p&gt;When I’m sharing a prototype with someone I like knowing that I can send them a URL that won’t break—at least theoretically. I get that Figma has URLs to prototypes, but I don’t own or have control over that URL. What if Figma changes the URL scheme someday? Would that happen? Probably not, but I also don’t have to worry about it if I own/control the URL.&lt;/p&gt;
&lt;p&gt;Right now I use Figma. I used to use Sketch, and never thought I would stop using it. I don’t pretend to believe that some new design tool will come and replace Figma some day. If I decide to up and leave Figma, I’d prefer not to have to leave all my prototypes behind.&lt;/p&gt;
&lt;h2&gt;Learning and Experimentation&lt;/h2&gt;
&lt;p&gt;Prototyping with HTML, CSS, and JavaScript is a great way to test out new features or frameworks. Through prototyping I’ve learned how to use Flexbox/Grid, &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;, &lt;a href=&quot;https://sinatrarb.com/&quot;&gt;Sinatra&lt;/a&gt;, &lt;a href=&quot;https://p5js.org/&quot;&gt;P5.js&lt;/a&gt;, &lt;a href=&quot;https://preactjs.com/&quot;&gt;Preact&lt;/a&gt;, and a plethora of various little CSS properties or JavaScript methods and micro libraries. Its also a good way to stay on top of whats new and trendy, and try out not-quite-ready-for-primetime features.&lt;/p&gt;
&lt;h2&gt;A More Realistic Experience&lt;/h2&gt;
&lt;p&gt;When I use a prototype made in code verses Figma, the coded version feels more real: the way you interact with it, being able to actually type in a text input, being able to use and experiment with more complex interactions. I also typically tend to discover other interactions that go beyond the happy path, and can account for those before engineers discover them while building out the actual feature. States like validation and error, what happens when there’s no data to show, and other uncommon scenarios.&lt;/p&gt;
&lt;h2&gt;Design Apps Still Have Their Place&lt;/h2&gt;
&lt;p&gt;I think design apps have come a very long way over time, and it is very convenient to be able to prototype in the same app you’re doing your designing in—especially if you’re not comfortable with coding. And there are times when I will use Figma prototyping. If I have a simple interaction that doesn’t require a lot of user input or too many frames, then prototyping in Figma is relatively quick and painless. But once I go beyond a handful of interactions, it typically pays off in the long run to just use code.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Using the p5play JavaScript Game Engine</title>
      <link href="https://iamdanielmarino.com/posts/using-the-p5play-library-for-making-games/"/>
      <updated>2024-01-15T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/using-the-p5play-library-for-making-games/</id>
      <content xml:lang="en" type="html">&lt;p&gt;I was messing around with &lt;a href=&quot;https://p5play.org/&quot;&gt;p5play&lt;/a&gt; last week to experiment with a game idea, and was pleasantly surprised by how easy it is to use. It was designed to be intuitive for beginners, such as students. In under a half hour I had created some common basic mechanics! Check it out:&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;500&quot; data-default-tab=&quot;js,result&quot; data-slug-hash=&quot;WNmRzOK&quot; data-user=&quot;starzonmyarmz&quot; style=&quot;height: 500px; display: flex; align-items: center; justify-content: center; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/starzonmyarmz/pen/WNmRzOK&quot;&gt;
  p5play&lt;/a&gt; by Daniel Marino (&lt;a href=&quot;https://codepen.io/starzonmyarmz&quot;&gt;@starzonmyarmz&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io/&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async=&quot;&quot; src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;h3&gt;What I Like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;It builds on top of &lt;a href=&quot;https://p5js.org/&quot;&gt;P5.js&lt;/a&gt;. This means that I can leverage all the built-in features I&#39;m already familiar with in P5. It even expands upon some built-in features in P5—like creating a new &lt;a href=&quot;https://p5play.org/learn/canvas.html&quot;&gt;Canvas&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;It uses the same &lt;a href=&quot;https://piqnt.com/planck.js&quot;&gt;Box2D physics simulator&lt;/a&gt; that some popular games use. Some physics engines are a little floaty, while others are too constrained. This simulator has some really comfortable defaults out of the box.&lt;/li&gt;
&lt;li&gt;The documentation is easy to follow along, and there&#39;s a &lt;a href=&quot;https://discord.gg/3UTbqUgmPF&quot;&gt;Discord server&lt;/a&gt; where I can (and have) ask questions. I typically have gotten a response from the library maintainer, himself, within a couple of hours.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What I Dislike&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Not everything is documented, and that&#39;s not necessarily a bad thing. However, there are some really handy properties and even methods available that I happened to come across by accident just from purusing the source code and outputting various p5play global methods to &lt;code&gt;console.log()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The licensing is a &lt;a href=&quot;https://github.com/quinton-ashley/p5play-web/blob/main/LICENSING.md&quot;&gt;little weird&lt;/a&gt;. In short: its free to use for open source projects, but for professional use you need to pay for a license. I&#39;m not going to argue whether you should have to pay for a license or not, but its definately something to be aware of.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&#39;ll definitely be keeping &lt;a href=&quot;https://p5play.org/&quot;&gt;p5play&lt;/a&gt; in my toolkit the next time I want to prototype some game mechanics or participate in a game jam!&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Making Generative Art</title>
      <link href="https://iamdanielmarino.com/posts/generative-art/"/>
      <updated>2024-01-13T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/generative-art/</id>
      <content xml:lang="en" type="html">&lt;p&gt;I saw &lt;a href=&quot;https://joshuadavis.com/&quot;&gt;Joshua Davis&lt;/a&gt; give a talk over 10 years ago, and I was mesmorized. Not just by how engaging he was, but more so with the work he was doing with &lt;em&gt;generative art&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I had never heard of generative art before, but I immediately fell in love with the concept of it. I like to draw, but I wouldn’t consider myself much of an artist. I can work my way around Photoshop pretty comfortably, but again, wouldn’t consider myself much of an artist. I didn’t think much of generative art again for some time later.&lt;/p&gt;
&lt;p&gt;Several years ago, I started toying with the idea fo experimenting with generative art. A buddy of mine, &lt;a href=&quot;https://codepen.io/satchmorun&quot;&gt;Arun&lt;/a&gt; shared some of his work, and inspired me to go for it. So now I’ve been creating generative art for the past five years or so, but I’ve only recently started &lt;a href=&quot;https://iamdanielmarino.com/generative-art/&quot;&gt;sharing my experiments&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Libraries like &lt;a href=&quot;https://p5js.org/&quot;&gt;P5.js&lt;/a&gt; make it very approachable. And I’m a huge fan of P5! I even &lt;a href=&quot;https://iamdanielmarino.com/posts/github-game-off-game-jam-2021-retrospective/&quot;&gt;made a video game&lt;/a&gt; with it. If you have the slightest interest in creating generative art, you should go for it! If you don’t know where to start, I recommend checking out &lt;a href=&quot;https://thecodingtrain.com/&quot;&gt;The Coding Train&lt;/a&gt; where you’ll find some great tutorials for getting started with programming, and more specific tutorials for using the P5 library.&lt;/p&gt;
&lt;p&gt;I love to write code. I love art. I love being creative. The idea that I can combine all these into a single hobby is so cool.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Free Radon album released</title>
      <link href="https://iamdanielmarino.com/posts/free-radon/"/>
      <updated>2023-10-26T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/free-radon/</id>
      <content xml:lang="en" type="html">&lt;p&gt;A little over a year ago, I composed a handful of songs. If I had to fit them into a genre, I’d go with &lt;em&gt;Lofi&lt;/em&gt; or &lt;em&gt;Chillvibes&lt;/em&gt;. Or maybe &lt;em&gt;Not-Rock-n-Roll&lt;/em&gt;. I don’t know—I’m so bad at classifying music.&lt;/p&gt;
&lt;p&gt;I wasn’t sure what to do with the songs. I was experiencing some intense emotions when I was composing them. I’ve been doing a lot of emotional growth over this past year (and still am), and I feel like by releasing them into the wild would be cathartic for me. To acknowledge that that chapter in my life happened, and it’s okay. So with that, here’s &lt;a href=&quot;https://danielmarino.bandcamp.com/album/free-radon&quot;&gt;Free Radon&lt;/a&gt;.&lt;/p&gt;
&lt;iframe style=&quot;border: 0; width: 100%; height: 274px;&quot; src=&quot;https://bandcamp.com/EmbeddedPlayer/album=2458624556/size=large/bgcol=ffffff/linkcol=eb4d55/artwork=small/transparent=true/&quot; seamless=&quot;&quot;&gt;&lt;a href=&quot;https://danielmarino.bandcamp.com/album/free-radon&quot;&gt;Free Radon by Daniel Marino&lt;/a&gt;&lt;/iframe&gt;
&lt;p&gt;So why &lt;em&gt;Free Radon&lt;/em&gt;? I’d like to say I put a lot of thought into naming the album, but I didn’t. I needed cover art for the album, and I thought it would be fun to generate random artwork for it. So I used the &lt;a href=&quot;https://p5js.org/&quot;&gt;p5.js JavaScript library&lt;/a&gt; to do so. I used the p5.js web editor, and when you create a new sketch it automatically creates a random name for it—in this case Free Radon. Speaking of using p5.js to create the artwork, you can &lt;a href=&quot;https://editor.p5js.org/iamdanielmarino/sketches/0QgAM4zz3&quot;&gt;view the script&lt;/a&gt;, and mess around with it.&lt;/p&gt;
&lt;p&gt;Hope you like the music. If you do, &lt;a href=&quot;https://danielmarino.bandcamp.com/album/free-radon&quot;&gt;share it with others&lt;/a&gt;, or &lt;a href=&quot;https://danielmarino.bandcamp.com/album/free-radon&quot;&gt;buy it&lt;/a&gt;, or &lt;a href=&quot;https://danielmarino.bandcamp.com/album/free-radon&quot;&gt;both&lt;/a&gt;! If you don’t like it… oh well.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Building a Random Music Sequencer with Preact</title>
      <link href="https://iamdanielmarino.com/posts/building-a-random-music-sequencer-with-preact/"/>
      <updated>2022-05-05T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/building-a-random-music-sequencer-with-preact/</id>
      <content xml:lang="en" type="html">&lt;p&gt;As I&#39;ve composed music for video games, something that has piqued my interest is the concept of randomly generating music. Not that this is a new concept, but I was curious to see what I could come up with. Go ahead and check out the &lt;a href=&quot;https://rmg.iamdanielmarino.com/&quot;&gt;RMG-2021&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Design&lt;/h2&gt;
&lt;p&gt;I love how sequencers look and feel—and there is so much variety as to how they&#39;re designed! I really wanted to recreate the vibe of using a physical sequencer, and referenced a lot of gear when designing the UI.
It was a bit of a balancing act to capture the essence of a physical sequencer while adapting it to a screen.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/rmg2021.png&quot; alt=&quot;RMG-2021 Tiny Music Sequencer&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;h2&gt;Preact&lt;/h2&gt;
&lt;p&gt;One of my goals was to get better at understanding and using React. I really just wanted to get more familiar with the basics, so I went with &lt;a href=&quot;https://preactjs.com/&quot;&gt;Preact&lt;/a&gt; which more or less offers the same API and low-level functionality. I&#39;m also using &lt;a href=&quot;https://github.com/developit/htm&quot;&gt;HTM&lt;/a&gt; which provides JSX-like syntax in vanilla JavaScript.&lt;/p&gt;
&lt;p&gt;At first, I found it really difficult to buy in to the React/JSX ecosystem, but the more I work with it, the more I appreciate it. I&#39;m still not super fond of writing HTML in JavaScript, but I&#39;m getting over it.&lt;/p&gt;
&lt;h2&gt;Sound&lt;/h2&gt;
&lt;p&gt;When working with audio for &lt;a href=&quot;https://js13kgames.com/entries/onoff&quot;&gt;ONOFF&lt;/a&gt;, I used &lt;a href=&quot;https://github.com/kevincennis/TinyMusic&quot;&gt;TinyMusic&lt;/a&gt;, and I&#39;m using it here too. Is it necessarily? No, but true to it&#39;s name—it&#39;s tiny, and offers a nice API. It simplifies authoring audio sequences in JavaScript. I&#39;m even outputting the TinyMusic sequence syntax so it can be easily reference it.&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;p&gt;This is one of those projects that I could have easily kept adding features. At some point I had to call it &lt;em&gt;done&lt;/em&gt; and ship it. Every feature I added ended up adding more complexity to using the sequencer. The RMG allows you to specify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The number of notes to use in the sequence&lt;/li&gt;
&lt;li&gt;Which key the notes should be pulled from&lt;/li&gt;
&lt;li&gt;A range of octaves to generate a sequence within&lt;/li&gt;
&lt;li&gt;Snapping the total number of beats to an integer&lt;/li&gt;
&lt;li&gt;Toggling the loop of the sequence&lt;/li&gt;
&lt;li&gt;Toggling a metronome click, and adjusting various metronome settings&lt;/li&gt;
&lt;li&gt;Adjusting various effects such as wave type, EQ, sweep, and decay&lt;/li&gt;
&lt;li&gt;Adding a &lt;em&gt;pulse&lt;/em&gt; effect to a sequence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On top of these features you can also easily randomize all the settings, and share a sequence via URL.&lt;/p&gt;
&lt;h2&gt;Random Sequences are Fun&lt;/h2&gt;
&lt;p&gt;I&#39;ve used &lt;a href=&quot;https://rmg.iamdanielmarino.com/?notes=16&amp;amp;key=E&amp;amp;rangemin=2&amp;amp;rangemax=8&amp;amp;arrangement=B6+0.25%2CE2+2%2CF%234+0.75%2CD%238+1%2CC%234+4%2CF%237+4%2CD%236+0.75%2CD%238+2%2CG%235+0.75%2CC%238+1%2CC%236+0.25%2CD%233+0.25%2CC%233+1%2CF%238+2%2CD%238+0.5%2CD%233+0.5&amp;amp;tempo=314&amp;amp;wave=square&amp;amp;smoothing=0.38&amp;amp;staccato=0.34&amp;amp;bass=-9&amp;amp;mid=-1&amp;amp;treble=-1&amp;amp;loop=true&quot;&gt;random sequences&lt;/a&gt; generated by the RMG for various things: drumming along with sequences, challenging myself to compose music around a random sequence, or even sending goofy sounds to my friends. It was a fun project, and I learned a lot.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>GitHub Game Off 2021 Retrospective</title>
      <link href="https://iamdanielmarino.com/posts/github-game-off-game-jam-2021-retrospective/"/>
      <updated>2022-02-19T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/github-game-off-game-jam-2021-retrospective/</id>
      <content xml:lang="en" type="html">&lt;p&gt;Recently, I completed the &lt;a href=&quot;https://itch.io/jam/game-off-2021&quot;&gt;GitHub Game Off&lt;/a&gt;. With over 500 entries, this is the largest game jam I’ve been a part of. I had some lofty goals for this game, and I just about met them all. I’m extremely happy with how the game came out!&lt;/p&gt;
&lt;p&gt;Like prior games I’ve made, I don’t tend to join a game jam unless I have some specific idea/mechanic I’d like to explore. I’d been wanting to tackle a mobile game for some time now while exploring motion/accelerometer mechanics.&lt;/p&gt;
&lt;h2&gt;Mechanics&lt;/h2&gt;
&lt;p&gt;The theme for this jam was “bug”. I don’t remember how I arrived at the concept and gameplay, but the gist is: a fly mysteriously gets sucked into a phone. By tilting your phone (utilizing the phone’s motion/accelerometer sensors), you move the fly to avoid colliding with objects on the phone’s screen. Tilting your phone at steeper angles increases the fly’s velocity and speed. While relatively basic, I found it challenging to get the mechanics just right, and reprogrammed this mechanic several times.&lt;/p&gt;
&lt;p&gt;The game consists of seven auto-scrolling levels, progressing in difficulty as you complete them. Each one is scripted to be about a minute long. While the scrolling is scripted, there is quite a bit of randomness sprinkled into each level such as the placement and dimensions of objects.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/trapped_cover.png&quot; alt=&quot;trapped promo screen&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;The game is hard to play. Really hard. My play testers got frustrated quickly—especially with the first round of testing. I did quite a lot of tweaking based on their feedback. I simplified the levels by adding larger gaps between objects and slowing the scrolling down. Even with the adjustments it’s still hard to play, but not so hard that it’s unenjoyable.&lt;/p&gt;
&lt;p&gt;I decided I was okay with the level of difficulty. I wanted a game that made you feel good about making progress. I’ve played through the entire game probably five or six times now (aside from rigorous testing throughout), and I can get through from beginning to end in about 20—30 minutes.&lt;/p&gt;
&lt;h2&gt;Graphics&lt;/h2&gt;
&lt;p&gt;If you’ve seen the game before reading this, you might think I’m joking by calling the visuals “graphics”. Believe it or not, the choice of simplicity was purposeful. I intentionally used a handful of basic shapes and solid colors.&lt;/p&gt;
&lt;p&gt;Each level resembles a popular mobile app (can you figure out which ones), and all the design is stripped down to each app’s bare essence. By keeping the design so minimal, the graphics doesn’t feel overly &lt;em&gt;iPhone&lt;/em&gt; or &lt;em&gt;Android&lt;/em&gt;, so players can relate regardless of what kind of phone they use. Here are a couple of sample screenshots:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/trapped_levels.png&quot; alt=&quot;trapped levels&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;I did receive a lower ranking on the game’s graphics, and that’s fair. I can understand why people would want something more high-fidelity. I even questioned my judgement on the decision to go low-fi a few times, but in the end I think it really does enhanced the game’s vibe and playability.&lt;/p&gt;
&lt;p&gt;While the game play graphics are primarily generated with code, there is a single sprite! It’s the &lt;em&gt;fly&lt;/em&gt; character during the cut scenes. I wanted to try out using &lt;a href=&quot;https://www.aseprite.org/&quot;&gt;Aesprite&lt;/a&gt;, so decided to make the fly in the pixel-art style.&lt;/p&gt;
&lt;h2&gt;Audio&lt;/h2&gt;
&lt;p&gt;I got a little carried away with audio, and put way more effort into it than I had to—especially for a game jam. If I’m being honest, I had the most fun when I was composing and producing audio than doing anything else for this game.&lt;/p&gt;
&lt;p&gt;I didn’t really intend to go all in with the jazz-style of music, but after writing the initial theme I was locked in. I started out composing a simple melody for the title screen. A few days later I had an album’s worth of music! The music is inspired by pianists like Vince Guaraldi and Danillo Perez. I love how they combine simple, playful, and whimsical-sounding melodies—with a little dissonance thrown in for good measure.&lt;/p&gt;
&lt;iframe style=&quot;border: 0; width: 100%; height: 406px;&quot; src=&quot;https://bandcamp.com/EmbeddedPlayer/album=1082942060/size=large/bgcol=ffffff/linkcol=eb4d55/artwork=none/transparent=true/&quot; seamless=&quot;&quot;&gt;&lt;a href=&quot;https://danielmarino.bandcamp.com/album/trapped-soundtrack&quot;&gt;trapped soundtrack by Daniel Marino&lt;/a&gt;&lt;/iframe&gt;
&lt;p&gt;I’m a lot more proficient using &lt;a href=&quot;https://www.ableton.com/en/live/&quot;&gt;Ableton&lt;/a&gt; and my &lt;a href=&quot;https://www.arturia.com/products/hybrid-synths/minilab-mkii/overview&quot;&gt;Arturia MiniLab MKII&lt;/a&gt; since my &lt;a href=&quot;https://iamdanielmarino.com/posts/gamedevjs-jam-2021-retrospective/&quot;&gt;last game jam&lt;/a&gt; and found it much simpler this time to produce music. In keeping with the minimalistic artwork style, I kept the instrumentation minimal as well: piano and drums only.&lt;/p&gt;
&lt;h2&gt;Environment and Tooling&lt;/h2&gt;
&lt;p&gt;Like my other games, the game is developed with HTML, CSS, and JS. I’m most comfortable with this tooling environment, and enjoy pushing myself to learn and do new things with it.&lt;/p&gt;
&lt;p&gt;I’ve been experimenting with creating generative art using JavaScript and the &lt;a href=&quot;https://p5js.org/&quot;&gt;P5.js library&lt;/a&gt;. I wasn’t sure how it would work as a game engine, but decided to try it out. In addition to P5, I also used a couple of additional libraries to help with &lt;a href=&quot;https://github.com/mveteanu/p5.SceneManager&quot;&gt;scene management&lt;/a&gt; and &lt;a href=&quot;https://github.com/bmoren/p5.collide2D&quot;&gt;collision detection&lt;/a&gt;. Some highlights working with P5:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The output renders to a &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; element at 60fps, which makes the game quality pretty decent, and performant.&lt;/li&gt;
&lt;li&gt;You can get started very quickly because &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Games/Anatomy#building_a_main_loop_in_javascript&quot;&gt;the loop&lt;/a&gt; is handled automatically. There are also a ton of useful built in methods for creating and manipulating graphics.&lt;/li&gt;
&lt;li&gt;It has built-in event listening for screen touching and device rotation, which was pretty helpful in my case.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Despite those highlights, I honestly don’t know if I got as much mileage out of P5 to justify using it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I ended up having to create my own Class with various methods for drawing and manipulate shapes. This is mostly because I wanted to be consistent in how shapes were generated, as well as being able to easily set up consistent timings for shape manipulation.&lt;/li&gt;
&lt;li&gt;I ran into problem using P5’s vector manipulation methods, and used plain ‘ole vanilla JS to calculate and manipulate shapes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Developing a Browser-based, Mobile Game is Hard&lt;/h2&gt;
&lt;p&gt;I kind of knew going into making a mobile game was going to come with its own set of challenges, but I wasn’t prepared for how difficult some of them would be to work out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iOS Safari, for better or worse, has a huge market share on mobile devices. Not only that, all browsers—whether it be Chrome or Firefox or whatever—on iOS get stuck using the same Webkit rendering engine as Safari. Unfortunately, iOS Safari seems to be a little behind in some features that are implemented, making it difficult to work around some challenges.&lt;/li&gt;
&lt;li&gt;iOS requires &lt;a href=&quot;https://github.com/starzonmyarmz/trapped/blob/main/src/game.js#L39-L50&quot;&gt;acquiring the user’s permission to access device rotation events&lt;/a&gt;—which not only hinders the user experience, but also adds some complicated code to handle this. It should be noted that P5 doesn&#39;t handle this on any level, and just assumes permission is granted from the start.&lt;/li&gt;
&lt;li&gt;Itch.io doesn’t handle hosting browser-based mobile games very well. It also doesn’t help that neither iOS or Android make it easy to run cross-origin code. For various reasons working around this limitation is quite painful. In the end I published a QR code with a link to the game on Itch.io and published the actual game on GitHub Pages.&lt;/li&gt;
&lt;li&gt;Developing and testing a browser-based mobile game locally is frustrating and kludgy. It’s slower than normal desktop-based development, and debugging was very hard. To access my localhost on my phone I used &lt;a href=&quot;https://ngrok.com/&quot;&gt;ngrok&lt;/a&gt;  to tunnel my localhost to a public server. I would then use the public URL in Safari on my iPhone. I could inspect the DOM and check the console for errors using Safari on my Mac.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Goals and Results&lt;/h2&gt;
&lt;p&gt;I mentioned at the beginning of this post that I had some lofty goals. They were (in no particular order):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complete a mobile game&lt;/strong&gt;. Pretty sure I succeeded here!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build the game without any assistance&lt;/strong&gt;. I did actually have a little help from my buddy, Brad with some of the finishing touches. That said, I did the vast majority of the development on my own, and I feel really good about that!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rank in the top 10% of games for the game jam&lt;/strong&gt;. Overall, my game ranked 77th out of 526 submissions, which is about the top 15%. I’ll take it—especially for my first attempt at a mobile game. Also, I ranked 10th for &lt;em&gt;Audio&lt;/em&gt; and 18th for &lt;em&gt;Innovation&lt;/em&gt; which I think is awesome! You can check out &lt;a href=&quot;https://itch.io/jam/game-off-2021/rate/1291063&quot;&gt;my submission&lt;/a&gt; for the score breakdown and player feedback.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While I didn’t meet all my goals, I came pretty darn close. More importantly, I had a lot of fun with this game jam. I learned a lot and expanded my knowledge on using P5 as well as other various coding techniques.&lt;/p&gt;
&lt;p&gt;Besides &lt;a href=&quot;https://github.com/braddunbar&quot;&gt;Brad&lt;/a&gt;, I had help from other folks, and I’d be remiss if I didn’t thank them: &lt;a href=&quot;https://matthewlettini.me/&quot;&gt;Matthew&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/dannywen&quot;&gt;Danny&lt;/a&gt; for play testing, as well as my kids for play testing and suggesting good ideas when I was feeling stuck. Lastly, my wife: not only does she play my games, but is very supportive, lets me vent about crappy API support, and inspires me to put everything I got into my work.&lt;/p&gt;
&lt;p&gt;Be sure to give &lt;a href=&quot;https://trapped.iamdanielmarino.com/&quot;&gt;trapped&lt;/a&gt; a play or check out the &lt;a href=&quot;https://github.com/starzonmyarmz/trapped&quot;&gt;source code&lt;/a&gt;!&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Gamedev.js Jam 2021 Retrospective</title>
      <link href="https://iamdanielmarino.com/posts/gamedevjs-jam-2021-retrospective/"/>
      <updated>2021-04-30T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/gamedevjs-jam-2021-retrospective/</id>
      <content xml:lang="en" type="html">&lt;p&gt;Recently, I participated in the &lt;a href=&quot;https://gamedevjs.com/jam/2021/&quot;&gt;Gamedev.js Jam 2021&lt;/a&gt;: a 13-day competition to build a game that can run on the Web in a browser without extra plugins. This year’s theme for the competition was “mirror”, which could interpreted however participants chose. I had an itch I wanted to scratch, and the timing was right, so I decided to join.&lt;/p&gt;
&lt;p&gt;You’d think JavaScript would be necessary to make an HTML5 game, but the &lt;a href=&quot;https://codepen.io/collection/AKkZro?cursor=ZD0wJm89MCZwPTEmdj00&quot;&gt;Internet has shown us&lt;/a&gt; &lt;em&gt;it is&lt;/em&gt; possible to make simple games without JavaScript. I wanted to see just how far I could take this limitation—especially in an environment where it is competing against other games.&lt;/p&gt;
&lt;h2&gt;Game Concepts&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://starzonmyarmz.itch.io/hiero&quot;&gt;Hiero&lt;/a&gt; is the third game I’ve made (the first by myself), and by now I should have some sort of process to making a game, right? Well… I don’t really. So far, the process has been different for every game.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/hiero-title.jpg&quot; alt=&quot;Hiero Title Screen&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;In my experience, working on various aspects of a game (artwork, sound, etc…) greatly influences the other aspects of the game, so I find myself ping ponging around. Over the course of 13 days, I ended up implementing three core concepts into Hiero.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Complete 15 puzzles within a short timeframe.&lt;/strong&gt; Not really much to say about this other than the earlier puzzles start out pretty easy. This teaches the player how the game is played. Over time the puzzles ramp up in difficulty. To keep things fast-paced, the game is short.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;To complete a puzzle you have to find the mismatched shape.&lt;/strong&gt; Each puzzle contains three to seven shapes. When hovering over a shape, a “mirrored” version of the shape is shown underneath. The catch is, in each puzzle one of the mirrored shapes doesn’t match. In some cases it’s a completely different shape, while in others it’s a very similar shape with a slight modification. This not only satisfied the “mirror” theme requirements, but also seemed to be a different and slightly-more challenging take on the classic which-one-doesn’t-belong concept.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You can only make three mistakes.&lt;/strong&gt; This was a last minute addition to Hiero. Without it, the game can be cheesed by spamming clicks on the shapes until solving a puzzle. This adds an extra challenge of forcing the player to be judicious with their selections.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/hiero-gameplay.jpg&quot; alt=&quot;Hiero Game Play&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;h2&gt;Mechanics&lt;/h2&gt;
&lt;p&gt;As mentioned earlier, I didn’t want to use any JavaScript. My game is primarily built around two CSS mechanics: checkboxes with insane selector magic to update the game’s state, and an in-game timer created with an animation delay. The resulting code is in no-way elegant! It’s quite messy, convoluted, and slightly laggy. The CSS weighs in at roughly 60K!&lt;/p&gt;
&lt;h3&gt;Checkboxes&lt;/h3&gt;
&lt;p&gt;Most interactions are triggered with an HTML checkbox. Take this example:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;“checkbox”&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;“foo”&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;“foo”&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Interactive element&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Hidden element triggered by checkbox state&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We &lt;a href=&quot;https://github.com/starzonmyarmz/gamedevjs-jam-2021/blob/main/sass/_base.scss#L30-L35&quot;&gt;visually hide&lt;/a&gt; the &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; element using CSS, but we can still interact with it by clicking on a corresponding &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt;. This works so long as the &lt;code&gt;for&lt;/code&gt; attribute matches the &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;s &lt;code&gt;id&lt;/code&gt; attribute. The input returns a checked/unchecked state, and if we keep these elements as siblings (as opposed to parents/children) we can use this state to trigger other elements using CSS:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#foo:checked ~ div&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now this is a highly simplified example. I’m combining this checkbox functionality with CSS animations to time certain events such as scenes being loaded or triggering sound effects. Very little HTML is nested, and most elements are siblings to one another. One of the challenges was implementing the layout/design while keeping the HTML mostly flat. If I had nested elements a certain way, they wouldn&#39;t have been selectable with CSS.&lt;/p&gt;
&lt;h3&gt;Time Limit&lt;/h3&gt;
&lt;p&gt;When the player starts the game, it kicks off the &lt;a href=&quot;https://github.com/starzonmyarmz/gamedevjs-jam-2021/blob/main/sass/_lose.scss#L36-L37&quot;&gt;losing scene animation&lt;/a&gt; with a 78-second delay. The only way to pause/stop the animation is to &lt;a href=&quot;https://github.com/starzonmyarmz/gamedevjs-jam-2021/blob/main/sass/_transitions.scss#L40-L55&quot;&gt;match the CSS selector&lt;/a&gt; that determines if you beat the 15th puzzle, which simultaneously triggers the winning animation. Controlling animations this way is achieved using the &lt;code&gt;animation-play-state&lt;/code&gt; CSS property.&lt;/p&gt;
&lt;h3&gt;Triggering Sound&lt;/h3&gt;
&lt;p&gt;Setting an &lt;code&gt;&amp;lt;embed&amp;gt;&lt;/code&gt; element to &lt;code&gt;display: none&lt;/code&gt; will prevent it’s content from loading until it’s  &lt;code&gt;display&lt;/code&gt; property is reverted. So by setting an &lt;code&gt;&amp;lt;embed&amp;gt;&lt;/code&gt; source to a sound file, I was able to use this to load sound on demand. However, once the content is loaded, it’s here to stay. You can’t hide/unhide it to make it play again, stop it from playing, or even loop it. This trick also does not work with &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt;, or &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; elements.&lt;/p&gt;
&lt;p&gt;I was able to use the same checkbox mechanics above, and in some cases, an element’s  &lt;code&gt;:hover&lt;/code&gt; state to change an &lt;code&gt;&amp;lt;embed&amp;gt;&lt;/code&gt;s &lt;code&gt;display&lt;/code&gt; property. These constraints made it challenging to work with sound, but I am very happy with how it came out.&lt;/p&gt;
&lt;h2&gt;Artwork&lt;/h2&gt;
&lt;p&gt;I knew I was going to need a decent amount of artwork for matching shapes—on top of the other game-supporting graphics. By chance, I discovered that there are a ton of Hieroglyphs available as unicode characters. This spearheaded the visual direction, and adds to the game’s ominous atmosphere.&lt;/p&gt;
&lt;p&gt;As I sketched out ideas for the interface, the more I liked the idea of using my personal art style which combines hand-drawn illustrations and digital painting. As I started putting all the pieces together it started feeling a bit like a cartoon. This inspired my use of &lt;a href=&quot;https://fonts.google.com/specimen/Kalam#standard-styles&quot;&gt;Kalam&lt;/a&gt; for the title screen. I wanted to use something a little more legible for the interface text, and landed on &lt;a href=&quot;https://fonts.google.com/specimen/Josefin+Sans&quot;&gt;Josefin Sans&lt;/a&gt; which is inspired by geometric sans serif designs from the 1920s. To really help seal the deal on the old-school cartoon vibe, I added the film-grain overlaying textures, using CSS animation to &lt;a href=&quot;https://github.com/starzonmyarmz/gamedevjs-jam-2021/blob/main/sass/_base.scss#L128-L135&quot;&gt;shift the texture around&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In my opinion, this game would have worked just as well without the mirror graphic. It certainly would have simplified development not having to incorporate it! However, it really helps to drive the jam’s theme, so why not. It also gave me an excuse to mess around with CSS 3d transforms and perspective which isn’t something I get to do too often.&lt;/p&gt;
&lt;p&gt;The last thing I’d like to talk about in regards to the artwork is the “tunnel vision” gradient that occurs as you near the end of the time limit. This was an idea my daughter had while play testing for me. It really helps simultaneously create tension, panic, and focus. This was implemented at the last minute using a CSS &lt;code&gt;radial-gradient&lt;/code&gt; and &lt;a href=&quot;https://github.com/starzonmyarmz/gamedevjs-jam-2021/blob/main/sass/_base.scss#L139-L172&quot;&gt;animating it’s appearance&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/hiero-gradient.jpg&quot; alt=&quot;Tunnel Vision Gradient&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;h2&gt;Sound Design&lt;/h2&gt;
&lt;p&gt;In the past, I&#39;ve used JavaScript-powered, chiptune-styled sound. But that wouldn&#39;t really match the art style or ambiance. Also, I wanted to try something new!&lt;/p&gt;
&lt;p&gt;The limitations for triggering sound created some challenging conditions for creating sound. I couldn’t always control when the player would trigger a scene transition. Syncing chord progressions, rhythm, and melodies together was practically impossible. My approach was to keep the sound atmospheric in a way where sounds could be independently layered.&lt;/p&gt;
&lt;p&gt;The result was a bass layer of a single chord being held while randomly fluctuating effects on it. Next, a percussive track is layered on top when the player instantiates the game play. 30 seconds in the percussive track starts having echo effects slowly applied to help build intensity and uneasiness. Finally, a game over sound is layered in.&lt;/p&gt;
&lt;h2&gt;Tools&lt;/h2&gt;
&lt;p&gt;I’ve become a big fan of &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; since using it for my blog, and ended up using it to generate the game. It makes life so much easier than having to hand code every puzzle. With Eleventy, I have a &lt;a href=&quot;https://github.com/starzonmyarmz/gamedevjs-jam-2021/blob/main/src/_data/puzzles.json&quot;&gt;JSON file&lt;/a&gt; with all the puzzles, an &lt;a href=&quot;https://mozilla.github.io/nunjucks/&quot;&gt;Nunjucks&lt;/a&gt; &lt;a href=&quot;https://github.com/starzonmyarmz/gamedevjs-jam-2021/blob/main/src/index.njk#L25-L40&quot;&gt;puzzle template&lt;/a&gt;, and Eleventy just spits out the final HTML. One could argue that I’m using JavaScript by creating my game using Eleventy and Nunjucks, but I’m really just using those tools to optimize my workflow. The final output is HTML and CSS.&lt;/p&gt;
&lt;p&gt;I used &lt;a href=&quot;https://sass-lang.com/&quot;&gt;Sass&lt;/a&gt; for authoring CSS. I don’t always use Sass because I find the overhead isn’t always worth the benefits. However, in this case I really took advantage of Sass loops and logic statements which made it a lot faster/easier to generate a lot of the selector magic I shared earlier.&lt;/p&gt;
&lt;p&gt;I use any paper and pencil I can find to illustrate, and then ink those with &lt;a href=&quot;https://www.dickblick.com/products/sakura-pigma-micron-pen/&quot;&gt;Microns&lt;/a&gt;. Scan them in with my phone, and send them to my computer where I use &lt;a href=&quot;https://www.pixelmator.com/pro/&quot;&gt;Pixelmator&lt;/a&gt; to paint and optimize images.&lt;/p&gt;
&lt;p&gt;To create all the sounds, I used a &lt;a href=&quot;https://www.arturia.com/products/hybrid-synths/minilab-mkii/overview&quot;&gt;MiniLab MKII&lt;/a&gt; midi controller by Arturia with &lt;a href=&quot;https://www.ableton.com/en/live/&quot;&gt;Ableton Live&lt;/a&gt;, as well as &lt;a href=&quot;https://www.audacityteam.org/&quot;&gt;Audacity&lt;/a&gt; to refine the sounds a bit. Creating sound for this game was a completely different experience for me compared to &lt;a href=&quot;https://js13kgames.com/entries/onoff&quot;&gt;ONOFF&lt;/a&gt;, and I absolutely loved it! First of all, using a midi controller and Ableton are brand new tools for me. I spent two or three days doing nothing but messing around with sound and learning how to use Ableton. I really do see myself taking advantage of these tools in  future projects!&lt;/p&gt;
&lt;p&gt;The source is &lt;a href=&quot;https://github.com/starzonmyarmz/gamedevjs-jam-2021&quot;&gt;hosted on Github&lt;/a&gt;, and I’m using a GH workflow that was shared with me by one of the other developers in the jam which generates a ZIP file of the game and assets, and uploads it to &lt;a href=&quot;https://itch.io/jam/gamedevjs-2021/entries&quot;&gt;Itch.io&lt;/a&gt; where the game jam and games are hosted.&lt;/p&gt;
&lt;h2&gt;Nice to Haves&lt;/h2&gt;
&lt;p&gt;There are two primary things I really wish I could have put in the game, and would have had I not restricted myself from using JavaScript: a restart button on the end scenes, and the ability to randomize puzzles. The later would have added a lot more replay value. At the same time, it doesn’t bug me too much because I like the fact that everyone can beat the game after playing it a handful of times from memorizing the puzzle.&lt;/p&gt;
&lt;p&gt;I suppose another minor &lt;em&gt;nice to have&lt;/em&gt; would have been a counter letting you know how many strikes you have. That would have been easy enough to implement, but didn’t because I didn’t think it was too hard to keep track of strikes, nor did it add a lot of value by showing you those strikes.&lt;/p&gt;
&lt;h2&gt;Also…&lt;/h2&gt;
&lt;p&gt;What I haven’t mentioned yet is my son also joined the game jam! He’s been learning &lt;a href=&quot;https://unity.com/&quot;&gt;Unity&lt;/a&gt; and &lt;a href=&quot;https://www.blender.org/&quot;&gt;Blender&lt;/a&gt;, but has struggled to complete a full game. I suggested he work with me to get some experience.&lt;/p&gt;
&lt;p&gt;After I shared my game idea, he decided to &lt;a href=&quot;https://twitter.com/starzonmyarmz/status/1381928874272030722?s=20&quot;&gt;go it alone&lt;/a&gt;! We had a lot of fun pinging ideas of of each other, sharing each others pain and frustrations, and play testing! I’m very happy with how his game, &lt;a href=&quot;https://glassedgmr.itch.io/mirror-madness&quot;&gt;Mirror Madness&lt;/a&gt; came out, and am very proud of him.&lt;/p&gt;
&lt;h2&gt;Wrap Up&lt;/h2&gt;
&lt;p&gt;Heiro was ranked 11th out of 88 submitted games. I was hoping for top 10, but I&#39;m not going to complain—especially since the game only uses HTML and CSS mechanics! You can also check out the &lt;a href=&quot;https://itch.io/jam/gamedevjs-2021/rate/1007795&quot;&gt;full score breakdown&lt;/a&gt;, if you feel so inclined. I’m extremely happy with how &lt;a href=&quot;https://starzonmyarmz.itch.io/hiero&quot;&gt;Hiero&lt;/a&gt; came out—especially given the personal challenge of not using JavaScript! Thanks for everyone who played, and scored my game.&lt;/p&gt;
&lt;p&gt;I’d like to thank my daughters for play testing and being brutally honest when I asked for feedback. They gave me great ideas and pushed me to make Hiero as good as it is. My son, for coming along for the ride for me. And my wife, for putting up with the shenanigans of her middle-aged husband, and for challenging me to always do my best.&lt;/p&gt;
&lt;p&gt;I don’t know when I’ll make my next game, but the ideas are already brewing!&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>My GIF Workflow Using Eleventy, Netlify, and Alfred</title>
      <link href="https://iamdanielmarino.com/posts/my-gif-workflow-using-eleventy-netlify-alfred/"/>
      <updated>2021-02-13T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/my-gif-workflow-using-eleventy-netlify-alfred/</id>
      <content xml:lang="en" type="html">&lt;p&gt;I used to keep my GIFs on Dropbox in the &lt;code&gt;/public&lt;/code&gt; directory. There was a time when Dropbox would serve content as HTML from this directory. This was a simple way to share my GIFs with the world. I even adopted an &lt;a href=&quot;https://destroytoday.com/blog/gif-workflow&quot;&gt;Alfred workflow&lt;/a&gt; for quickly searching and copying my GIFs URL to the clipboard. Back in 2017, Dropbox disabled the ability to render HTML from the &lt;code&gt;/public&lt;/code&gt; directory, and thus this workflow stopped working.&lt;/p&gt;
&lt;p&gt;Since then I’ve been keeping my personal collection of GIFs in a GitHub repo—which has been just okay. I really missed having a quick way to search and copy URLs. To use a GIF I’d have to go to the repo, find the image, view the raw image, and  finally manually copy the url from the browser. Lame.&lt;/p&gt;
&lt;p&gt;A few weeks ago, I decided to give my GIF workflow an upgrade!&lt;/p&gt;
&lt;p&gt;I started by turning my &lt;a href=&quot;https://github.com/starzonmyarmz/gifs&quot;&gt;GIFs repo&lt;/a&gt; into a static site using &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;. The static site consists of two primary things: a directory with all of my GIFs, and a &lt;a href=&quot;https://github.com/starzonmyarmz/gifs/blob/main/src/gifs.njk&quot;&gt;generated JSON file&lt;/a&gt; listing all my GIFs (more on this in a bit).&lt;/p&gt;
&lt;p&gt;I created a new site on Netlify that watches my GIFs repo, and runs a build process anytime I push to &lt;code&gt;main&lt;/code&gt; branch. This only took a few minutes to set up, and all my GIFs are now easily accessible by URL.&lt;/p&gt;
&lt;p&gt;I was still missing a component though—a quick and easy way to search for GIFs and copy their URLs. I built an &lt;a href=&quot;https://github.com/starzonmyarmz/gifz-alfred-workflow/blob/main/index.js&quot;&gt;Alfred script&lt;/a&gt; using &lt;a href=&quot;https://github.com/sindresorhus/alfy&quot;&gt;Alfy&lt;/a&gt; to handle this part. Alfy is so cool to work with, allowing you to build Alfred workflows using JavaScript and Node. The Alfred Script takes an input, and searches for it against the &lt;a href=&quot;https://gifz.netlify.app/gifs.json&quot;&gt;JSON file on the Netlify site&lt;/a&gt;. When I find the GIF I want, it copies the URL to the clipboard.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/gif_workflow.gif&quot; alt=&quot;My gif flow using Alfred App&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;This update was well-needed, and I find myself using my personal GIFs much more often now! I only wish I had done something like this much sooner.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How to Process Customer Criticism</title>
      <link href="https://iamdanielmarino.com/posts/how-to-process-customer-criticism/"/>
      <updated>2020-09-01T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/how-to-process-customer-criticism/</id>
      <content xml:lang="en" type="html">&lt;p&gt;Why do us product designers opt into a career where we’re regularly challenged to be vulnerable?! Design is super subjective, and everyone is a critic! Regardless of your education or how sharp your &lt;em&gt;design eye&lt;/em&gt; is, you’ll never be able to please everyone. This is especially true when you work on a product that has thousands upon thousands of users!&lt;/p&gt;
&lt;p&gt;One of my personal challenges of being a product designer is learning how to process customer criticism. Its an ongoing struggle for me because I tend to be very sensitive to criticism in general. I’ve grown thicker skin over time, but there are still some days where I get down in the dumps.&lt;/p&gt;
&lt;p&gt;My knee jerk response is to cave in, and give everyone what they want (or demand) so we can all be happy. However, good product designers don’t cave. We take a breath and carefully processes the criticism.&lt;/p&gt;
&lt;h2&gt;Digging into Customer Criticism&lt;/h2&gt;
&lt;p&gt;It’s hard, but sometimes you need to dig underneath the harsh and sometimes-hurtful comments. Is there actual legitimate feedback? Even if a customer insults you, it doesn’t negate the fact that they’re having a poor experience.&lt;/p&gt;
&lt;p&gt;Once you’ve pushed past the hurtful comments and processed the feedback, are there common themes or issues raised by these customers? Obviously, bugs should be fixed, but have you overlooked some UX considerations?&lt;/p&gt;
&lt;p&gt;Be honest with yourself. If there are things you can improve, and time allows for it, you should improve them. Even the tiniest improvement can be enough to change someone’s reception to a design!&lt;/p&gt;
&lt;h2&gt;Haters Gonna Hate&lt;/h2&gt;
&lt;p&gt;What about the people that hate something just because they can? Sometimes you just have to accept the fact that some people aren’t going to like something. Some things to consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;You’re more likely to hear negative feedback.&lt;/strong&gt; People are more inclined to write a support ticket when they dislike something. For every person complaining about your design, there’s likely hundreds or thousands that really like it!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Some folks like to complain for the sake of complaining.&lt;/strong&gt; I’m not ashamed to admit that if someone tweets something nasty at us, I’ll often stalk them on Twitter for a bit to help get a read on the person. You’d be surprised (or maybe you wouldn’t) how often these folks are habitual complainers—wasting time tweeting at other companies. You’ll never please these people.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sometimes a thoughtful response will be appreciated.&lt;/strong&gt; I don’t necessarily do this for every support request, but sometimes I’ll respond by explaining the reasoning of why a design was implemented the way it is. This does require a little care because you don’t want to sound like you don’t care about a person’s feedback. You still want to acknowledge the the customer’s complaint even if you’re not planning on changing the design. Sometimes these customers reply with a heartfelt appreciation for the explanation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If someone really dislikes your product, they’ll pack up and leave.&lt;/strong&gt; It sounds harsh, but it’s reality. Obviously you don’t want an exodus, and if that’s the case you should probably take a step back and reexamine things. However, it’s quite possible your product isn’t the right fit for some particular people. That said, it’s also unlikely that one disliked design is going to drive a customer away.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Abusive Customers&lt;/h2&gt;
&lt;p&gt;I don’t advocate taking abuse from customers on the chin. While I don’t think it’s okay to sling it back at your customers, I do think it’s fair game to call out hostile tone. I’m blessed to work for a &lt;a href=&quot;https://www.getharvest.com/&quot;&gt;company&lt;/a&gt; that has a policy around handling abusive customers. Your company may also address how to handle these types of customers. If you’re in a position to make these types of policies I highly recommend you do!&lt;/p&gt;
&lt;h2&gt;You’re Awesome&lt;/h2&gt;
&lt;p&gt;I mean… maybe you’re not awesome? Regardless, dealing with customer criticism can be really hard! And at the end of a hard day—no matter how awesome you are or aren’t, &lt;a href=&quot;https://media.giphy.com/media/13jJIY0llDdip2/giphy.gif&quot;&gt;treat yoself&lt;/a&gt;! Have a little extra dessert, play video games a little longer, crank some tunes extra loud! Try not to take customer criticism personally. Instead, look past the harsh tones, and try to find legitimate and actionable feedback.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Don’t Overthink Remote Working</title>
      <link href="https://iamdanielmarino.com/posts/dont-overthink-remote-working/"/>
      <updated>2020-03-13T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/dont-overthink-remote-working/</id>
      <content xml:lang="en" type="html">&lt;p&gt;The coronavirus is here, and as a result a lot of employers are asking employees to work remotely if possible. I’ve seen a fair share of &lt;em&gt;tips for remote working&lt;/em&gt; blog posts this past week. I figured I’d cash in on the action and share my thoughts.&lt;/p&gt;
&lt;h2&gt;Don’t Overthink It&lt;/h2&gt;
&lt;p&gt;Most of the posts I’ve read, more or less, are saying the same things: have an enjoyable working environment, communicate with your team regularly, stick to a schedule, yada yada yada…&lt;/p&gt;
&lt;p&gt;All of those are great, but also seem subjective. Maybe its because I’ve been a remote working for over 10 years, but I have a different  point of view here. The best advice I have is: &lt;strong&gt;don’t overthink it&lt;/strong&gt;. I’m not saying all those other things aren’t important, however if you spend too much time focusing on: &lt;em&gt;I have to do this&lt;/em&gt; and &lt;em&gt;I have to do that&lt;/em&gt;, you’ll probably find the transition will be more difficult and take longer.&lt;/p&gt;
&lt;h2&gt;It is a Transition&lt;/h2&gt;
&lt;p&gt;Simply be aware that remote working &lt;em&gt;is&lt;/em&gt; a transition, especially if you’ve worked in an office environment for some time. And that’s ok! Recognize this, but try not to dwell on it too much. Do what you can to figure out how to get into &lt;em&gt;your&lt;/em&gt; groove quickly. Maybe that means working in pajamas, or working at the kitchen table instead of a dedicated office, or whatever!&lt;/p&gt;
&lt;p&gt;The fact is, it will take you a little time to get used to remote working. And you’ll likely have to try different things to find what works for you. Your preferences might also fluctuate over time. Be aware of the transition, and try not to overthink it.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Deploying My Eleventy Site to GitHub Pages</title>
      <link href="https://iamdanielmarino.com/posts/deploying-my-eleventy-site-to-github-pages/"/>
      <updated>2020-03-02T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/deploying-my-eleventy-site-to-github-pages/</id>
      <content xml:lang="en" type="html">&lt;p&gt;I really like &lt;a href=&quot;https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt;, and have used it to host my site for a while. The biggest challenge of switching my site to &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; was getting deployments to GitHub pages set up. I suppose I could have built my site locally, and then push that to the &lt;code&gt;gh-pages&lt;/code&gt; branch, but that felt &lt;em&gt;wrong&lt;/em&gt;. I prefer my &lt;code&gt;master&lt;/code&gt; branch to be the source of my site, while &lt;code&gt;gh-pages&lt;/code&gt; to only be the published content.&lt;/p&gt;
&lt;p&gt;I’m aware of tools such as &lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt; and &lt;a href=&quot;https://travis-ci.com/&quot;&gt;Travis CI&lt;/a&gt; which aid in hosting or deployment processes. However I wasn’t looking to add another service into my tech stack. With some digging into &lt;a href=&quot;https://github.com/features/actions&quot;&gt;GitHub Actions&lt;/a&gt;, this seemed like a plausible route for getting my site deployed without having to rely on an external service.&lt;/p&gt;
&lt;h3&gt;Setting Up a GitHub Action&lt;/h3&gt;
&lt;p&gt;GitHub Actions allow you to automate workflows such as code deployment, running tests, compressing images, and so much more. GitHub has a whole &lt;em&gt;Marketplace&lt;/em&gt; where you can explore community-created actions. I’m using the &lt;a href=&quot;https://github.com/marketplace/actions/github-pages-action&quot;&gt;GitHub Pages action&lt;/a&gt; which handles everything I need for deploying. My workflow is fairly simple, and is largely based on the instructions for &lt;a href=&quot;https://github.com/marketplace/actions/github-pages-action#%EF%B8%8F-static-site-generators-with-nodejs&quot;&gt;Static Site Generators with Node.js&lt;/a&gt;. In &lt;code&gt;/.github/workflows/eleventy_build.yml&lt;/code&gt;, I have the following:&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Eleventy Build

&lt;span class=&quot;token key atrule&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;branches&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; master

&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;18.04&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/checkout@v2

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Setup Node
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/setup&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node@v1
        &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;node-version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;10.x&#39;&lt;/span&gt;

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; npm ci

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; npm run build

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Deploy
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; peaceiris/actions&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;gh&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;pages@v3
        &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;deploy_key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.ACTIONS_DEPLOY_KEY &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;publish_dir&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ./dist&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Depending on how your Eleventy project is set up you might need to make some tweaks to the defaults. I recommend checking out the rest of the &lt;a href=&quot;https://github.com/marketplace/actions/github-pages-action#table-of-contents&quot;&gt;documentation&lt;/a&gt; to see what you can do.&lt;/p&gt;
&lt;h3&gt;Hey GitHub, I’m Not Using Jekyll&lt;/h3&gt;
&lt;p&gt;I found this to be the biggest hurdle, and it kind of buried in &lt;a href=&quot;https://help.github.com/en/github/working-with-github-pages/about-github-pages#static-site-generators&quot;&gt;GitHub’s documentation&lt;/a&gt;. By default, GitHub tries to use Jekyll to build your site. If you’re using any syntax other than what Jekyll recognizes, then you &lt;em&gt;might&lt;/em&gt; get errors and your build could potentially fail. The good news is the fix is really easy. In the root of your project, include an empty file &lt;code&gt;.nojekyll&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Committing the Package Lock file&lt;/h3&gt;
&lt;p&gt;This GitHub action is an &lt;em&gt;automated environment&lt;/em&gt;, so rather than use &lt;code&gt;npm install&lt;/code&gt; our action should use &lt;code&gt;npm ci&lt;/code&gt;. This ensures that you get a &lt;em&gt;clean install&lt;/em&gt; of your dependencies. One of the requirements for using &lt;code&gt;npm ci&lt;/code&gt; is that the project &lt;strong&gt;must&lt;/strong&gt; have an existing &lt;code&gt;package-lock.json&lt;/code&gt;. I’m not really sure what the norm is here, but I don’t typically commit this file. So if you fall into that category, make sure you get that file committed!&lt;/p&gt;
&lt;h3&gt;Creating an NPM Build Script&lt;/h3&gt;
&lt;p&gt;When it’s time for Eleventy to build your site when the &lt;code&gt;master&lt;/code&gt; branch is pushed upstream, it needs to happen in the context of the Node environment. In my &lt;code&gt;package.json&lt;/code&gt; I have a script mapped to the command &lt;code&gt;eleventy&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;eleventy&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now when &lt;code&gt;npm run build&lt;/code&gt; runs in the GitHub action, it will know where to find the &lt;code&gt;eleventy&lt;/code&gt; command.&lt;/p&gt;
&lt;h3&gt;No SSH Deploy Key? No Deployment!&lt;/h3&gt;
&lt;p&gt;For security purposes, GitHub requires that you have a &lt;em&gt;deploy key&lt;/em&gt; and a corresponding &lt;em&gt;secret&lt;/em&gt; set up in the repository that this GitHub Action is in. There’s handy &lt;a href=&quot;https://github.com/marketplace/actions/github-pages-action#%EF%B8%8F-create-ssh-deploy-key&quot;&gt;step by step guide with screenshots&lt;/a&gt; on how to create the deploy key and secret, as well as adding them to the repository.&lt;/p&gt;
&lt;p&gt;In my case I’ve labelled my deploy key &lt;em&gt;ACTIONS_DEPLOY_KEY&lt;/em&gt;. This is case-sensitive, so make sure you pay attention to what you call your deploy key!&lt;/p&gt;
&lt;h3&gt;Wrapping Up&lt;/h3&gt;
&lt;p&gt;While I’m not sure if this is the best way to get my Eleventy site deployed to GitHub Pages, it meets my needs. As far as I can tell, this general deployment process would be fairly similar to set up with a service like Netlify or Travis CI. However I find it extremely satisfying not being dependent on extra services.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Trying Out Eleventy</title>
      <link href="https://iamdanielmarino.com/posts/trying-out-eleventy/"/>
      <updated>2020-02-18T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/trying-out-eleventy/</id>
      <content xml:lang="en" type="html">&lt;p&gt;As I started to think about blogging again, I began looking at options for hosting, CMS frameworks, static site generators, etc. &lt;a href=&quot;http://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; has been in the mainstream for sometime now, and I&#39;ve heard nothing but good things about it. I figured I should give it a shot.&lt;/p&gt;
&lt;p&gt;There are no shortage of examples for using Eleventy, but I particularly found &lt;a href=&quot;https://hankchizljaw.com/&quot;&gt;Andy Bell’s&lt;/a&gt; &lt;a href=&quot;https://hebra.dev/&quot;&gt;Hebra&lt;/a&gt; starter kit, as well as the &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog&quot;&gt;Eleventy Base Blog&lt;/a&gt; to be excellent resources. I&#39;m using &lt;a href=&quot;https://mozilla.github.io/nunjucks/&quot;&gt;Nunjucks&lt;/a&gt; for templating. It more or less feels like &lt;a href=&quot;https://shopify.github.io/liquid/&quot;&gt;Liquid&lt;/a&gt; which I&#39;m familiar with from having used &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;, as well as creating &lt;a href=&quot;https://www.statemottoprints.com/&quot;&gt;State Motto Prints&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the course of an afternoon, I was able to put together the &lt;a href=&quot;https://github.com/starzonmyarmz/iamdanielmarino.com&quot;&gt;bones of this redesign&lt;/a&gt;. Over the past week, during my spare time, I&#39;ve been adding polish, and getting deployments working with Github Pages. I&#39;ll continue to make tweaks here and there, but overall I feel good about it.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How I Manage Projects</title>
      <link href="https://iamdanielmarino.com/posts/how-i-manage-projects/"/>
      <updated>2020-02-12T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/how-i-manage-projects/</id>
      <content xml:lang="en" type="html">&lt;p&gt;As a Product Designer at &lt;a href=&quot;https://getharvest.com/&quot;&gt;Harvest&lt;/a&gt;, part of my role is running projects. While I don’t believe there is a &lt;em&gt;right&lt;/em&gt; or &lt;em&gt;wrong&lt;/em&gt; way to manage projects, I do think there are some methods that can yield better results. I’m hardly an expert in this area, but I’d like to share some of the ways I find success in managing projects.&lt;/p&gt;
&lt;p&gt;I should mention that these thoughts are my own. I’m extremely blessed to work for a company that gives some freedom as to how individuals run projects. Of course there are some fixed variables. For example, we all use Basecamp for tracking updates, and follow the same guidelines for communicating updates with other teams within Harvest.&lt;/p&gt;
&lt;h3&gt;Ethos&lt;/h3&gt;
&lt;p&gt;I don’t really have some profound wisdom to share. Basically, I try to stay out of the way as much as possible, leaving room for my teammates to get their work done. Their time, much like mine, is valuable. Out of respect, I try not to gum up the works with unnecessary meetings or emails. This doesn’t mean I’m out of the loop. We’re all generally aware of what the other person is working on.&lt;/p&gt;
&lt;h3&gt;The Kickoff&lt;/h3&gt;
&lt;p&gt;In preparation for the &lt;em&gt;Kickoff&lt;/em&gt;, I prefer creating a Google Doc with the project details rather than a slideshow. It’s much easier to review and edit on the fly. I also don’t have to get hung up on the little things like &lt;em&gt;does this slide look pretty&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Typically, I keep the Kickoff to 30 minutes or less. This isn’t the place to figure out technical or design decisions. We still might kick around some ideas and ask questions, but typically we breakout into smaller groups as needed. My preference is to have the Kickoff the Friday before the project starts. This allows my distributed team to hit the ground running first thing Monday morning.&lt;/p&gt;
&lt;h3&gt;Weekly Hangout&lt;/h3&gt;
&lt;p&gt;Once a week, our team will meet over a Google Hangout for about 20–30 minutes to discuss updates. We don’t necessarily try to solve problems in these meetings unless they’re quick and easy to figure out. The goal of these hangouts is to make sure we’re all on the same page throughout the course of the project.&lt;/p&gt;
&lt;h3&gt;Daily Slack Check-in&lt;/h3&gt;
&lt;p&gt;Simply put, I hate &lt;em&gt;unnecessary&lt;/em&gt; meetings, and find that most others do too. They disrupt the flow of my work day, and I suspect they do for others too. I prefer daily check-ins on &lt;a href=&quot;https://slack.com/&quot;&gt;Slack&lt;/a&gt; because it’s asynchronous. It allows my to get updates as breaks occur naturally throughout my day. I ask teammates to write a one- or two-sentence update. Basically what are you working on and is anything blocking you from completing it. Short and sweet.&lt;/p&gt;
&lt;p&gt;Of course, if something is pressing or I’m blocking a todo from progressing, I ask my teammates to @ me, so that I get an immediate notification.&lt;/p&gt;
&lt;p&gt;I know some people are into multiple email check-ins throughout the week (such as Basecamp’s automated check-ins). Personally, I dislike these—primarily because it feels like extra clutter in my inbox.&lt;/p&gt;
&lt;h3&gt;Todos on Basecamp&lt;/h3&gt;
&lt;p&gt;Previously I mentioned we all use &lt;a href=&quot;https://basecamp.com/&quot;&gt;Basecamp&lt;/a&gt; at Harvest. I hold my teammates responsible for making todos, and keeping related discussions up-to-date. That means a developer may create multiple todos for building out a feature or creating a todo for me to apply some design polish.&lt;/p&gt;
&lt;p&gt;That’s the bulk of it. Of course there are little things here and there that I didn’t go over, but this should give you a glimpse into how I manage projects.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>JS13K 2018 Retrospective</title>
      <link href="https://iamdanielmarino.com/posts/js13k-2018-retrospective/"/>
      <updated>2018-10-15T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/js13k-2018-retrospective/</id>
      <content xml:lang="en" type="html">&lt;p&gt;In one of my weekly developer emails, I saw a link for &lt;a href=&quot;https://2018.js13kgames.com/&quot;&gt;JS13KGames&lt;/a&gt;. I&#39;ve always wanted to create a video game. I asked my JavaScript-whiz buddy, &lt;a href=&quot;https://github.com/braddunbar&quot;&gt;Brad&lt;/a&gt;, if he was interested in building a game with me. Without hesitation, he said “Yes!”&lt;/p&gt;
&lt;h3&gt;Concept&lt;/h3&gt;
&lt;p&gt;A couple of years ago I came up with the basic concept/mechanic of toggling layers on and off to create various platforming challenges. I had even sketched out several level designs, and cobbled together a super basic prototype using &lt;a href=&quot;http://phaser.io/&quot;&gt;Phaser.io&lt;/a&gt;. I was pretty happy with this simple mechanic. On top of that our character movement would consist of basic platforming: moving left/right and jumping.&lt;/p&gt;
&lt;p&gt;There are &lt;a href=&quot;https://github.com/starzonmyarmz/js13k-2018/projects/1&quot;&gt;other ideas&lt;/a&gt; we had early on such as moving platforms/spikes, enemies, variances in gravity, as well as an in-game timer, but we ended up punting on those due to time and size constraints. Aside from adding complexity to our code, I think having the constraints challenged us to explore more with level design - as well as simplifying game play.&lt;/p&gt;
&lt;h3&gt;Art Style, Design, and UX&lt;/h3&gt;
&lt;p&gt;Originally, I envisioned the game having a pixel art style, but with the 13K and 30 day limits, I decided to simplify. Designing a minimum of 20 levels would take up quite a bit of time. Exploring pixel sprite and background designs would have prevented me from being able to create enough levels to make the game worth playing. I decided to stick with two colors.&lt;/p&gt;
&lt;p&gt;I wanted to avoid using text to educate game mechanics. I took inspiration from countless video games (but specifically Super Mario World, Super Metroid, Megaman X), and started out by creating the first three levels that would introduce game mechanics one at a time. I then kept exploring various level designs until I had about six or seven solid levels.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/js13k2018-education.png&quot; alt=&quot;original idea about education&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;Original idea for educating game controls to player&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;While Brad was developing the mechanics, I solicited the help of my son to help me design the character. It went through some variations, but the final character was pretty similar to what we started with. In my mind I could see his legs moving and his head bobbing. He originally had rounded corners, but that ended up making the &lt;code&gt;svg&lt;/code&gt; output more complicated, so in the end we ditched them.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/js13k2018-characters.png&quot; alt=&quot;character ideas&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;Other character ideas&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I liked the idea of the &lt;em&gt;toggle&lt;/em&gt; concept being carried through all the various screens, and not just the levels. So I designed the title, end, and controller screens with this in mind.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://iamdanielmarino.com/images/posts/js13k2018-font.png&quot; alt=&quot;typeface&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;&lt;a href=&quot;https://github.com/starzonmyarmz/js13k-2018/blob/gh-pages/refs/onoff.otf&quot;&gt;Custom typeface&lt;/a&gt; designed for ONOFF&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3&gt;Music and Sound Effects&lt;/h3&gt;
&lt;p&gt;I procrastinated with sound for two weeks or so. At first I got hung up on the options available for creating music and sound effects, until I came across &lt;a href=&quot;https://github.com/kevincennis/TinyMusic&quot;&gt;TinyMusic&lt;/a&gt;. I really liked the simplicity of it, that I was able to focus on music, not getting hung up on the plethora of styles and effects.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://jsfiddle.net/0k6tLnfd/8/&quot;&gt;original track&lt;/a&gt; I wrote was more driving, but lacked personality. I hemmed and hawed for a week, then one morning I just started humming a really silly tune, and it felt just right for the game. The second part of that song (with the walking bass line) came a week later. I was experimenting to see if I could get chords &lt;a href=&quot;https://github.com/starzonmyarmz/js13k-2018/blob/gh-pages/src/sound.js#L327-L351&quot;&gt;fade in and out&lt;/a&gt;. Once I got that working the bass line just worked itself out, and I had the second half to my song.&lt;/p&gt;
&lt;p&gt;For sound effects, I had found some effects I really liked on &lt;a href=&quot;https://opengameart.org/&quot;&gt;OpenGameArt&lt;/a&gt; - however the file sizes were huge. No amount of resampling got them even close to 13K. So I ended up trying to &lt;em&gt;recreate&lt;/em&gt; those sounds using TinyMusic.&lt;/p&gt;
&lt;h3&gt;Development&lt;/h3&gt;
&lt;p&gt;We didn’t think it was necessary to use &lt;code&gt;canvas&lt;/code&gt;, and opted use &lt;code&gt;svg&lt;/code&gt;. This allowed us to easily scale graphics, use CSS to flip the colors when the layers were toggled, as well as easily develop graphics. In a lot of cases, I hard coded graphics such as the &lt;a href=&quot;https://github.com/starzonmyarmz/js13k-2018/blob/gh-pages/index.html#L135-L159&quot;&gt;death animation&lt;/a&gt; or the death counter, and then Brad would step in and wire it up with JavaScript.&lt;/p&gt;
&lt;p&gt;I ran every graphic I created through &lt;a href=&quot;https://jakearchibald.github.io/svgomg/&quot;&gt;SVGOMG&lt;/a&gt; which helped keep our SVG super lightweight. In some cases, I found it more performant to use plain old &lt;code&gt;rect&lt;/code&gt;s or take advantage of SVG &lt;code&gt;pattern&lt;/code&gt;s for the &lt;a href=&quot;https://github.com/starzonmyarmz/js13k-2018/blob/gh-pages/index.html#L107-L118&quot;&gt;numbers used&lt;/a&gt; in the death and level counter, as well as the &lt;a href=&quot;https://github.com/starzonmyarmz/js13k-2018/blob/gh-pages/index.html#L80-L93&quot;&gt;spikes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I left the decision to Brad whether we should roll our own game mechanics or use an existing library. We both felt it would be more fun to write our own. This also gave us a lot more control over the file sizes and code quality. Using ES6 made the vast majority of the code easier to write, and we didn’t end up having to polyfill anything.&lt;/p&gt;
&lt;p&gt;For level design, Brad had created the ability to bootstrap levels quickly just by passing in an array of coordinates for the character, goal, and platforms (including the layer they should exist on). After getting a little burnt out on level design, I messed around with creating some dynamically generated levels.&lt;/p&gt;
&lt;p&gt;We developed right up to the very end. Within the last 12 hours before the deadline we rolled out Gamepad support, the ability to share and play custom levels, and wrote another song to play when the game is completed.&lt;/p&gt;
&lt;h3&gt;Tooling and 13k&lt;/h3&gt;
&lt;p&gt;Our tooling was minimal. We would run our JS, CSS, and HTML through minifiers - that’s it. We decided to build everything as minimal as possible from the beginning, so we didn’t really have to go back and rework anything to hit the 13k limit.&lt;/p&gt;
&lt;p&gt;After building the game we were still far under 13k, so Brad decided to roll out a custom level editor! That actually turned out to be a huge help because it made it a lot faster to test out ideas, and generate level code that we could just paste into our game. We though it was so cool we decided to include it as a bonus with a day left before the deadline!&lt;/p&gt;
&lt;h3&gt;Playtesting&lt;/h3&gt;
&lt;p&gt;Aside from having our kids play the game frequently (and they did!) we invited a few friends to play with about a week left in the competition. They felt that the game mechanics felt good, and were fairly easy to figure out. Looking back I wish we had people play it sooner - only because we were scrambling around with a few days left to finish building the game. If we had received more drastic feedback, we would have been in a really tight spot.&lt;/p&gt;
&lt;h3&gt;Wrap Up&lt;/h3&gt;
&lt;p&gt;Brad and I had a blast working on the js13k this year! I’m really grateful to Brad and all his help, our friends who took the time to playtest and give us feedback, and especially our families who gave endless support, and endured hours and hours of that music loop!&lt;/p&gt;
&lt;p&gt;If you haven’t yet, make sure you check out our game &lt;a href=&quot;https://js13kgames.com/entries/onoff&quot;&gt;ONOFF&lt;/a&gt;!&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>My First Sketch Plugin and What I Learned</title>
      <link href="https://iamdanielmarino.com/posts/my-first-sketch-plugin-and-what-i-learned/"/>
      <updated>2016-05-16T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/my-first-sketch-plugin-and-what-i-learned/</id>
      <content xml:lang="en" type="html">&lt;p&gt;I’ve been Adobe Illustrator free for almost six months now, and what I miss most about it are some of the nice effects it ships with. I love Sketch, but I don’t think these effects will ever make their way into Sketch. Sketch does have the ability to add plugins, and I’ve always wanted to try my hand at creating one. I really miss is Illustrator’s &lt;em&gt;Roughen&lt;/em&gt; effect as it’s really useful for creating that trendy-old-timey-beat-up look. Since a Sketch plugin that &lt;em&gt;roughens&lt;/em&gt; a path doesn’t already exist (that I could find) I decided to create one!&lt;/p&gt;
&lt;p&gt;I’m going to be up front, and this is mostly a decompression of all the frustration I felt while working on the plugin.&lt;/p&gt;
&lt;h2&gt;Delete and reinstall * Infinity&lt;/h2&gt;
&lt;p&gt;I spent a lot of time just uninstalling, reinstalling the plugin any time I made a change to the plugin script. This was super annoying, but I’m not entirely sure if there was a way around this. Using the &lt;strong&gt;Custom Plugin&lt;/strong&gt; menu option was quick and useful for testing out snippets of code, but it’s not a fully fledged code editor, so I wouldn’t want to use it for sole development. Using &lt;code&gt;print()&lt;/code&gt; was sometimes useful for logging data to the console, but a lot of the times what was being logged was utter nonsense and useless. This brings me to my next topic.&lt;/p&gt;
&lt;h2&gt;Documentation Wasn’t Too Useful&lt;/h2&gt;
&lt;p&gt;I admit I’m not a hardcore developer, but I like to think I’m seasoned enough that I can review some documentation and forge ahead. Looking at the docs on Apple’s site was like reading a Unix software manual out of the 80’s. It didn’t help me out so much. Not only that, Googling Appkit or Cocoa (to be honest I don’t even understand which is which) methods didn’t help either. Is there a secret club you have to belong to to get useful examples and tutorials?&lt;/p&gt;
&lt;p&gt;I’m good with JavaScript, so CocoaScript was nice for bridging the gap. However it’s really weird to me that you can write code in Cocoa notation in CocoaScript. Pick a syntax variation and stick with it!&lt;/p&gt;
&lt;p&gt;The Sketch API docs are incomplete, and the examples that were there weren’t entirely useful. They must also be restructuring because halfway through development all the docs and links changed. Some content was removed entirely that I found kind of useful. Thank God for Google caching! I learned the most from looking at other plugins that did similar things I was looking to do. I also found &lt;a href=&quot;https://github.com/turbobabr/Sketch-Plugins-Cookbook&quot;&gt;this resource&lt;/a&gt; invaluable - there is so much great stuff in there.&lt;/p&gt;
&lt;h2&gt;Late to the Party&lt;/h2&gt;
&lt;p&gt;So while I’m decompressing from this project I’m remembering I belong to the &lt;a href=&quot;http://teamsketch.io/&quot;&gt;Team Sketch&lt;/a&gt; Slack Team. I wish I had remembered this earlier because there’s a channel dedicated to plug in development, and I’m sure I could’ve have received a lot of help from there. Just scrolling through the last 50 or so messages I saw an assortment of links that would have been useful.&lt;/p&gt;
&lt;h2&gt;Wrap Up&lt;/h2&gt;
&lt;p&gt;I know I complained a lot in this post. Despite the things that I felt held me back, I feel like I can improve my plugin quite a bit, so I wouldn’t say I’m done. I’d like to utilize the Team Sketch Slack Team and some of the resources I found.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Install Mcrypt PHP Extension on OSX Yosemite</title>
      <link href="https://iamdanielmarino.com/posts/install-mcrypt-php-extension-on-osx-yosemite/"/>
      <updated>2015-01-29T00:00:00Z</updated>
      <id>https://iamdanielmarino.com/posts/install-mcrypt-php-extension-on-osx-yosemite/</id>
      <content xml:lang="en" type="html">&lt;p&gt;After updating &lt;a href=&quot;http://statamic.com/&quot;&gt;Statamic&lt;/a&gt; to 1.10.2, I started getting &lt;a href=&quot;http://en.wikipedia.org/wiki/Mcrypt&quot;&gt;Mcrypt&lt;/a&gt; errors. After some Googling, I found some complicated fixes. After some noodling around, here’s a simple way to fix it with &lt;a href=&quot;http://brew.sh/&quot;&gt;Homebrew&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;First, figure out which version of PHP you’re running. You can do this by opening up Terminal, and running the following command:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; php &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I happen to be using PHP 5.5.21 locally, so I’ll use that in my examples. Next, &lt;em&gt;tap&lt;/em&gt; the &lt;code&gt;homebrew/php&lt;/code&gt; cask:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; brew tap homebrew/php&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This next step is sort of optional. You can search for which versions of mcrypt is available to make sure it matches your version of PHP:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; brew search mcrypt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Like I said earlier, I’m running PHP 5.5.21. Make sure you install the version that corresponds with your version of PHP.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; php55-mcrypt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That last command took several minutes to install it on my machine. After it is installed, restart the server, and you should be good to go!&lt;/p&gt;
</content>
    </entry>
</feed>
