Author: Landon

  • Local Apps FTW – Project Manager

    Local Apps FTW – Project Manager

    ProjectManager — What It Is & Why I Built It

    I’ve been using AI agents more and more while developing my game, but as I need more and more work to get done (and anticipating the scale of building a community that will deliver feedback), I’ve had trouble managing all of the work that needs to get done.

    When I’m the one doing the work, the “system” is simple: I remember what I’m doing, what I did yesterday, and what I’m doing next.

    When an agent is doing the work, the system breaks down fast:

    • Work happens in chat threads, not in a place I can scan quickly.
    • I lose track of what I delegated vs. what’s still pending.
    • Status becomes vague (“I think it’s done?” “I think it’s in progress?”).
    • I can’t easily see what changed without re-reading a conversation.
    • If I’m running multiple efforts, everything blends together.

    And then the biggest issue: I’m planning to automate feedback intake soon.

    In the near future, I want to hook up a Discord bot so community feedback and bug reports automatically become tickets I can triage.

    But before I automate intake, I needed to fix the foundation:

    If I don’t have a clean way to:

    • capture work
    • prioritize it
    • and track what’s being done

    …then automating feedback just creates a faster way to generate chaos.

    So this project isn’t me trying to invent a new PM tool or replace Jira.

    It’s much simpler than that:

    I built ProjectManager to optimize my current workflow—so I can manage agent-driven tasks with a lightweight, visible backlog now… and be ready for automated user feedback later.


    Overview

    I built this because I kept running into the same issue: agents can move faster than my ability to track what’s happening.

    Without a system:

    • I’d ask an agent to do something, then forget what I delegated.
    • Work would get duplicated because I didn’t remember what was “already in progress.”
    • Context would live in chat transcripts instead of a place I can scan in 10 seconds.

    I wanted a workflow where I could:

    • capture work quickly as tickets
    • prioritize it visually
    • tell an agent “go do these”
    • and trust that statuses and history would stay accurate

    In practice, my core command to agents is: “PM Tickets”.

    That phrase means: pull the current tickets, complete the next work item(s), and update the board as you go (status changes, checklists, and notes).


    How It Works (High Level)

    The app is intentionally straightforward.

    Data model

    • Projects are stored separately (each project has its own folder and ticket JSON).
    • Tickets live inside a project, with fields for status, type, checklist items, and history.

    Primary UI flow

    • Open a project.
    • See a Kanban board with custom columns.
    • Drag tickets across statuses.
    • Open a ticket to manage sub-tasks and review change history.

    Where AI fits

    • The board is the source of truth for “what should happen next.”
    • Agents read tickets, execute tasks, and update the tickets as they work.
    • The app is designed so agents can make safe, incremental changes without breaking the workflow.

    Design & Technical Decisions

    This is the heart of the project—what I chose to optimize for, and what I intentionally didn’t.

    1) Local-first storage (on purpose) I didn’t want to start by designing a database schema, auth, hosting, deployment, etc. I wanted a tool I could use immediately.

    So the source of truth is local JSON files.

    • Easy to inspect.
    • Easy to back up.
    • Easy to change.
    • Works offline.

    The tradeoff is obvious: local JSON won’t scale to large teams or high concurrency without rethinking storage.

    2) Repository pattern to stay “cloud-ready” Even though it’s file-backed today, I didn’t want the UI tightly coupled to the file system.

    So I used a repository abstraction so I can swap storage later (DB, hosted service, etc.) without rewriting the front end.

    This is a classic “do a little extra now to avoid a rewrite later” choice.

    3) Multi-project isolation to prevent backlog collapse Most task tools drift into one mega-list. That’s exactly what I didn’t want.

    ProjectManager keeps data isolated per project so I can:

    • run multiple efforts without cross-contamination
    • keep boards clean
    • avoid turning everything into one endless backlog

    4) Configurable workflow instead of hardcoding my preferences I wanted this to fit different projects without building a new app every time.

    So you can customize:

    • status columns (the board layout)
    • ticket types (labels/icons/colors)
    • the theme (CSS variables + presets)

    This adds some complexity, but it avoids the “tool fights your workflow” problem.

    5) “Safe edits” over destructive actions Agents make lots of changes. Humans make mistakes. Deleting data is a great way to lose context.

    So tickets are archived instead of hard-deleted, and major changes write to a history/audit log.

    This is one of those decisions that feels boring until the first time it saves you.


    Limitations & Open Questions

    This is still early, and there are real constraints.

    • It’s not a full PM suite. There’s no reporting, no complex dependencies, no sprint tooling.
    • Local-first is a constraint. Multiple concurrent users (or multiple agents) would need better coordination.
    • UX still has rough edges. Some flows are optimized for how I think, not necessarily for a new user.
    • Agent behavior is only as good as the prompt + discipline. The app helps, but it can’t fully prevent messy updates.

    The biggest open question is storage and collaboration:

    • At what point does “local JSON + repo pattern” stop being enough?
    • What’s the simplest path to multi-device sync without turning this into a SaaS project?

    What I’m Building Next

    The next step is the one that makes this feel like a real pipeline:

    Discord → Tickets (automatic intake) I’m planning to hook up a Discord bot so community feedback and bug reports automatically create tickets.

    That gives me:

    • less manual copy/paste
    • faster triage
    • a clearer loop from community → backlog → shipped

    If that works, ProjectManager stops being a personal tracker and becomes a lightweight “ops layer” for shipping.


    What I Learned

    Building this clarified a few things for me:

    • When execution gets cheap, coordination becomes the bottleneck. Agents amplify this quickly.
    • Local-first is underrated for early tools. It’s fast to iterate and easy to reason about.
    • Abstractions are only worth it if they buy you a likely future. The repository pattern feels worth it here.
    • Audit trails matter more with agents than with humans. Agents move fast, and “what happened?” becomes a daily question.
    • Customizable workflows are a tradeoff. Flexibility helps reuse, but it increases surface area and testing burden.

    This project wasn’t about building the perfect tool. It was about building a control panel I can trust while agents do more and more of the work.

  • Day 46 — Multiplayer Visual Fixes, Global Action Cursor, and Seed UX Improvements

    Day 46 — Multiplayer Visual Fixes, Global Action Cursor, and Seed UX Improvements

    Context

    Today was about closing the loop on multiplayer issues and tightening up some core interaction patterns that had started to sprawl.


    Multiplayer Visual Fixes

    I completed the remaining multiplayer fixes from yesterday. The root cause ended up being fairly simple:

    • The math driving visual placement was incorrect
    • This caused visuals for non-primary players to spawn extremely far away

    Once corrected, visuals now appear correctly for all players in multiplayer sessions.

    Global Action Cursor Refactor

    I also refactored the action preview cursor:

    • Previously, each tool owned its own cursor logic
    • This led to duplication and inconsistent behavior

    I pivoted to a single global cursor that:

    • Listens for player state and equipped item
    • Displays the appropriate preview regardless of tool

    This significantly simplifies the system and makes future tools easier to add.

    Seeds as Equipable Tools

    I changed the behavior of Seeds to function like tools:

    • Seeds can now be equipped
    • Players can walk around with a placement cursor visible
    • Multiple seeds can be planted in succession without reopening the inventory menu

    This makes planting much faster and more fluid.


    Summary

    What I accomplished:

    • Fixed remaining multiplayer visual issues.
    • Corrected placement math for non-primary players.
    • Refactored tool-specific cursors into a global action cursor.
    • Updated Seeds to behave as equipable tools.

    What I learned:

    • Multiplayer bugs often come down to simple math errors.
    • Centralizing shared UX elements reduces complexity.
    • Treating similar interactions consistently improves player flow.
  • Day 45 — Multiplayer Testing, Private Builds, and Visual Sync Issues

    Day 45 — Multiplayer Testing, Private Builds, and Visual Sync Issues

    Context

    Today was focused on validating the game in a true multiplayer environment. After a lot of pre-emptive refactoring, it was time to see how everything actually behaved with more than one player.


    Multiplayer Testing

    I ran several multiplayer tests and had to push a private build multiple times to iterate quickly on fixes. This surfaced a number of bugs that only appear in multiplayer contexts.

    Most systems behaved as expected:

    • Core gameplay loops functioned correctly
    • Persistence held up across sessions
    • Player interactions did not interfere with one another

    Visual Issues for Non-Primary Players

    The main blocker I found was a visual sync issue:

    • Everything looked correct for the first player
    • Any additional players had missing or incorrect visuals

    After digging into it, I was able to track down the root cause. I didn’t apply the fix yet, but at least the problem is now well understood.

    Current State

    While the issue isn’t resolved yet, today was still productive. Identifying multiplayer-only bugs early is exactly why this testing phase exists.


    Summary

    What I accomplished:

    • Tested Island Crossing in multiplayer.
    • Iterated through multiple private builds.
    • Fixed several multiplayer-related bugs.
    • Identified the cause of visual issues affecting non-primary players.

    What I learned:

    • Multiplayer bugs often hide behind single-player assumptions.
    • Visual sync issues are easier to reason about once isolated.
    • Early multiplayer testing prevents much larger problems later.
  • Day 44 — Home Editing Completion, Multiplayer Prep, and Cleanup

    Day 44 — Home Editing Completion, Multiplayer Prep, and Cleanup

    Context

    Today marked the end of the Home Editing chapter. The focus was on finishing the remaining work, stabilizing the system, and making sure it wouldn’t block future multiplayer support.


    Home Editing Completion

    I fixed the remaining bugs across the Home_Edit system and brought all related features to a complete, usable state. At this point:

    • Placement, movement, surface editing, and removal all behave as intended
    • Persistence is reliable
    • The Response Menu flows cleanly across all supported actions

    This feels like a natural stopping point for Home Editing before shifting focus elsewhere.

    Pre-Emptive Multiplayer Refactoring

    With Home Editing complete, I moved on to pre-emptive refactoring for multiplayer. The main addition here was a system for managing login grants:

    • Initial loadouts can now be changed centrally
    • Makes testing significantly easier
    • Will be useful for structured playtests and beta testers

    This also sets the groundwork for handling different player states in multiplayer scenarios.

    Bug Cleanup Across Systems

    I also took time to fix bugs that had surfaced in other systems as a side effect of the Home work:

    • Farming
    • Tools
    • Crafting

    These were mostly regressions caused by shared components being extended during Home development.


    Summary

    What I accomplished:

    • Completed the Home Editing feature set.
    • Fixed remaining Home_Edit bugs.
    • Implemented a login grants system for testing and multiplayer prep.
    • Cleaned up regressions across farming, tools, and crafting.

    What I learned:

    • Large feature chapters benefit from a clear end point.
    • Multiplayer concerns should be addressed early, even if multiplayer comes later.
    • Feature work almost always creates downstream bugs that need intentional cleanup.
  • Day 43 — Home_Edit Response Menu & New Interaction Paths

    Day 43 — Home_Edit Response Menu & New Interaction Paths

    Context

    Today I started building out the Response Menu for Home_Edit, which appears when selecting an item that has already been placed. This is an important UX layer that turns placement into a more flexible, editor-like experience.


    Response Menu Actions

    When interacting with a placed home item, players now see contextual options:

    • Move — reposition the item
    • Put Away — remove the item and return it to inventory
    • Edit Surface — modify the surface the item is attached to (when applicable)

    This expands Home_Edit beyond simple placement and introduces meaningful post-placement interaction.

    Put Away (Working)

    The Put Away action is fully implemented and working as expected:

    • The item is removed from the scene
    • Inventory updates correctly
    • Persistence remains intact

    This was the cleanest part of today’s work.

    Move & Edit Surface (In Progress)

    The Move and Edit Surface actions required deeper architectural changes:

    • They intersect with placement, hierarchy, and surface ownership
    • They rely on the same movement semantics that were already due for refactoring

    As a result, a significant amount of refactoring was required, and this work will continue into the next day.

    Current State

    The Response Menu structure is in place and functional, but some actions are still mid-refactor. This feels like the right time to pause, rather than force incomplete behavior into the system.


    Summary

    What I accomplished:

    • Implemented the Home_Edit Response Menu.
    • Added new interaction options: Move, Put Away, Edit Surface.
    • Completed the Put Away flow.
    • Identified and began refactoring required for Move and Edit Surface.

    What I learned:

    • Contextual menus quickly expose architectural weaknesses.
    • Post-placement interactions are more complex than initial placement.
    • It’s better to extend refactors intentionally than patch around them.
  • Day 42 — Home Items on Surfaces & Rethinking Move Semantics

    Day 42 — Home Items on Surfaces & Rethinking Move Semantics

    Context

    Today I focused on enabling home items to be placed on top of other home items, such as vases on tables. This is a key step toward making interiors feel layered, expressive, and closer to expectations set by cozy life-sim games.


    Items on Surfaces (Now Working)

    I successfully enabled placement of certain items on other items:

    • Decorative items (like vases) can be placed on furniture (like tables)
    • Surface-based placement works reliably in normal use

    At this point, home items on surfaces are functionally working and usable. There are still a few minor edge cases—such as rugs interacting oddly with ground placement—but overall the feature is in a good state and ready to build on.

    The Problem: Moving Parent Items

    The main remaining issue appears when interacting with the parent item:

    • Selecting and moving the table does not always correctly handle attached child items
    • This exposed flaws in how placement and movement were previously implemented

    Historically, moving an item worked by:

    • Destroying the entity
    • Re-adding it while moving
    • Destroying it again
    • Re-adding it permanently

    This approach was sufficient for simple placement but breaks down once items can have children.

    Planned Refactor

    The path forward is clear: placement and movement need to stop relying on destroying entities.

    Instead:

    • Items should persist while being repositioned
    • Child items should remain attached and move with their parent

    This will require a larger refactor, but it’s the correct foundation for layered interiors.


    Summary

    What I accomplished:

    • Enabled home items to be placed on top of other home items.
    • Shipped surface placement in a usable state.
    • Identified and isolated remaining issues with parent–child movement.

    What I learned:

    • Layered placement introduces true hierarchy concerns.
    • Destroy-and-recreate movement does not scale.
    • Minor visual bugs are acceptable once core interaction works.
  • Day 41 — Persistence Cleanup, Home Item Scale‑Up, and Hitting System Limits

    Day 41 — Persistence Cleanup, Home Item Scale‑Up, and Hitting System Limits

    Context

    Today was another extended stay in bug jail, but a productive one. The focus was persistence—specifically chasing down a chain of issues where fixing one problem would expose the next.


    Persistence Fixes

    I worked through a series of persistence bugs:

    • Fixing one save/load issue would reveal another
    • Edge cases appeared when combining placement, re‑selection, and interior transitions

    After working through them systematically, everything is now saving and loading reliably, and the Home system feels solid again.

    Scaling Up Home Items

    With persistence stable, I finished setting up all of the home items I had prepared. The game now supports ~50 home items that can be placed inside homes.

    This immediately exposed a practical limitation: I hit constraints around how many items can be handled cleanly inside a single function.

    Pragmatic Refactor

    To move forward, I refactored the item setup logic to work around these limits. It’s not the most elegant implementation, but:

    • It’s significantly easier for me to manage
    • It scales to hundreds of items, which is the real requirement

    This felt like a reasonable trade‑off between ideal architecture and long‑term maintainability.


    Summary

    What I accomplished:

    • Fixed a cascade of persistence issues.
    • Stabilized save/load behavior for home items.
    • Added ~50 home items to the system.
    • Refactored item setup logic to support large catalogs.

    What I learned:

    • Persistence bugs often hide in layers.
    • Fixing the last bug is usually harder than the first.
    • Practical scalability sometimes matters more than elegance.
  • Day 40 — Bug Jail, Placement Preview Regression, and Constraint Polish

    Day 40 — Bug Jail, Placement Preview Regression, and Constraint Polish

    Context

    Today was largely about polish and stability. As the Home and Home_Edit systems grow, I’m starting to feel the weight of regressions where small changes can cause outsized breakage. Today’s main issue was one of those moments.

    Placement Preview Regression

    I spent most of the day chasing down a regression where the placement preview was no longer displaying correctly.

    This involved:

    • Arguing with AI agents over incorrect assumptions
    • Restoring older snapshots to isolate the issue
    • Carefully diffing recent changes

    Eventually, I found the root cause and got it fixed. It appears that a recent refactor unintentionally broke the preview logic. This was frustrating, but also a reminder that even well‑structured systems can become fragile as they scale.

    Small but Important Fixes

    In addition to the regression fix, I completed several smaller tasks that improve overall stability and UX:

    • Set up dozens of home items as prefab entities
    • Added support for certain home items to not be rotatable (e.g., wall‑mounted TVs, ceiling items)
    • Prevented players from equipping tools while in Home or Home_Edit mode
    • Fixed issues where tools were still visually displayed despite being unequipped
    • Added a placement constraint when building a home: it must be at least two tiles away from a tree to prevent branches clipping through interiors

    Current Concerns

    Despite frequent refactoring and attempts to keep the codebase scalable, today reinforced a concern: as the project grows, the surface area for subtle regressions grows with it. Catching these issues early requires discipline, tooling, and patience.


    Summary

    What I accomplished:

    • Fixed a major placement preview regression.
    • Added rotation constraints for wall and ceiling items.
    • Improved Home/Home_Edit input and equip restrictions.
    • Expanded home item prefabs.
    • Added placement rules to prevent environmental clipping.

    What I learned:

    • Regressions are inevitable as systems scale.
    • Snapshotting and diffing are essential debugging tools.
    • Architectural discipline reduces—but does not eliminate—fragility.
    • “Bug jail” days are part of building complex systems.
  • Day 39 — Default Home Items, Interior Spawn Refactor, and Agent Workflow Friction

    Day 39 — Default Home Items, Interior Spawn Refactor, and Agent Workflow Friction

    Context

    With the Home_Edit placement system complete, today was about making homes feel lived in by default and improving the overall spatial consistency of interiors.

    Default Home Items

    I added support for default items that spawn inside homes. For the starter setup, I included four ceiling downlights. These behave exactly like other home items:

    • They can be moved
    • Removed
    • Repositioned using Home_Edit

    This helps interiors feel intentional from the moment a player enters, rather than empty or purely functional.

    Interior Spawn Refactor

    I made a significant change to how homes are spawned and entered.

    Previously:

    • The exterior home mesh was essentially a dummy
    • Entering the home teleported the player to a distant interior location
    • This was done in anticipation of streaming and performance constraints

    After revisiting this, I decided it was overly cautious and introduced several UX and consistency issues.

    Now:

    • The Home Interior entity spawns directly on the island
    • Entering the home keeps the player in the same world space
    • You can see surrounding objects while inside

    This feels much more grounded and cohesive, and I strongly prefer this approach.

    Refactoring & Agent Workflow Challenges

    This change required another round of refactoring, especially around placement, transitions, and interior state handling.

    I also ran into workflow friction with AI agents:

    • Gemini 3 Pro would not function reliably in Agent mode
    • I ended up using Gemini in Ask mode for analysis and task breakdowns
    • ChatGPT 5.2 handled the actual Agent‑based code execution

    While this worked, it added extra overhead and context switching. I still strongly prefer Gemini 3 Pro for reasoning, but it requires more manual orchestration.


    Summary

    What I accomplished:

    • Added default home items (ceiling downlights).
    • Enabled full editing support for default items.
    • Refactored home interior spawning to remain on the island.
    • Improved spatial consistency and interior UX.
    • Navigated a multi‑model AI workflow to complete the changes.

    What I learned:

    • Default content dramatically improves perceived quality.
    • Over‑optimizing for performance too early can hurt UX.
    • Clear architectural decisions reduce long‑term complexity.
    • AI tools are powerful, but orchestration still matters.
  • Day 38 — Home Item Placement Completion & Persistence

    Day 38 — Home Item Placement Completion & Persistence

    Context

    Today marked the completion of the Home_Edit item placement system. After several days of iteration, refactoring, and bug fixing, the goal was to fully stabilize placement across all interior surfaces and ensure everything persisted correctly between sessions.


    Final Placement Fixes

    Most of today’s work focused on resolving remaining issues with wall and ceiling placement. These were the most error‑prone cases due to camera orientation, coordinate transforms, and surface targeting.

    With these fixes in place:

    • Placement logic behaves consistently across all surfaces
    • Visual indicators correctly reflect placement state
    • Edge cases during re‑selection and movement are resolved

    Persistence Pass

    I completed a full persistence pass for home items:

    • Items placed on the floor, walls, and ceiling now save correctly
    • All items load back into the correct position and orientation
    • Re‑selecting items after re‑entering the home works as expected

    This was a critical milestone, since Home_Edit would not be viable without reliable save/load behavior.

    Re‑Selection & Editing

    Placed items are now fully editable:

    • You can re‑select any placed object
    • Move it to a new location
    • Rotate it again

    This applies uniformly across floor‑, wall‑, and ceiling‑mounted items.

    Documentation & Agent Updates

    To prevent future regressions, I:

    • Updated internal documentation
    • Revised instructions and context for the coding agents
    • Clarified ownership boundaries and expected behaviors

    This should reduce friction as more features are layered on top of Home_Edit.


    Summary

    What I accomplished:

    • Completed home item placement for floor, wall, and ceiling surfaces.
    • Fixed remaining bugs related to wall and ceiling placement.
    • Finalized persistence for all placed home items.
    • Enabled full re‑selection, movement, and rotation after placement.
    • Updated documentation and agent guidance.

    What I learned:

    • Persistence is the true test of system completeness.
    • Wall and ceiling interactions require extra architectural care.
    • Clear documentation is essential once systems reach this level of complexity.