<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Skye Freeman</title>
  <id>https://skyefreeman.com/blog</id>
  <link rel="self" type="application/atom+xml" href="https://skyefreeman.com/blog/feed.atom"/>
  <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog"/>
  <updated>2026-04-15T04:20:25Z</updated>
  <author>
    <name>Skye Freeman</name>
  </author>
  <entry>
    <title>How I'm using LLM's via Emacs</title>
    <id>https://skyefreeman.com/blog/2026/04/15/how-im-using-llms-with-emacs</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2026/04/15/how-im-using-llms-with-emacs"/>
    <published>2026-04-15T04:20:25Z</published>
    <updated>2026-04-15T04:31:24Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;The advent of LLM's and the subsequent explosion of developer tools for interfacing with them has made being an Emacs user better than ever. Since Emacs can be molded into whatever you want it to be, the latest agentic tooling can be grafted into Emacs and integrated into your workflow with little ceremony.&lt;br&gt;&lt;br&gt;I've experimented with a number of LLM + Emacs integrations over the past 3 years. First, starting out with ChatGPT usage through &lt;a href="https://github.com/xenodium/chatgpt-shell"&gt;chatgpt-shell&lt;/a&gt;, then moving on to the &lt;a href="https://github.com/stevemolitor/claude-code.el"&gt;claude-code&lt;/a&gt; Emacs package. I eventually built out my own terminal based setup by firing up agents through &lt;a href="https://github.com/akermu/emacs-libvterm"&gt;vterm&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Now, I've consolidated down to two lean configurations based on the Emacs packages &lt;a href="https://github.com/xenodium/agent-shell"&gt;agent-shell&lt;/a&gt; and &lt;a href="https://github.com/karthink/gptel"&gt;gptel&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;h1&gt;agent-shell&lt;/h1&gt;&lt;div&gt;&lt;br&gt;The &lt;a href="https://github.com/xenodium/agent-shell"&gt;agent-shell&lt;/a&gt; Emacs package has become my daily driver for most workflows. It's a major mode for interfacing with terminal based agent interfaces. agent-shell supports all the major model providers and versions, and abstracts away enough of the differences so that swapping between them is as simple as configuring an API key.&lt;br&gt;&lt;br&gt;My preferred method of configuration is via "use-package", here's a lean example configuration:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;pre&gt;(use-package agent-shell
    :ensure t
    :vc (:url "https://github.com/xenodium/agent-shell" :rev :newest)
    :ensure-system-package
    ((claude . "brew install claude-code")
     (claude-agent-acp . "npm install -g @zed-industries/claude-agent-acp")
     (codex . "brew install codex")
     (codex-agent-acp . "npm install -g @zed-industries/codex-acp")
    )
    :custom
    ((agent-shell-anthropic-authentication
      (agent-shell-anthropic-make-authentication
       :api-key (string-trim
                 (shell-command-to-string "$SHELL --login -c 'echo $ANTHROPIC_API_KEY'"))))

     (agent-shell-openai-authentication
      (agent-shell-openai-make-authentication
       :api-key (string-trim
                 (shell-command-to-string "$SHELL --login -c 'echo $OPENAI_API_KEY'"))))
                 
     (agent-shell-anthropic-claude-acp-command
      '("claude-agent-acp" "--dangerously-skip-permissions"))
     )
    :bind (:map agent-shell-mode-map
                ("C-&amp;lt;tab&amp;gt;" . nil)))&lt;/pre&gt;&lt;div&gt;&lt;br&gt;This config handles API key integrations for both Codex and Claude Code, and ensures external dependencies are installed on the system. This little tidbit:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;pre&gt;(agent-shell-anthropic-claude-acp-command
      '("claude-agent-acp" "--dangerously-skip-permissions"))&lt;/pre&gt;&lt;div&gt;&lt;br&gt;overrides the default "claude-agent-acp" command to include the "&lt;em&gt;--dangerously-skip-permissions&lt;/em&gt; flag" when starting the agent.&lt;br&gt;&lt;br&gt;Start a new session with the interactive function "M-x agent-shell", you're then prompted to choose between the following supported model providers:&amp;nbsp;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Claude Code&lt;/li&gt;&lt;li&gt;Codex&lt;/li&gt;&lt;li&gt;Auggie&amp;nbsp;&lt;/li&gt;&lt;li&gt;Copilot&lt;/li&gt;&lt;li&gt;Cursor&lt;/li&gt;&lt;li&gt;Droid&lt;/li&gt;&lt;li&gt;Gemini CLI&amp;nbsp;&lt;/li&gt;&lt;li&gt;Goose&lt;/li&gt;&lt;li&gt;Mistral Vibe&lt;/li&gt;&lt;li&gt;OpenCode&lt;/li&gt;&lt;li&gt;Pi&lt;/li&gt;&lt;li&gt;Qwen Code&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;agent-shell buffers are name-spaced using a string format of the current directory and model name. For example, starting a Claude Code session while located in the folder "~/dev/skyefreeman.com", will result in a new agent-shell buffer named: "Claude Code Agent @ skyefreeman.com". This means that switching between concurrent sessions is the same as swapping between Emacs buffers using one of the many built-in buffer switching functions:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;pre&gt;M-x switch-to-buffer
M-x counsel-switch-buffer&lt;/pre&gt;&lt;div&gt;&lt;br&gt;Since spinning up new agents has become so common in my workflow, I've bound starting a new agent to the coveted "Command-return" key combo, which starts a new session with one keystroke:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;pre&gt;(global-set-key (kbd "&amp;lt;s-return&amp;gt;") 
      'agent-shell-anthropic-start-claude-code)&lt;/pre&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h1&gt;gptel&lt;/h1&gt;&lt;div&gt;&lt;br&gt;&lt;a href="https://github.com/karthink/gptel"&gt;gptel&lt;/a&gt; is another generic interface to LLM's, but with a very different interaction style when compared with agent-shell. At its core, it's a huge library of functions and integrations for building LLM's into your Emacs workflow.&lt;br&gt;&lt;br&gt;While most other LLM integrations prescribe to a "chat style" user interface, gptel instead is designed to be as free form as possible, enabling querying a model using &lt;em&gt;any text within Emacs, &lt;/em&gt;and allowing responses to be redirected to whichever buffer you want. This enables a tight integration with Emacs.&lt;br&gt;&lt;br&gt;For my use cases, I typically utilize the built-in "M-x gptel" function, which I have hooked up to automatically pop open an &lt;a href="https://orgmode.org"&gt;org&lt;/a&gt; file with Gemini pre-configured. The whole buffer then becomes my chat interface. Here's what this looks like in practice:&lt;br&gt;&lt;br&gt;&lt;action-text-attachment sgid="eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3NreWVmcmVlbWFuLWNvbS9BY3RpdmVTdG9yYWdlOjpCbG9iLzc0P2V4cGlyZXNfaW4iLCJwdXIiOiJhdHRhY2hhYmxlIn19--3ba36d0f7d8a5cd8b4b0eee76492e417cd02bb1f" content-type="image/png" url="https://skyefreeman.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6NzQsInB1ciI6ImJsb2JfaWQifX0=--0f71c5fc4b9572b0cde4143c863fb5357099e6f9/CleanShot%202026-04-14%20at%2023.51.06%402x.png" filename="CleanShot 2026-04-14 at 23.51.06@2x.png" filesize="1034750" width="1832" height="2218" previewable="true" presentation="gallery" caption="Querying Gemini using gtpel"&gt;&lt;figure class="attachment attachment--preview attachment--png"&gt;
    &lt;img src="https://skyefreeman.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6NzQsInB1ciI6ImJsb2JfaWQifX0=--0f71c5fc4b9572b0cde4143c863fb5357099e6f9/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--749bbb034cf6ba3807e0b9cc4bc107c994a46375/CleanShot%202026-04-14%20at%2023.51.06@2x.png"&gt;

  &lt;figcaption class="attachment__caption"&gt;
      Querying Gemini using gtpel
  &lt;/figcaption&gt;
&lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;br&gt;&lt;br&gt;Sending text to a model can be invoked using the interactive function "M-x gptel-send" Which is bound to "C-c return", while gptel-mode is active.&lt;br&gt;&lt;br&gt;I usually use these sessions for quick look ups, documentation, or one off requests that don't require access to the filesystem or repo. It's fast, efficient, cheap, and enables quick iteration that can be easily saved or archived, given it's all just text within the confines of Emacs.&lt;br&gt;&lt;br&gt;Here's what a simple gptel configuration looks like, again with use-package:&amp;nbsp;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;pre&gt;(use-package gptel
  :ensure t
  :vc (:url "https://github.com/karthink/gptel" :rev :newest)
  :custom
  (gptel-api-key
   (string-trim
    (shell-command-to-string "$SHELL --login -c 'echo $OPENAI_API_KEY'")))
  :config
  
  (setq gptel-backend (gptel-make-gemini "Gemini"
                        :key (string-trim
                              (shell-command-to-string "$SHELL --login -c 'echo $GEMINI_API_KEY'"))
                        :stream t))
  (setq gptel-model 'gemini-2.5-flash))&lt;/pre&gt;&lt;div&gt;&lt;br&gt;Similar to agent-shell, I've bound the creation of new gptel buffers to a global hotkey. The only difference is that I prefer to have these be sub-windows that I call "drawers". These drawers can be popped open and closed quickly as needed with a single key stroke:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;pre&gt;(defun create-drawer-window (buffer-name &amp;amp;optional focus height mode)
  (split-window-vertically (if height height -10))
  (other-window 1)
  (let ((buf (switch-to-buffer buffer-name)))
    (if (not focus) (other-window -1))
    (with-current-buffer buf
      (if mode
          (funcall mode)))
    buf))

(defun skye/toggle-gptel-drawer ()
  (interactive)
  (let ((buffer (gptel "*gpt*")))
    (if (string-equal (buffer-name buffer) (buffer-name (current-buffer)))
	(delete-window)
      (create-drawer-window (buffer-name buffer) t -20))))

(global-set-key (kbd "&amp;lt;M-return&amp;gt;") 'skye/toggle-gptel-drawer)&lt;/pre&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h1&gt;Summary&lt;/h1&gt;&lt;div&gt;&lt;br&gt;I'm happy with this streamlined setup so far. It's changed &lt;em&gt;a lot &lt;/em&gt;over the past year, but the combination of agent-shell and gptel provides a level of customization that is absolutely required as an Emacs user.&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Journal Entry</title>
    <id>https://skyefreeman.com/blog/2026/04/14/journal-entry</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2026/04/14/journal-entry"/>
    <published>2026-04-14T17:38:48Z</published>
    <updated>2026-04-14T17:42:02Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;Sitting on the porch in the Berkshires, it's 1pm. Pluto is laying out on the coffee table, tired after two days of hiking. Ran 10 miles this morning, Up our driveway, along the main road, down to the farm and back. Stopped to say hello to the guard dog next to the chicken coop. He's all grown up now.&lt;br&gt;&lt;br&gt;Going to take my father out for lunch shortly, we'll probably find a place to get veggie burgers. Going to make a point to not drink anything (doing a full detox). Last day in the woods before I head back to the city.&lt;br&gt;&lt;br&gt;Trying to organize all of my thoughts. Yesterday, I added an "Ideas" database column and &lt;a href="https://skyefreeman.com/ideas"&gt;corresponding page&lt;/a&gt; on the website. My thinking is this: I have a &lt;em&gt;decade&lt;/em&gt; of random thoughts, ideas, and questions spread out amongst my computer, phone, and notebooks. Ideas for apps, businesses, software tools, automations, things to learn. Some of them I tackle eventually, but most I rarely revisit.&lt;br&gt;&lt;br&gt;What I want is to centralize all of these fragmented thoughts, categorize them, and figure out a systematic way to turn these thoughts into &lt;em&gt;action&lt;/em&gt;.&lt;br&gt;&lt;br&gt;For now, the &lt;a href="https://skyefreeman.com/ideas"&gt;ideas&lt;/a&gt; index is sparse. It will be free form, and might not always make sense to others. But I plan to add a tagging system to group ideas into clusters to find patterns on which ideas I consistently revisit. Then, I'll add a way to label whether an idea was "acted upon" (I.E, a URL to the output of that idea: a blog post, software package, or other).&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Journal Entry</title>
    <id>https://skyefreeman.com/blog/2026/04/14/journal-entry</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2026/04/14/journal-entry"/>
    <published>2026-04-14T04:11:54Z</published>
    <updated>2026-04-14T04:11:54Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;Sitting on the couch outside on the porch in the Berkshires. Nicer outside today, mid 60's, cloudy, a little windy. Looking out upon the meadow, birds chirping. It's 4pm.&lt;br&gt;&lt;br&gt;Just returned from a 45 minute hike with Pluto. He jumped in the stream, laid down in the mud, and chased sticks. It was peaceful.&lt;br&gt;&lt;br&gt;This morning I took my father to breakfast. French Toast with a side of Scrambled Eggs, and a Cappuccino. We chatted for an hour about his living situation, his health. It's nice to have some time with him, albeit brief.&lt;br&gt;&lt;br&gt;Watching a loved one age is both a privilege and a heart-wrenching ordeal. On the one hand, we're lucky to be alive, to have each other, to have made it this far. To have our limbs, minds, hearts and souls. But on the other, enough time has passed that the relationship has changed. The realities of deteriorating health and mental state are apparent in every interaction. What was once simple is now difficult, and the mind resists that some doors in life are now closed forever.&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Journal Entry</title>
    <id>https://skyefreeman.com/blog/2026/04/12/journal-entry</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2026/04/12/journal-entry"/>
    <published>2026-04-12T17:27:01Z</published>
    <updated>2026-04-12T17:27:01Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;Sitting in the living room in the Berkshires, in the chair by the fireplace. Ran 9 miles this morning after waking up at 7:30am,&amp;nbsp; groggy and tired. Trying to dial my circadian clock back to a normal cadence. My sleep schedule has gotten completely untethered from the norm. Re-inserting some level of discipline, isolating in the woods for a moment from social pressures and city life is helping so far.&lt;br&gt;&lt;br&gt;Went to the general store for brunch (breakfast burrito, lemon bundt cake, latte). Ate while reading &lt;a href="https://www.goodreads.com/en/book/show/222376492-this-is-for-everyone"&gt;This Is For Everyone&lt;/a&gt;, by &lt;a href="https://en.wikipedia.org/wiki/Tim_Berners-Lee"&gt;Tim Berners-Lee&lt;/a&gt;. It's fascinating to hear a blow-by-blow recount of the founding days of the World Wide Web. Currently at the part where Tim recalls the creation of the "Cookie" at Netscape, which originally solved the problem of individual web pages lacking a cohesive memory system (this of course, turned into a tool used by advertisers for tracking). Would recommend the book so far.&lt;br&gt;&lt;br&gt;Trying to enjoy my last week of funemployment before I start a new job (I'm very excited! But more on that later). I'm focusing on breathing, stretching, and practicing gratitude. My primary goal right is to spend as much time as possible outside, listening to the sounds of life without headphones on, reconnecting with my thoughts unencumbered by noise and outside influence.&lt;br&gt;&lt;br&gt;I'm going to be doing some thinking and writing today, hike in the afternoon with Pluto, then playing guitar in the evening. Maybe I'll learn to play a new song.&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Journal Entry</title>
    <id>https://skyefreeman.com/blog/2026/04/11/journal-entry</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2026/04/11/journal-entry"/>
    <published>2026-04-11T21:58:55Z</published>
    <updated>2026-04-12T17:27:19Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;Sitting in the kitchen in the Berkshires. Looking out upon the meadow. Coffee and granola, 11:30 am. It's cold and windy today, albeit sunny. Pluto is sitting by the front door eagerly awaiting Julia (she is not on the way). Listening to Rubber Soul. Even when it's pre-bloom in Spring, it's beautiful here. Tranquil, quiet. Room to think.&lt;br&gt;&lt;br&gt;Last night I downloaded &lt;a href="https://www.seventhstring.com/xscribe/overview.html"&gt;Transcribe!&lt;/a&gt;, a program for music listening and transcription that is widely recommended. Picked out the bass and melody to the song "Return to Hot Chicken", which seemed like a good place to start. The inspiration for this was &lt;a href="https://www.jakeworth.com/posts/how-to-get-better-at-guitar/"&gt;this post&lt;/a&gt; by &lt;a href="https://jakeworth.com/"&gt;Jake Worth&lt;/a&gt; last week. In summary:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Find a song you like (start out on the easy side). You'll need a downloaded file, no streaming.&lt;/li&gt;&lt;li&gt;Drag the song into Transcribe! which includes tools for slowing down and looping sections of the track. Use the built-in tone generator to help find the notes.&lt;/li&gt;&lt;li&gt;Work through each section of the song, listening closely and experimenting with your guitar to find each note on the fretboard. Figure out what the guitar player is doing, but also find the bass notes, the rhythm section, even the vocal melodies.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Write it all down in a tab, &lt;em&gt;by hand&lt;/em&gt;.&lt;/li&gt;&lt;li&gt;After you have enough of the sections of the song down, put the song into a playlist called "Guitar Practice". This is now part of your repertoire of songs to practice to!&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;What I love about this practice methodology is that it's &lt;em&gt;practical&lt;/em&gt;. The barrier to entry is this: &lt;em&gt;Find the first note of the song.&lt;/em&gt; Then the next, then the next. Continue until you have the whole piece accounted for. This trains your ear, your knowledge of the fretboard, and most importantly: &lt;em&gt;it teaches you how to use the guitar to play music.&lt;br&gt;&lt;/em&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>FlyerFalcon: next steps.</title>
    <id>https://skyefreeman.com/blog/2023/11/10/when-in-doubt-just-do-marketing</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/11/10/when-in-doubt-just-do-marketing"/>
    <published>2023-11-10T00:00:00Z</published>
    <updated>2026-03-30T04:49:57Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;Searching for the largest bang for my buck of what to spend time on next for &lt;a href="https://flyerfalcon.com"&gt;FlyerFalcon&lt;/a&gt;. I’m at a fork in the road, where I &lt;em&gt;could&lt;/em&gt; do more product work, or I &lt;em&gt;could&lt;/em&gt; create web pages to get more traffic.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;My plan was to work through a “features” page (&lt;a href="https://skyefreeman.com/blog/2023/11/09/feature-images-and-phoenix-is-dope"&gt;which I finished yesterday&lt;/a&gt;), write snippets about everything the product offers, then create subpages that go into more depth about each topic. All in the name of keyword ranking, of course.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;On the other hand I could do some product work, which is infinitely more fun, and is sorely needed. While the flyer builder works well enough, it’s got some rough edges. Plus, it desperately needs more flyer template options. The existing options (built for the MVP) are plain white, text only, with tabs + QR Codes.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The typography and layout from these templates are a step up from &lt;em&gt;opening up a word doc&lt;/em&gt; and just throwing something together to hang around your neighborhood. Nothing wrong with this approach of course – heck, tons of folks seem to be doing just that to advertise their HandyMan or Moving services in lower Manhattan. It works for the right folks.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;This is the exact usecase for FlyerFalcon. Aim to make it as easy to create flyers as writing a Google doc, combined with eye-catching and attractive premade templates for folks with zero interest in designing themselves. For a hyper-focused niche – like paper flyer creation for dog walking service businesses.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Bleh, it’s like I’m talking myself into doing product work. But I’m taking this as a sign that I should be marketing instead, since my engineering brain will always choose “build moar stuf”, over “find customers”, any day of the week. New mantra: When in doubt, just do marketing.&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>My experience so far with the Phoenix web framework</title>
    <id>https://skyefreeman.com/blog/2023/11/09/feature-images-and-phoenix-is-dope</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/11/09/feature-images-and-phoenix-is-dope"/>
    <published>2023-11-09T00:00:00Z</published>
    <updated>2026-04-18T21:21:29Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;Yesterday &lt;a href="/blog/love-hate-relationship-with-modern-computing"&gt;I briefly mention&lt;/a&gt; that the first draft of &lt;a href="https://flyerfalcon.com/features"&gt;FlyerFalcon’s feature page&lt;/a&gt; was done.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Created Image Assets&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Picking up from there. Today, I spent several hours with my design cap on creating image assets to place alongside feature containers. They turned out better than I thought they would. Here’s the final product:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;action-text-attachment content-type="image" url="/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6NTgsInB1ciI6ImJsb2JfaWQifX0=--cc0f5e904afe8115a49a229bf966ed58722d575d/flyer-falcon-feature-screengrab.jpeg" width="945" height="3062"&gt;&lt;figure class="attachment attachment--preview"&gt;
  &lt;img width="945" height="3062" src="/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6NTgsInB1ciI6ImJsb2JfaWQifX0=--cc0f5e904afe8115a49a229bf966ed58722d575d/flyer-falcon-feature-screengrab.jpeg"&gt;
&lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;br&gt; FlyerFalcon’s feature page, in all of it’s glory.&amp;nbsp;&lt;/div&gt;&lt;div&gt;To be honest, the first section (flyer templates) stands out like a sore thumb. At some point I’ll swap it out for something better, but I’ll hold off until I have some better looking templates, as “premade flyer templates” are FlyerFalcon’s biggest selling point. I’d like to do it justice.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Fixed Meta Titles&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Additionally, I noticed that FlyerFalcon currenly has 300+ duplicate title meta tags, most of which are programmatic SEO pages, but a few were top level pages that are essential for keyword ranking. I spent some extra time making these easier to manage with my HTML templating engine: &lt;a href="https://hexdocs.pm/phoenix_live_view/assigns-eex.html"&gt;HEEx: HTML Embedded Elixir&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;There was a tiny bit of complexity, given some pages render via HTTP, and others render through a Phoenix LiveView websocket. But generally it was a simple update, ensuring that a :page title variable was set before render. HEEx makes this very straightforward, and relatively seamless accross both HTTP and a LiveView websocket.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Phoenix is all it’s cracked up to be&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;I’ve generally avoided talking about &lt;a href="https://www.phoenixframework.org"&gt;Phoenix&lt;/a&gt; (the Elixir web framework) since I started using it 6 months ago. Partly because I wanted time to explore it and see how it feels building a real world project. In short, it’s pragmatic, productive, and &lt;em&gt;powerful&lt;/em&gt;.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I’ve had several starts and stops with various web frameworks over the years. Having spent a little bit of time with Rails, Django and Caveman2 (via the Common Lisp ecosystem), Phoenix is my favorite by far.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;It toes that fragile line between “too much magic” and “too barebones”. It gets you started quickly with a fully fledged generator system (I actually wish there were more granular generator options, the existing ones generate &lt;em&gt;a lot of boilerplate&lt;/em&gt;), then provides all the bells and whistles for deployment, authentication, routing, dynamic HTML rendering, static asset bundling, out of the box.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;But I haven’t mentioned the best part: It’s fully loaded for _real time__ applications, and makes it laughably easy to build web apps with real-time features.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Jumping between serving a web page built with Phoenix LiveView and a traditional HTTP request is inconsequential, and the developer ergonomics of the framework are thoroughly designed to keep your &lt;em&gt;mind on the server&lt;/em&gt;.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The ramifications of this I’m still coming to terms with, and can resoundingly say that it makes me far more productive. Heck, I haven’t even discussed how nice of a language Elixir is yet, and the lengths it goes to make parallel computing simple. But that’s for another day.&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Frustrations with Modern Computing</title>
    <id>https://skyefreeman.com/blog/2023/11/08/love-hate-relationship-with-modern-computing</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/11/08/love-hate-relationship-with-modern-computing"/>
    <published>2023-11-08T00:00:00Z</published>
    <updated>2026-04-18T21:22:23Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;The first draft of &lt;a href="https://flyerfalcon.com/features"&gt;flyerfalcon.com/features&lt;/a&gt; is done. Copy is fine, will probably tinker with it more in the future, but trying not to spin my wheels too much.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Tomorrow I’ll be creating some images to place above feature paragraphs. The existing sections feel bland, and definitely need visuals to help grab attention.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;In terms of moral, felt very unproductive today. I’ve noticed steep drops in energy after two intense work days. Wondering whether I need to cut myself off at a certain point on productive days, or if I need to bake in more dedicated rest between long sessions.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Third option, reduce distractions while working. At least 30% of my time while I’m coding or writing is spent procrastinating, usually reading &lt;a href="https://news.ycombinator.com"&gt;Hacker News&lt;/a&gt; or &lt;a href="https://nytimes.com"&gt;The Times&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Sometimes it sucks that the same device needed to create, is also the most powerful distraction machine that has ever been devised in the known universe. I guess this sums up my love hate relationship with modern computing.&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>FlyerFalcon: Building feature pages</title>
    <id>https://skyefreeman.com/blog/2023/11/08/seo-as-i-understand-it</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/11/08/seo-as-i-understand-it"/>
    <published>2023-11-08T00:00:00Z</published>
    <updated>2026-04-18T21:23:37Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;&lt;a href="/blog/short-term-marketing-checklist"&gt;Earlier today&lt;/a&gt; I discussed the short-term content creation plan that I have for &lt;a href="https://flyerfalcon.com"&gt;FlyerFalcon&lt;/a&gt;. My goal is to provide a foundational set of webpages that thoroughly signal what problems are solved and the value of what’s being provided – for both potential customers &lt;em&gt;and&lt;/em&gt; search engines.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;You see, this is my first foray into search engine optimization and trying to capture known web traffic with a solution to a problem that I &lt;em&gt;hope&lt;/em&gt; people will pay for. I’ve found the fish, I just need to build the net.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Today, I got an in-progress aggregate &lt;a href="https://flyerfalcon.com/features"&gt;feature&lt;/a&gt; page in place, which lists everything that FlyerFalcon does, and for each feature, links to a dedicated page that goes discusses it in depth. This gives me much more real-estate to build more organic keywords, increasing the surface area of terms that I could rank for in search engines.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;When hyper-specific search queries like “paper flyer maker with qr codes” show up, I’ll be there, ready and waiting with a page dedicated completely to how FlyerFalcon includes a QR generator as part of the flyer creation process.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Or the phrase “tear off tabs paper flyer”, oh yeah, we got flyer templates for that too, it’ll take 5 seconds to make one.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I’ll finish up that &lt;a href="https://flyerfalcon.com/features"&gt;/features&lt;/a&gt; page tomorrow, then get started on the /features/* subpages.&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>FlyerFalcon: A  Marketing Plan</title>
    <id>https://skyefreeman.com/blog/2023/11/07/short-term-marketing-checklist</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/11/07/short-term-marketing-checklist"/>
    <published>2023-11-07T00:00:00Z</published>
    <updated>2026-04-18T21:43:05Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;A few weeks back, I spoke about a new project that I’ve been working on called &lt;a href="https://flyerfalcon.com"&gt;FlyerFalcon&lt;/a&gt;. I’d like to discuss how I’m thinking about product development these days, and how this new project fits into my overall business architecture.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Why I’m working on FlyerFalcon&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;So, FlyerFalcon is the first serious “web app” that I’ve built, rather beyond a traditional website. Part of the allure of this project is to learn some new tech (Elixir + Phoenix + LiveView is just so dang cool), and experiment with some things I’ve learned around SEO and capturing web traffic. It’s every bit a bootcamp in marketing as it is for learning &lt;a href="https://phoenixframework.com"&gt;Phoenix&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The other part of this project is that it’s &lt;em&gt;not iOS&lt;/em&gt;. I’ve built and maintained so many iOS apps over the past 11 years that I just needed a break. I’m not leaving forever, on the contrary &lt;a href="https://swiftstarterkits.com"&gt;Swift Starter Kits&lt;/a&gt; just had its best month on record having finally ranked first on Google for the keyword “SwiftUI Starter Kit”. Taking a break from the project has been good I think. Around June of this year I just felt as if I was spinning my wheels on it, having built and rebuilt the kit into a totally different thing 3 times once I had user feedback.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I made a lot of mistakes working on Swift Starter Kits: building a product before validating the idea, thinking about marketing &lt;em&gt;after&lt;/em&gt; building a product, etc. Once I started to think about how to actually market it (hot take: “building in public” isn’t an actual marketing strategy), I realized I built a thing that people weren’t really looking for. At least not in the volumes that are needed to be self-sustaining.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Swift Starter Kits Marketing Improvements&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;To reiterate, I’m &lt;em&gt;not&lt;/em&gt; giving up on Swift Starter Kits, it has better sales now than it did 6 months ago, and I’ve learned a ton about marketing in the interim that I’d like to incorporate back into the existing marketing site. Things like:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Slightly rework the landing page copy to tell a better story, and talk to the &lt;em&gt;pain points it solves&lt;/em&gt;, rather than the unordered grab bag of features it currently upsells.&lt;/li&gt;&lt;li&gt;Use the positive user feedback as testimonials.&lt;/li&gt;&lt;li&gt;Adding a web page for every feature included with the kit to rank for new SEO terms.&lt;/li&gt;&lt;li&gt;Bring back the Firebase authentication kit that was effectively version 0 and gave away for free (which I subsequently removed in a full pivot to SwiftUI). In hindsite, this kit was a terrific lead generator, and gained more emails in 1 month than I’ve gotten in the 8 months since removing it.&lt;/li&gt;&lt;li&gt;Write an automated email nurturing and sales campaign, targetting users who downloaded the free kit, but haven’t upgraded to the licensed version.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;A good week of work on it will pay dividends, I think.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;FlyerFalcon’s Short term goals&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;But, in the meantime I’m not quite ready to shift gears away from FlyerFalcon. It’s up, it’s working, and I’ve spent the last few weeks chipping away at writing pages dedicated to marketing the product. To date, I’ve generated programmatic versions of landing pages for roughly 200 search terms, variants of the default landing page, but tailored to a specific &lt;a href="https://www.kalzumeus.com/2010/01/24/startup-seo/"&gt;long tail&lt;/a&gt; of keywords that show niche buying intent. Additionally, I published ~20 &lt;a href="https://flyerfalcon.com/blog"&gt;blog posts&lt;/a&gt; about “how to create a flyer”, specific to several industry verticals. These are a little “click-baity”, but I’m interested to see whether they result in traffic.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;In a similar fashion, I have a pretty long list of articles to get through on my intended site map. These are my immediate focus:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;/features/* pages, detailing every individual thing that FlyerFalcon does that provides value.&lt;/li&gt;&lt;li&gt;/alternative-to/* pages, detailing how FlyerFalcon is different than key competitors, and specializes in solving the single problem of “local advertisement using paper flyers”.&lt;/li&gt;&lt;li&gt;/templates/* pages, which will have a dedicated page with images and descriptions for every template FlyerFalcon offers.&lt;/li&gt;&lt;li&gt;/examples/* pages, which will aggregate example output of all generated templates, but for specific use cases.&lt;/li&gt;&lt;li&gt;/how-it-works page, which will give a detailed walk through of how the product functions. Content from this page I’ll reuse on the main landing page.&lt;/li&gt;&lt;li&gt;/flyer-marketing, will be a complete guide on how to effectively market with paper flyers, where to put them, what to avoid, etc.&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Perfectionism is a Bootstrapper's Worst Nightmare</title>
    <id>https://skyefreeman.com/blog/2023/11/06/perfectionism-is-a-bootstrappers-worst-nightmare</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/11/06/perfectionism-is-a-bootstrappers-worst-nightmare"/>
    <published>2023-11-06T00:00:00Z</published>
    <updated>2026-04-18T21:23:24Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;I took most of last week off, which was much needed to clear my head. My wife and I walked on a beach, ran our dog around, and dreamed about our future. I always underestimate how useful taking a couple of days off is, to recalibrate and plot a new course of action.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I’ve been feeling pretty burnt out. Not because I don’t love what I do, but because I just care so darn much. In the transition from a “programmer” to a “founder” (both labels that I don’t really think capture what it is that I do) I’ve noticed this specific personality trait the hardest to overcome. Put bluntly, this is &lt;em&gt;perfectionism&lt;/em&gt;.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;As an employed software developer, stressing those tiny details is generally a good thing. Those nuanced decisions that we make during the construction of software are occasionally the difference between shipping on time, and woefully late.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;But, as a bootstrapped founder there are just too many things to do. If we try and do everything perfectly, we’re going to be in for a bad time. If you’re wearing &lt;em&gt;all&lt;/em&gt; the hats, and you probably are only truly qualified to wear one, two at the most, then you just need to &lt;strong&gt;keep moving&lt;/strong&gt;. All those details don’t really matter &lt;em&gt;that&lt;/em&gt; much.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The reality is that there are several forks in the road at any time, for any decision a bootstrapper must make. Mapping out a marketing strategy, developing a product plan, designing, engineering, measuring.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The grind of planning, building, and most importantly, trying and failing to &lt;strong&gt;stay positive&lt;/strong&gt;, wears on you. The “staying positive” part is key, because let me tell you, there are times that suck, and it’s pretty easy to look over the hedge and see your old colleagues still making a fortune at your previous employer, and thinking to yourself: “why am I doing this again?”.&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>FlyerFalcon: I started building something new</title>
    <id>https://skyefreeman.com/blog/2023/10/27/started-building-something-new</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/10/27/started-building-something-new"/>
    <published>2023-10-27T00:00:00Z</published>
    <updated>2026-04-18T22:10:11Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;In August I started building something new. It started as a small side project while learning a new stack (Elixir + Phoenix, more about this another time), but has turned into much more. It’s called &lt;a href="https://flyerfalcon.com"&gt;FlyerFalcon&lt;/a&gt;, and aims to be the easiest way to generate paper business flyers for promoting businesses, services or events – locally.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I haven’t spoken about FlyerFalcon at all so far, mainly because it’s so out of left field for me. Using a new stack, in a field that I have no experience in (local advertising), for customers that I haven’t served before (small businesses). This is why I’m so excited about it – it’s a totally fresh start.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I’ve approached development of this product totally different than past projects. Previously, I let my programmer brain dominate all sources of rhyme or reason when building products. Where possible, following the fun and interesting, and ignoring the boring and mundane. Turns out that the boring and mundane (at least for me) are actually the most essential parts of building a software business.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;For FlyerFalcon, the idea came from keyword research. I wanted to formulate a solution to a problem that I had concrete proof that people were searching for. That showed evidence of a &lt;em&gt;long tail&lt;/em&gt; of keyword variants that prove niche buying intent, and would provide a consistent avenue of traffic if captured.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Put another way, I’m building FlyerFalcon around a pre-formulated marketing strategy, and testing out data driven approaches to capturing that traffic and converting it into customers.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Wild idea, I know. 12 years in the software industry and I’m just learning about all of this.&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Things you shouldn't do when building a startup</title>
    <id>https://skyefreeman.com/blog/2023/07/27/things-you-shouldnt-do-building-a-startup</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/07/27/things-you-shouldnt-do-building-a-startup"/>
    <published>2023-07-27T00:00:00Z</published>
    <updated>2026-04-18T22:14:02Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;Here are some things that you shouldn’t do when building an internet startup:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Completely rebuild your marketing page when you have meaningful web traffic&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;So yeah, this one is self explanatory. &lt;a href="https://swiftstarterkits.com"&gt;Swift Starter Kits&lt;/a&gt; went through several product phases, each time pivoting the product and its messaging to reduce scope and increase focus. The biggest marketing page rework was in March, when search traffic had surpassed thousands of visits per month (small, but a meaningful uptick). This was when I removed Firebase as a dependency and stopped marketing the kit as being a “Firebase enabled iOS starter kit”, instead focusing on subscription revenue tooling and a faster out of the box experience.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Turns out most of the &lt;a href="https://swiftstarterkits.com"&gt;Swift Starter Kits&lt;/a&gt; site traffic was looking for a Firebase enabled starter kit, traffic has gone down to the lower hundreds /month as of July.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Change the product’s name&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;This change was subtle, but around April I went through all of the &lt;a href="https://swiftstarterkits.com"&gt;Swift Starter Kits&lt;/a&gt; web pages, and changed every reference of “SwiftStarterKits” to “Swift Starter Kits”. This actually may have been a good move, but time will tell.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;My thinking was this: If somebody is searching for the term “SwiftStarterKits” (one word, no spaces), they already know what they are looking for and the domain will rank for this automatically. But changing all URL references over to “Swift Starter Kits” (3 words, with spaces) makes clear the intent that this is an actual query that I’d like to rank for. I want the site to broadcast “hey, if you’re looking for a starter kit for Swift and SwiftUI, you may want what I built”. This was the entire idea around the domain name &lt;a href="https://swiftstarterkits.com"&gt;Swift Starter Kits&lt;/a&gt; in the first place.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;What’s interesting though, is that while traffic has decreased overall, &lt;a href="https://swiftstarterkits.com"&gt;Swift Starter Kits&lt;/a&gt; now ranks in the top three for “Swift Starter Kit” and “Swift Starter Kits”, which it wasn’t before.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Learn about The Long Tail after building a product&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Tongue in cheek aside. I read &lt;a href="https://www.goodreads.com/book/show/2574"&gt;The Long Tail&lt;/a&gt; in April, after reading about its insights from &lt;a href="https://kalzumeus.com"&gt;patio11’s treasure trove of startup essay’s&lt;/a&gt; (seriously, if you’re serious about building internet startups and want to learn about internet marketing, you should start at the beginning of his journey in the early 2010’s and print every blog post onto physical paper, and read until you’re done).&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The gist is that I learned about all the things I did wrong in ideating and building the Swift Starter Kits product. I built a product that I assumed somebody out there needed, but had no data to back this up. Then I learned about search keywords, SEO, and finding “Long Tail” keywords to enable focus on niche traffic. Once learning about all of this, I took a step back and thought “shoot, I have a product that doesn’t allow me to generate content for any of these queries”.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Looking around at keywords that are super close to what I had been ranking for, there were much better choices that get a lot more traffic – but would require a slight product rework to ensure I wasn’t lying about what Swift Starter Kits does.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;So, the lesson is this: Have a general idea for how a product will fit into search engine queries before hand. Search engine traffic takes months to materialize and underutilizing 100 hours of product work sucks.&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Improving my sales funnel with product usage videos</title>
    <id>https://skyefreeman.com/blog/2023/06/07/devlog-06-07-2023</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/06/07/devlog-06-07-2023"/>
    <published>2023-06-07T00:00:00Z</published>
    <updated>2026-04-18T22:28:17Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;Today I splurged and bought a license for a video recording/editing tool called &lt;a href="https://www.screen.studio"&gt;Screen Studio&lt;/a&gt;. It aims to make video creation from content recorded from the desktop, easier. So far, I haven’t been disappointed!&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The learning curve was minimal, and after a few attempts at recording a screengrab with properly timed cursor gestures I was able to make something that looked passable.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Why did I spend $89 bucks of my startup money on screen recording software? Because I’ve come to the conclusion that &lt;a href="https://swiftstarterkits.com"&gt;Swift Starter Kits&lt;/a&gt; needs proper product usage videos to improve the sales funnel.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Default screen recordings look boring, and I don’t have much video editing experience to make it look tight on a time budget. I see an $89 spend on video recording tools being a good investment, both for time and for increasing the quality of my sales pitch.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;After all, why would you part with your hard earned cash without seeing exactly the software you’re buying in action?&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Minimizing product scope, focusing on product improvement</title>
    <id>https://skyefreeman.com/blog/2023/06/06/devlog-06-06-2023</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/06/06/devlog-06-06-2023"/>
    <published>2023-06-06T00:00:00Z</published>
    <updated>2026-04-18T22:28:43Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;It’s been a couple of week since my last update. I’ve had my head down working through an extensive ideation phase for the next &lt;a href="https://swiftstarterkits.com"&gt;Swift Starter Kits&lt;/a&gt; release, implementing a far more focused and featured foundation for new apps.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Throughout the process, my thinking has changed about what this project needs to be. The &lt;a href="https://swiftstarterkits.com/changelog"&gt;previous two releases&lt;/a&gt; each had a different focus, starting with an authentication revamp of the kit using Firebase, to a fully modularized component kit acting as a TestFlight demo and UI test bed.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I’ve since done an about face, ripping out all dependencies and rethinking my strategy.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The first time customer experience of Swift Starter Kits is slow and cumbersome, requiring two large external SDK integrations. Once those are set up, you’ll be dealing with Firebase bloat…forever.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I was sick of it. I want something minimal, without throwing away all the work I’ve done until now.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;A few weeks later, the experience is head and shoulders better than it used to be. The kit is now offline first, modular, and focused on native utility experiences. All the authentication, login, signup screens still exist, but users can pull them in as needed when the usecase is right.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The largest conceptual difference to this kit iteration is focus on being “offline first”. I aim to provide a feature complete toolkit that stores data locally, that can be wrapped with API calls as needed. Things are simpler, and focused on integrating individual SwiftUI screens in a cohesive architecture.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Here’s what’s left for this upcoming release:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Updating marketing page copy to reflect the new experience.&lt;/li&gt;&lt;li&gt;Recording product videos (This was long overdue).&lt;/li&gt;&lt;li&gt;Update S3 package download link.&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Fixing LCP and reducing vendor dependencies</title>
    <id>https://skyefreeman.com/blog/2023/05/15/fixing-lcp-and-reducing-library-dependencies</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/05/15/fixing-lcp-and-reducing-library-dependencies"/>
    <published>2023-05-15T00:00:00Z</published>
    <updated>2026-04-18T22:40:40Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;Between Tears of the Kingdom sessions (which is flippin’ amazing), I managed to get some work done on the &lt;a href="https://swiftstarterkits.com"&gt;Swift Starter Kits&lt;/a&gt; landing page.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;First, I updated the pricing section layout and colors, making styling a bit more uniform. Raised the price of the Team license, and added a higher tier with paid support + training.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Separately, I learned that my LCP (&lt;a href="https://developer.chrome.com/en/docs/lighthouse/performance/lighthouse-largest-contentful-paint/"&gt;Largest Contentful Paint&lt;/a&gt;) was really really bad on mobile devices. I didn’t know this was a thing, and was potentially hurting search rankings.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Turns out my LCP was slow for two reasons:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;A 3rd party JS library was blocking the main thread for ~2 seconds at initial load. I removed this for now (unfortunately, this tool was for support chat, I’ll need to find another provider).&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;The custom font download from the CDN was blocking initial render. I fixed this by ensuring a default font shows initially, then updates to the main font once it downloads asynchronously. I thought it was doing that already, but oh well.&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Back to 100% search indexing health (supposedly), curious how long it will take to increase traffic numbers.&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Subscription Starter Kit: Initial App Layout and SwiftUI Navigation</title>
    <id>https://skyefreeman.com/blog/2023/05/09/subscription-starter-kit-created-initial-flow</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/05/09/subscription-starter-kit-created-initial-flow"/>
    <published>2023-05-09T00:00:00Z</published>
    <updated>2026-04-19T15:42:51Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;With the &lt;a href="/blog/subscription-starter-kit-swiftui-boilerplate"&gt;planning and ideation done&lt;/a&gt;, I’ve set to work on an iOS starter kit that will provide all of the infrastructure needed for a cloud enabled, subscription ready native app with reusable foundational features.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;To have a concrete usecase in mind while building this generalized kit, I’ve decided to build a cloud enabled todo list app. Afterwards I’ll work backwards and remove app specific logic and UI, getting the kit ready for &lt;em&gt;your&lt;/em&gt; projects.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Starting with building the basic screen structure and navigation controls, this app will have two primary flows, “home” and “settings”. Settings is modally presented via the &lt;a href="https://developer.apple.com/sf-symbols/"&gt;SFSymbols&lt;/a&gt; “gear” icon:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Your browser does not support video playback.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Simple enough.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Next, I threw together some generalized SwiftUI components to mimic the layout of a &lt;a href="https://developer.apple.com/documentation/swiftui/navigationlink"&gt;NavigationLink&lt;/a&gt;, ensuring selection logic is untethered to a navigation stack. Here I’ve stubbed out these initial section row inside a &lt;a href="https://developer.apple.com/documentation/swiftui/list"&gt;SwiftUI List&lt;/a&gt;:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;action-text-attachment content-type="image" url="/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6NjksInB1ciI6ImJsb2JfaWQifX0=--77c4c0b7f96450a6a521dcb5f95900c317d876b7/subscription-initial-settings-layout.jpg" width="1700" height="1700"&gt;&lt;figure class="attachment attachment--preview"&gt;
  &lt;img width="1700" height="1700" src="/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6NjksInB1ciI6ImJsb2JfaWQifX0=--77c4c0b7f96450a6a521dcb5f95900c317d876b7/subscription-initial-settings-layout.jpg"&gt;
&lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;br&gt; Settings list controls for company info and support url’s.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Extending some interactivity to the Settings page, all of the existing cells either trigger a modally presented view, or push a view onto the navigation stack:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Your browser does not support video playback.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Great, first steps out of the way.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Next Steps&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Each iteration of &lt;a href="https://swiftstarterkits.com"&gt;Swift Starter Kits&lt;/a&gt; has brought focus to the toolkit. Starting with the authentication and Firebase integration last year, I’ve slowly improved and expanded the foundation, making it more robust and generalized. The negative side-effect of this approach was lack of focus, but this product release is going to address this exact problem.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I’ll be focusing next on getting app functionality in place, followed by a bunch more settings, debug, and infrastructure additions.&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Subscription Starter Kit: A minimal SwiftUI boilerplate with in-app subscription capabilities</title>
    <id>https://skyefreeman.com/blog/2023/05/05/subscription-starter-kit-swiftui-boilerplate</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/05/05/subscription-starter-kit-swiftui-boilerplate"/>
    <published>2023-05-05T00:00:00Z</published>
    <updated>2026-04-19T15:43:24Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;I’ve been thinking a lot about the next step to take for SwiftStarterKits product work. Tons of ideas, but limited time for execution. I want to make sure continuous investment in the product line is time well spent.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Up until now, I’ve written a fair amount of general purpose interface and infrastructure code, but nothing hyper focused on a specific type of app or problem set. In thinking about this more, I’ve slowly pivoted to focusing on building “native app infrastructure for subscription business models”, which is a concrete solution to a concrete problem, although it’s still a “meta” app idea (selling software to help write a specific type of software faster).&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Looking around at the mobile app landscape, there’s a massive ecosystem of applications that are focused on solving a single problem extremely well. These apps take heavy inspiration from Apple’s design guidelines (for good reason), and provide their promised value in exchange for an affordable monthly/yearly/lifetime fee. For an indie, this simplified view of consumer facing software is a great place to start carving out your niche.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;If I were to build a set of tools for starting an indie app shop, I would need to provide solutions to several problems:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Create a default experience that fully embraces the platform. It makes no sense to build natively unless you strive to provide a great platform native experience.&lt;/li&gt;&lt;li&gt;Reduce time to market of new native app ideas. Building natively for macOS and iOS is a niche skillset that is expensive to hire for, and time consuming to build for.&lt;/li&gt;&lt;li&gt;Provide implementations for essential components. Most infrastructure is redundant between apps.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Maybe you can see where I’m headed with this.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Building a toolchain for problem focused iOS subscription apps&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;In &lt;a href="/blog/initial-swiftstarterkits-revenuecat-integration"&gt;my last post&lt;/a&gt;, I threw together a proof of concept in-app purchase subscription flow using some existing SwiftStarterKits UI and RevenueCat.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Simple enough, but that’s just part one. Expanding from this new point of view, I’m going to be building out a minimal albeit practical foundation for quickly going from “idea to shipped”. Complete with subscription revenue capabilities, analytics, cloud storage, push notifications, onboarding, changelog, localization, accessibility.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Rather then shipping an MVP and working backwards to integrate with the platform, I want to flip it around and provide a deep OS integration from the start. Plus some bells and whistles for building a revenue generating software asset.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Faster project creation with code generation&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Also, code generation!&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I have several code generation tools that I’ve utilized in the past for personal and professional use. I’ve meant to integrate them into SwiftStarterKits, but I needed the proper selling point to really accentuate it’s value.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;When I refer to code generation here, I don’t mean macros or compile time meta programming facilities (at least for now). Instead, I want to make generating a fresh project part of the SwiftStarterKits onboarding experience.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;A messy problem right now is that I’m selling just a single giant codebase. There are several starting points, and even a demo integration of all the screens and flows. But the initial experience as a customer is to dig around, get it running, play with it, then decide what to throw away or change.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;For most new apps, you’ll probably spend a lot of time deleting or changing the core navigation to ignore certain flows, or turn off compilation for things you don’t need. This experience kind of sucks, and I want to improve it. Provide a massive library of UI’s, components, and data controllers, but default to a minimal starting point. Then pick and choose what you need with help from our docs.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Next Steps&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;From the view point of “building focused utility apps with a subscription business model”, I can take everything that has been built for SwiftStarterKits up until now, and:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Provide a minimal + practical app foundation with in-app purchase support + all the redundant essentials.&lt;/li&gt;&lt;li&gt;Ship a command line tool with the repo for generating new projects.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;This “new project” generation script could take a custom app name or the app type (in this case “SubscriptionKit”), then scaffold a new project without any of the fluff of the existing SwiftStarterKits repo. Customers will still have the full monorepo of SwiftStarterKits code, but it can simultaneously be used as a reference and the basis for this code generation tool.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I’m super excited about this, and can’t wait to use it for my own apps.&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>SwiftStarterKits' RevenueCat Integration: The Story So Far.</title>
    <id>https://skyefreeman.com/blog/2023/05/03/initial-swiftstarterkits-revenuecat-integration</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/05/03/initial-swiftstarterkits-revenuecat-integration"/>
    <published>2023-05-03T00:00:00Z</published>
    <updated>2026-04-19T15:45:28Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;With the first version of the &lt;a href="/blog/shipped-swiftstarterkits-documentation-v1"&gt;SwiftStarterKits documentation&lt;/a&gt; published, I’d like to shift gears to improving the SwiftStarterKits core product. While the existing documentation needs more investment, I simultaneously started marketing product features that &lt;em&gt;don’t currently exist&lt;/em&gt;.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Thankfully (?), I haven’t made any new sales since publishing some new marketing copy alongside the &lt;a href="https://swiftstarterkits.com/documentation/introduction"&gt;documentation&lt;/a&gt;, but I do feel a little iffy about making promises that I haven’t delivered on quite yet.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Medium Term Product Goals&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;I’ve slowly consolidated the original vision for SwiftStarterKits from “starter kits for many types of iOS apps”, to “starter kit for subscription iOS apps”. It’s been a necessary transition for focusing the marketing and product strategy. At the start, it felt that I was trying to build a product for too many people, but in reality wasn’t solving a problem for anybody.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Smaller scope, focused messaging. After a few more product releases I’m itching to build some apps, dog-fooding the SwiftStarterKits toolchain internally.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The medium term plan:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Provide a starting point for in-app subscriptions.&lt;/li&gt;&lt;li&gt;Provide scripted tooling for generating new projects quickly. Currently, creating a new project with SwiftStarterKits and customizing it is cumbersome.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;With both of these problems solved, the marketing copy and product will once again be in sync.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Enter, RevenueCat&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;With just a couple hours of work, I have a generic implementation of RevenueCat integrated, with all the bells and whistles for offline mock transaction testing.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;action-text-attachment content-type="image" url="/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6NjAsInB1ciI6ImJsb2JfaWQifX0=--19841a4cd468638f41e647700700343fbda6e938/revenue-cat-mock-transaction.jpg" width="5544" height="5542"&gt;&lt;figure class="attachment attachment--preview"&gt;
  &lt;img width="5544" height="5542" src="/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6NjAsInB1ciI6ImJsb2JfaWQifX0=--19841a4cd468638f41e647700700343fbda6e938/revenue-cat-mock-transaction.jpg"&gt;
&lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;br&gt; SwiftStarterKits has a working RevenueCat integration!&amp;nbsp;&lt;/div&gt;&lt;div&gt;Why use RevenueCat rather than the native StoreKit? Ease of implementation, cross-platform purchase support, amazing docs, no data lock-in. The common theme for SwiftStarterKits so far has been to fully embrace the native iOS platform, while ensuring that business data is portable. The same goes for using Firebase over CloudKit. If developers are going to build a business on top of SwiftStarterKits, I’d like to leave the option to integrate Web and Android platforms down the road.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Again, I’m bullish on native software experiences as a whole, they simply can’t be matched by cross-platform tech. If you want an incredible experience, you can do no wrong staying as close to the platform as possible. But for solutions to data storage, analytics, authentication, payments, you may as well leave the option to grow alongside your business.&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Shipped SwiftStarterKits Documentation</title>
    <id>https://skyefreeman.com/blog/2023/05/01/shipped-swiftstarterkits-documentation-v1</id>
    <link rel="alternate" type="text/html" href="https://skyefreeman.com/blog/2023/05/01/shipped-swiftstarterkits-documentation-v1"/>
    <published>2023-05-01T00:00:00Z</published>
    <updated>2026-04-19T15:45:57Z</updated>
    <content type="html">&lt;div class="trix-content"&gt;
  &lt;div&gt;I’ve recently been working on building out a documentation system for SwiftStarterKits, which I write about in detail &lt;a href="/blog/writing-a-documentation-system"&gt;here&lt;/a&gt; and &lt;a href="/blog/building-a-documentation-system-with-common-lisp-and-pandoc"&gt;here&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Flash forward a week and the first version of this is shipped! It’s minimal and straight to the point, rendered fully on the server.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;action-text-attachment content-type="image" url="/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6NjcsInB1ciI6ImJsb2JfaWQifX0=--91d313cfee1aac7ed3a031c3dcb7c5fa9574e931/swiftstarterkits-documentation-v1.jpg" width="2188" height="1874"&gt;&lt;figure class="attachment attachment--preview"&gt;
  &lt;img width="2188" height="1874" src="/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6NjcsInB1ciI6ImJsb2JfaWQifX0=--91d313cfee1aac7ed3a031c3dcb7c5fa9574e931/swiftstarterkits-documentation-v1.jpg"&gt;
&lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;br&gt; The first version of SwiftStarterKits’ documentation has been shipped.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Reiterating my previous discussions on this topic, SwiftStarterKits has been sorely missing guides on using the starter kit and its various integrations. For a developer focused business, documentation is essentially part of the core product. This is a pretty good start I think.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Please write some docs&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;The layers of complexity to building software cannot be understated, and to write a system that provides a &lt;em&gt;serious add in value&lt;/em&gt; there needs to be a certain level of automated support. From experience, developers tend to assume their systems are obvious on the outset, but usually the opposite is true.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;No matter how obvious it may seem, 3 things need to be answered about a software system as soon as possible in you docs:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;How do I get it? A direct binary install? A package manager command? Do I clone the repo directly?&lt;/li&gt;&lt;li&gt;What is the least amount of knowledge that I need to use it?&lt;/li&gt;&lt;li&gt;What else does this system do? Expand on the core experience, only after basic setup is complete.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Don’t make things too complicate at first, but please, explain what the software does, and how to use it.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Next Steps&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Sidebar aside, I plan to expand on these docs in the coming weeks:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Project creation.&lt;/li&gt;&lt;li&gt;Creating new modules.&lt;/li&gt;&lt;li&gt;Integration specific how-to’s (Firebase, RevenueCat, deeplinking, push notifications, etc).&lt;/li&gt;&lt;li&gt;An API reference.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Plus I feel behind on product work, gotta carve out more iOS time this week.&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</content>
  </entry>
</feed>
