{"id":90,"date":"2026-04-16T23:07:51","date_gmt":"2026-04-16T23:07:51","guid":{"rendered":"https:\/\/secondhandcarrot.com\/blog\/?p=90"},"modified":"2026-04-16T23:23:46","modified_gmt":"2026-04-16T23:23:46","slug":"tech-stacked","status":"publish","type":"post","link":"https:\/\/secondhandcarrot.com\/blog\/dev\/tech-stacked\/","title":{"rendered":"Tech Stacked&#8230;"},"content":{"rendered":"\n<p>It\u2019s been about a year since the last studio I worked for closed, and I decided not to update my r\u00e9sum\u00e9. In that year, Lona and I have built something together that we hope will soon stand on its own. This is my attempt to document that first year in hindsight.<\/p>\n\n\n\n<p>Lona and I both come from creative tech backgrounds. She\u2019s a singer, theater director, and audio engineer. I\u2019m a software engineer\u2014both in and out of the games industry\u2014and I\u2019ve dabbled in game design and visual arts. But we wanted a clear separation of concerns for our job titles and eventual roles at the company, so we decided she would be Creative Director and I would be Technical Director.<\/p>\n\n\n\n<p>I suppose it didn\u2019t matter much since we\u2019re mostly directing each other, but knowing our lanes has definitely helped keep things moving. I still contributed as a designer, and she still got her hands dirty in\u2011engine with level design and scripting dialog trees. But when it came time to solve specific problems or make important creative decisions, we knew who owned what.<\/p>\n\n\n\n<p>For our first game, we decided to build a single\u2011player experience. This kept the testing loop simple and avoided the overhead of running servers. We knew we planned to add multiplayer and expand our shop later, so we needed to be careful not to drift too far into total isolation with a one\u2011off codebase. To that end, we needed a good framework\u2014a good game engine.<\/p>\n\n\n\n<p>I know many solo and indie devs prefer Unity or Godot lately, but I\u2019ve been working in Unreal Engine since the Unreal 3 UDK was new, and all of my professional game\u2011dev experience has been in UE4 and UE5. So we picked Unreal 5 not only for its feature set, but for my skill set.<\/p>\n\n\n\n<p>During COVID, Lona got deep into <em>Animal Crossing<\/em> while I spent a lot of time catching up with <em>Breath of the Wild<\/em>, and we both sank many, many months into <em>Stardew Valley<\/em>. By the time we committed to UE5, we had a pretty good idea of the genre we wanted to pursue. We would blend the games we loved into a singular experience\u2014a Cozy Adventure.<\/p>\n\n\n\n<p>I\u2019ll save the game\u2011design details for another post and focus here on how we planned to build this thing. We needed tools, systems, art, sound, code\u2014everything. Where to start?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>A Version of Versioning \u2013 Why We Chose Perforce Over Git\u2011LFS With Just Two People<\/strong><\/h2>\n\n\n\n<p>I started with Git and Git\u2011LFS to manage our codebase and my back catalog of Unreal Marketplace and FAB assets for prototyping. I wanted to give Lona all the creative tools I could, so we dumped every asset that looked like it might fit our vibe into a single project. This was fine at first, but we started running out of disk space. Git\u2011LFS was multiplying the size of our project to keep version history while we figured out our folder structure and made small edits to materials and meshes.<\/p>\n\n\n\n<p>I tried offloading the LFS storage to a file server with a big drive, but it started eating that up too. There may have been a more optimal setup, but eventually we switched to the Perforce indie license\u2014and it has worked great.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Visual Studio<\/strong><\/h2>\n\n\n\n<p>This was a no\u2011brainer. I\u2019m a coder; Blueprints are great, but we were definitely going to write some code. Both Git and Perforce have VS plugins, and they were very helpful. GitHub\u2019s Copilot was also a nice extra set of \u201ceyes\u201d and a fast research assistant when you\u2019re solo\u2011coding. Sometimes it got a little weird with its assumptions, but it also saved me time by auto\u2011completing whole functions that matched my design patterns.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Blender<\/strong><\/h2>\n\n\n\n<p>I\u2019ve been playing around with Blender for about 20 years. I\u2019m very comfortable there, and the industry\u2014especially indies\u2014has really embraced it lately. For FBX edits, importing and converting assets, and authoring first\u2011pass content, Blender was in.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Adobe Creative Suite \u2013 Photoshop, Illustrator, Fonts, Stock Art, and the Substance 3D Suite<\/strong><\/h2>\n\n\n\n<p>There are definitely open\u2011source options for these things, but we needed to get moving fast and had a lot of work ahead of us retooling assets to fit our aesthetic. So we decided to pay for the industry\u2011standard toolset.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Articy Draft 3<\/strong><\/h2>\n\n\n\n<p>We knew we wanted a strong narrative and didn\u2019t want Lona to have to wait for me to develop a toolset before she could start designing it. I had played around with Articy Draft before, so it was an easy choice.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Logic Pro<\/strong><\/h2>\n\n\n\n<p>Lona already had a Mac Mini and a MacBook Pro in her audio lab, and we didn\u2019t need anything else. We might go into specifics on her process later.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Unreal Engine 5 &amp; Plugins<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Base Setup<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>World Partition streaming open\u2011world level<\/li>\n\n\n\n<li>Nanite and Lumen for rendering<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Custom Systems<\/strong><\/h3>\n\n\n\n<p>User interface, character scheduling, calendar, day\/night cycle, inventory, interaction, farming systems, puzzles, resource gathering, and weather.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Plugins<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Water &amp; Buoyancy<\/strong> \u2013 An island needs the sea, rivers, and waterfalls<\/li>\n\n\n\n<li><strong>Dungeon Architect<\/strong> \u2013 Procedural dungeons so there\u2019s always something new to explore<\/li>\n\n\n\n<li><strong>Procedural Foliage<\/strong> \u2013 Filling in forests and coral reefs<\/li>\n\n\n\n<li><strong>AI Systems<\/strong> \u2013 StateTree, World Partition Nav Mesh<\/li>\n\n\n\n<li><strong>Mutable<\/strong> \u2013 Procedural skeletal meshes for customization and variation<\/li>\n\n\n\n<li><strong>Articy Plugin<\/strong> \u2013 Importing and integrating narrative data<\/li>\n\n\n\n<li><strong>Mass Gameplay<\/strong> \u2013 Data\u2011first gameplay model to keep the game running while assets and levels stream out; road\u2011based navigation; simulation for all sorts of things<\/li>\n<\/ul>\n\n\n\n<p>So far, so good. It\u2019s been a heck of a first year. Let me know if you want more information on anything specific.<br><br><br><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>It\u2019s been about a year since the last studio I worked for closed, and I decided not to update my [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"give_campaign_id":0,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"advanced_seo_description":"Discover how two creatives built their game studio from scratch, navigating tools and challenges in their first year of development.","jetpack_seo_html_title":"Documenting Our First Year as Indie Game Developers","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"edge","default_image_id":27,"font":"","enabled":true,"token":"eyJpbWciOiJodHRwczpcL1wvc2Vjb25kaGFuZGNhcnJvdC5jb21cL2Jsb2dcL3dwLWNvbnRlbnRcL3VwbG9hZHNcLzIwMjZcLzA0XC9GZXlsaWdodEJheUljb24ucG5nIiwidHh0IjoiVGVjaCBTdGFja2VkJiM4MjMwOyIsInRlbXBsYXRlIjoiZWRnZSIsImZvbnQiOiIiLCJibG9nX2lkIjoyNTQxMzg4NTd9.9u-plCvCOv3K6PP4dfeJMBe37G6p2ePmOCSLgu6gF_8MQ"},"version":2},"_wpas_customize_per_network":false},"categories":[9],"tags":[15,4,8,14,13],"class_list":["post-90","post","type-post","status-publish","format-standard","hentry","category-dev","tag-blender","tag-dev","tag-game","tag-tech","tag-unreal"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/secondhandcarrot.com\/blog\/wp-json\/wp\/v2\/posts\/90","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secondhandcarrot.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secondhandcarrot.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secondhandcarrot.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/secondhandcarrot.com\/blog\/wp-json\/wp\/v2\/comments?post=90"}],"version-history":[{"count":4,"href":"https:\/\/secondhandcarrot.com\/blog\/wp-json\/wp\/v2\/posts\/90\/revisions"}],"predecessor-version":[{"id":94,"href":"https:\/\/secondhandcarrot.com\/blog\/wp-json\/wp\/v2\/posts\/90\/revisions\/94"}],"wp:attachment":[{"href":"https:\/\/secondhandcarrot.com\/blog\/wp-json\/wp\/v2\/media?parent=90"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secondhandcarrot.com\/blog\/wp-json\/wp\/v2\/categories?post=90"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secondhandcarrot.com\/blog\/wp-json\/wp\/v2\/tags?post=90"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}