[{"content":"I’ve been using AI agents exclusively to write code for a few months now. It’s been a cool experience, but some surprising things have surfaced, showing that my main challenge is not writing code, but capturing and organizing the work agents uncover.\nAgents surface more work than I can write down by hand. I like to build entire epics in a single run, but agents lose context and can’t see the whole picture, which makes that harder to sustain. I also like to have agents work unattended overnight and “pick up” new work, but that creates another transition problem. Beads turns out to be a better way to capture and organize work than tickets. A bit of context I’ve created a development harness that uses AI agents to write code. The agents have roles I believe are important for development teams (e.g., architects, testers, and devs), and they can communicate with one another. I have skills that invoke the agents, and the main one is feature delivery. The feature delivery plugin is meant to drive the development of features mostly unattended.\nThe problem My setup worked reasonably well, but I was running into a few problems that made the workflow harder to keep moving.\nAs the agents work on things, they find issues they need to fix. That’s not a problem in itself, but it raises the question of what to do about the issues, which in turn drives the next problem. I like to build entire epics in a single run, but agents lose context and can’t see the whole picture. I found that the agents seemed to lose track or not do what they were supposed to do. I would have to intervene and tell them what to do next, which is not ideal. This one is a me thing, but I do feel some pressure to optimize my work with agents. They could be doing stuff while I’m sleeping! The challenge is that when it’s done with a task, there isn’t an easy way to let them know what other tickets are safe to work on. Beads are agent sized A bead is a small, self-contained unit of work: what to do, why it matters, what done looks like, and what it depends on. The size constraint is not aesthetic. It is the whole point. Steve Yegge, who wrote the thing, introduces beads as a memory system for coding agents rather than as an issue tracker, and a few weeks in, that is the more useful way to hold it.\nAgents lose their context. Sessions get cleared, windows fill up, a run dies at 2 am. So if the work is captured as a single atomic bead, a completely fresh agent with no memory of the conversation can read it and pick up where the last one left off.\nThat is a higher bar than “a ticket a teammate could take”, because a teammate was in the standup and remembers what we agreed, whereas the agent has only what is written down. The agent has whatever is written in the bead and nothing else.\nBeads are self-contained units of work, stored in a directed acyclic graph. The beads are stored in a doltdb that is git backed. You can manipulate the beads using a command-line tool, and the agents can read and write beads through the same interface. If you want something more visual, you can set up Bead Me Up Scotty for a GUI. Setting up Setting up beads is pretty straightforward. You can set it up through Homebrew or through npm; the same goes for the Bead Me Up Scotty GUI. I run a meta repo (a repo where subrepos are set up as git submodules), and I have the beads folder set up at the root of the meta repo. You can have a beads folder in each repo as well, if you want. I’ve also set it up with the beads folder in a separate repo so that other team members can see the beads.\nBeads can integrate with JIRA, so if you use that, you can import tickets into beads. It has native support for epics, stories, and tasks, and you can also create your own custom bead types. Key concepts to leverage when setting up beads:\nDependencies and gates are expressed as beads. Beads can be chained together to form a dependency graph, and you can create machine gates or human gates that block moving forward until a condition is met. Use Labels to categorize beads. There is a built-in label called “skill” that can be used to assign an agent to a bead (you can also get creative with labels) Molecules are a logically grouped set of beads that the agent can work on together. Formulas are a declarative workflow template. I converted my feature delivery workflow into a formula, and it ties the whole workflow together. To be honest, I used Claude to help set everything up, based on how I like to work and leaning into the benefits of beads.\nHow I\u0026rsquo;m Getting on So far it’s been great. There are a bunch of things you can do with beads, and it’s a robust CLI, but I wrapped the interface in commands and skills I use in Claude, so the workflow stays connected (I very rarely use bd commands directly).\nI have custom scripts for stamping beads with sessions, creating epics, and approving work (part of the reason for this is that some of the commands would get mangled in my remote control sessions)\nWithin the first few days of using beads, my agents created 800 beads and closed them. By making my feature delivery pipeline aware of beads, it “knows” when to table certain fixes and refactors for later. I maintain a link between top-level epics and tickets in GitHub, and I focus more on user-facing features than on wrangling bugs. I even created an overnight delivery pipeline that will pick up new tickets and deliver them.\nBead me up Scotty is a great way to visualize the beads and their dependencies, and it includes some nice features, such as a section showing human-gated beads, a Kanban board of beads, and the ability to use AI to rewrite a bead\u0026rsquo;s description.\nI’ve also been able to tweak my feature delivery to provide clear context between stories, so some of the context limitations are mitigated.\nAll in all, it\u0026rsquo;s been a great addition to my overall workflow.","href":"https://ak33m.com/posts/the-other-bdd/","kind":"page","lang":"en","lastmod":"2026-09-07T00:00:00Z","objectID":"6de1bf6d08af7147579e42822d167b4b","publishDate":"2026-09-07T00:00:00Z","section":"posts","tags":["ai","beads","issue-tracking","agentic-development","software-development"],"title":"The Other BDD - Bead Driven Development","type":"posts"},{"content":"Behavior-Driven Development spent a decade as a niche testing discipline. AI coding just promoted it to core infrastructure for how software gets built.\nWhen a model writes most of the code, your job shifts from typing to specifying. Gherkin, the plain-language \u0026ldquo;Given / When / Then\u0026rdquo; format behind Cucumber, turns out to be one of the cleanest ways to specify intent for humans and machines at the same time.\nThe shift You\u0026rsquo;re doing product work now. AI handles the mechanical translation from intent to code. The scarce skill is deciding what to build and how it should behave at.\nThe bottleneck moved too. It\u0026rsquo;s no longer \u0026ldquo;can I write this function.\u0026rdquo; It\u0026rsquo;s whether everyone (me, the SME, the user, and the model) agreed on what the thing is supposed to do.\nThe case for Gherkin One language for everyone. BDD\u0026rsquo;s founding idea is a ubiquitous language: domain terms shared by business and engineering, so a scenario reads the same way to a product expert and to a compiler. The original academic characterization (Solis and Wang, EUROMICRO 2011) defines BDD as exactly this, a ubiquitous language fused with test-driven development and automated testing.\nA contract, not a vibe. A feature file is an executable specification. It states what will happen and, just as importantly, what won\u0026rsquo;t. That\u0026rsquo;s a far stronger collaboration artifact than a Slack thread or a ticket description.\nIt\u0026rsquo;s a prompt the whole team can read. Hand an AI a feature file, and you\u0026rsquo;ve told it precisely what success looks like. Run its output back against that file, and you can confirm, in business language, whether the model understood the request or quietly reinterpreted it.\nOne spec, many runners. A feature file describes behavior, not the level it runs at. The same scenario can be bound to an integration runner that drives the components directly and to an end-to-end runner that exercises the real system, each with its own step definitions. You get fast feedback and real confidence from one agreed description of the behavior instead of two divergent test suites.\nIt fights \u0026ldquo;magically passing\u0026rdquo; tests. A known failure mode of AI-generated tests is assertions tuned to go green rather than to verify anything. Granular Given/When/Then steps anchor each check to an observable behavior, which makes it harder for a test to pass and mean nothing.\nMore coverage, not more test code. Scenario Outlines let one written behavior exercise many input paths. You expand what\u0026rsquo;s verified without a matching explosion in test code to maintain.\nThe benefit practitioners report most consistently is the soft one. A 2018 IEEE survey of 75 BDD practitioners (Binamungu, Embury and Konstantinou) found the draw centered on living documentation and improved communication across stakeholders, scenarios everyone could actually read.\nThe Achilles heel, and why it\u0026rsquo;s smaller now The real cost was always the plumbing. BDD\u0026rsquo;s historic tax wasn\u0026rsquo;t writing scenarios; it was wiring each step to test code and keeping it alive. That same 2018 survey found the maintenance burden grows with suite size, duplication becomes a critical problem, and teams can hit a point where parts of the system are \u0026ldquo;effectively frozen\u0026rdquo; because the associated scenarios are too painful to change.\nAI eats the worst part. Generating step definitions, scaffolding fixtures, and refactoring duplicated steps is precisely the mechanical work LLMs are now good at. The chore that made BDD feel not worth it is the chore being automated.\nThe honest cons The evidence base is thinner than the hype. A 2023 systematic mapping of 166 BDD studies (Binamungu and Maro, Journal of Systems and Software) found research clusters around process and tooling, with a real scarcity of hard, industry-based evidence on BDD\u0026rsquo;s quality and maintenance payoffs. Much of what we \u0026ldquo;know\u0026rdquo; is reported benefit, not measured outcome.\nAI can make the bloat worse. The documented failure mode is too many overlapping, duplicated scenarios. An eager model will happily generate hundreds. Without discipline, AI accelerates the exact problem the research warns about.\nPlain English isn\u0026rsquo;t automatically clear. Scenarios still drift into ambiguity, redundancy, and lost focus, enough that researchers have built dedicated frameworks just to score scenario quality (Oliveira, Marczak and Moralles, SBES 2019; Binamungu, Embury and Konstantinou, XP 2020). \u0026ldquo;Readable\u0026rdquo; does not guarantee \u0026ldquo;precise.\u0026rdquo;\nGreen can still lie. A passing suite proves the scenarios you wrote pass, not that you wrote the right scenarios. BDD narrows the gap between intent and behavior; it doesn\u0026rsquo;t close it.\nSomeone still has to own the spec. AI writes the steps, but a human has to decide whether the behavior is correct. That judgment is the job now, and it doesn\u0026rsquo;t outsource.\nThe bottom line BDD\u0026rsquo;s value proposition, a shared and executable description of behavior, was always strong. What changed is the cost side: AI removes most of the setup-and-maintenance tax that kept teams away. The trade is real, not free. You still need someone who can tell a right scenario from a merely plausible one.\nGo deeper Solis, C. and Wang, X. (2011). A Study of the Characteristics of Behaviour Driven Development. 37th EUROMICRO Conference on Software Engineering and Advanced Applications (SEAA), pp. 383-387. Binamungu, L. P., Embury, S. M. and Konstantinou, N. (2018). Maintaining Behaviour Driven Development Specifications: Challenges and Opportunities. IEEE 25th International Conference on Software Analysis, Evolution and Reengineering (SANER), pp. 175-184. Oliveira, G., Marczak, S. and Moralles, C. (2019). How to Evaluate BDD Scenarios\u0026rsquo; Quality? XXXIII Brazilian Symposium on Software Engineering (SBES), pp. 481-490. Binamungu, L. P., Embury, S. M. and Konstantinou, N. (2020). Characterising the Quality of Behaviour Driven Development Specifications. Agile Processes in Software Engineering and Extreme Programming (XP), LNBIP 383, pp. 87-102. Open access, and its related work points on to other scenario-quality tools. Binamungu, L. P. and Maro, S. (2023). Behaviour-driven development: A systematic mapping study. Journal of Systems and Software, 203, 111749. Wautelet, Y., Nassiri, A. K. and Tsilionis, K. (2023). Investigating Quality Attributes in Behavior-Driven Development Scenarios: An Evaluation Framework and an Experimental Supporting Tool. Practice of Enterprise Modeling (PoEM), LNBIP 497, pp. 125-142.","href":"https://ak33m.com/posts/bdd-is-back/","kind":"page","lang":"en","lastmod":"2026-09-04T00:00:00Z","objectID":"badd173f75489a3ab91a35340f481661","publishDate":"2026-09-04T00:00:00Z","section":"posts","tags":["bdd","ai","testing","gherkin","software-development"],"title":"BDD Is Back, and AI Is the Reason","type":"posts"},{"content":"For years, I\u0026rsquo;ve searched for the right name for a distinct sensation: the moment a window opens in finances, in a career, or in a game of chess, where the challenge isn\u0026rsquo;t whether to act, but when and how much.\nThree ideas interlock precisely to frame this feeling: Kairos, the Kelly Criterion, and optimal stopping theory. Each is interesting on its own, but together, they become operational; offering a way to act on that sensation.\nKairos: The Texture of the Right Moment The ancient Greeks had two words for time. Chronos is linear, sequential, clock time, the kind you can measure. Kairos is something else entirely: the opportune moment, the crack in time where action has disproportionate leverage.\nKairos was personified as a god, depicted as a young man with a long forelock at the front of his head and completely bald at the back. The symbolism was deliberate. You could grab him as he approached. Once he passed, there was nothing left to hold.\nGreek rhetoricians used Kairos to describe the right moment to make an argument. Not the strongest argument in isolation, the right argument for this audience, in this context, at this moment. The same words said at the wrong moment fall flat. Said at the right moment, they land and stick.\nEarly Christian writers picked the concept up and sharpened it further. They distinguished Kairos from Chronos as the moment of intervention, the crack where something significant enters ordinary time. The word appears throughout the New Testament specifically to mark pivotal moments. What is interesting here is that the theological framing implies Kairos is discerned, not calculated. You do not compute your way to it. You develop sensitivity to it through practice and presence.\nModern psychology has begun to formalize what Kairos points to. There is research on what are called peak moments, windows of elevated psychological readiness where learning, commitment, and change are disproportionately available. These windows open after disruption, after achieving milestones, after loss, after unexpected wins. They close as homeostasis reasserts itself.\nThe deepest problem with Kairos is that it feels the same whether it is real or manufactured. Urgency is urgency. Your nervous system does not distinguish between a genuine window and artificial scarcity created by a salesperson or your own anxiety. Developing Kairos sensitivity is really developing the ability to distinguish genuine comparative advantage in this moment from emotional urgency that feels like a window.\nThe only reliable way to build that distinction is retrospective analysis. You look back at past decisions, the ones you pounced on, the ones you sat on, and you ask honestly: Was that a real window or a felt window? Over time, you start to see your own pattern.\nOptimal Stopping: How to Spend the Window Once you recognize that a Kairos window has opened, the next question is how to behave inside it. This is where optimal stopping theory, also known as the secretary problem, becomes useful.\nThe mathematical result is counterintuitive: spend the first 37% of your decision window purely observing. No commitments. Gather a baseline. After that threshold, commit to the first option that beats everything you saw in the observation phase.\nIn a chess endgame that typically runs 15-20 moves, 37% means roughly the first 5-6 moves are setup moves that improve your position and create problems for your opponent, but do not launch an attack. They maintain optionality. After that threshold, the question shifts from \u0026ldquo;is this the best possible move?\u0026rdquo; to \u0026ldquo;is this move better than anything I saw in the first 5-6?\u0026rdquo;\nThose are fundamentally different questions. The first one will keep you waiting forever. The second one forces commitment.\nThe failure modes on both ends are mirror images of each other. Pouncing before the observation phase ends means you are acting on the first thing that feels like the moment before you have a baseline. Waiting past the threshold means confusing certainty for a signal. Kairos does not offer certainty. It offers enough.\nThe Kelly Criterion: Sizing the Bet Recognizing the window and crossing the threshold are necessary, but there is a third decision: how much to commit.\nThe Kelly Criterion was developed by John Kelly at Bell Labs in 1956 while working on problems in signal-to-noise ratio. A colleague observed that the math also applied to gambling. Ed Thorp, the blackjack card counter who later became a hedge fund manager, as well as Warren Buffett and Charlie Munger, subsequently adopted and endorsed it.\nThe formula is:\nf = (bp - q) / b\nWhere:\nf is the fraction of your bankroll to deploy p is the probability of winning q is the probability of losing (1 - p) b is what you win per unit risked The formula is not asking how confident you are. It is asking what your net advantage is after pricing in the cost of being wrong. At 60% confidence on a 1:1 payout, the intuitive answer is to bet 60% of your stack or at least half of it, maybe 30%. The Kelly answer is 20%.\nf = (1 × 0.60 - 0.40) / 1 = 0.20\nThe gap between 60% and 20% is where most people overbet. You feel 60% sure, but your edge is 60% minus 40%. The formula forces you to price in q before you size the bet.\nKelly is optimizing for long-run growth, not single-outcome maximization. Going all-in, even with a real edge, risks ruin, and ruin ends the game permanently. Kelly keeps you alive through every future round, where compounding actually happens.\nSince you rarely know your true edge precisely in real-life situations, most practitioners default to Half Kelly: use half the value the formula suggests. This approach sacrifices some theoretical growth for much stronger protection against estimation errors.\nApplying Kelly Outside Gambling The variables change across domains, but the discipline is the same. In each case, before acting on the Kairos pull, you need to answer three questions honestly:\nWhat counts as a win specifically, not vaguely? What is b, and what do I actually get if I am right? What is p honestly, not hopefully? In product bets, your bankroll is not just money; it is time, money, and opportunity cost combined. Developers systematically undercount time. A negative Kelly result (when the math shows the expected value is below zero) does not mean the opportunity is permanently closed. It means you need to raise p before deploying significant resources. Validate first. Move p, then size the bet.\nIn real estate, most people calculate their bankroll as the down payment. Kelly sees the full financial position. If your net worth is $200K and you put $80K down, you have deployed 40% of your stack before Kelly even runs, before carrying costs and illiquidity.\nIn career transitions, your bankroll is career capital: current salary, unvested equity, relationships, and the optionality your current role provides. A warm referral into a well-researched role might carry p = 0.65. A blind application might be p = 0.30. The difference in Kelly output between those two is significant, and it tells you how much career capital to deploy before you have a secured offer.\nThe Chess Version Chess is the cleanest laboratory for these three frameworks because the game structure makes cycles visible in ways real life does not.\nYour bankroll is your position, the sum of material, tempo, pawn structure, piece activity, and king safety. When you sacrifice a pawn or commit your king\u0026rsquo;s rook to an attack, you are making a bet.\nA win, at the Kelly level, is not checkmate. It is a measurably better position. Converting a slight edge into a clear edge. That is your milestone. Not the whole game in one move.\nEdge is your honest assessment of the position. Not how it feels, how it actually scores. The useful internal question is: if this game were played ten times from here, how many would I win? That is your p.\nThe most common Kelly violation in chess is the speculative sacrifice. You see a combination, it feels like it works, p feels like 0.70. But you are estimating against your hoped-for response rather than the best play. Real p might be 0.45. And you have spent a significant fraction of your bankroll on that inflated estimate.\nKelly\u0026rsquo;s prescription before the sacrifice: Can you improve your position without committing those resources first? Centralize. Create pressure. Make your opponent spend resources responding. Raise p through preparation before you bet. Then, when the combination appears, and your heart rate goes up, pause just long enough to ask: Am I pricing in best play, or hoped-for play?\nThe Integrated Loop The three frameworks combine to guide opportunity recognition, deliberate observation, and prudent commitment. Key takeaway: Kairos signals a real window, optimal stopping advises when to act, and Kelly helps size the commitment.\nOptimal stopping tells you to spend the first 37% observing and building a baseline before committing. Kelly tells you how much to commit once you cross the threshold. When the window closes without action, the key takeaway is that discipline, not failure, is demonstrated. Acting is optional; being attentive is necessary.\nRegret from waiting too long often stems from confusing a closed window with one that still needs more readiness. Kelly\u0026rsquo;s main lesson: preserve resources for high-value opportunities and avoid overcommitting when uncertain.\nA Note on Estimation Everything in the Kelly formula is an estimate. p is an estimate. b is an estimate. Your bankroll is an estimate of whether it includes illiquid assets or future income.\nThe formula is only as good as your inputs, and it is prone to overestimation. If you think your edge is higher than it is, Kelly tells you to bet more than you should, and you get hurt.\nThis is why the retrospective work matters. Every time you run the Kelly calculation on a past decision, what did you estimate p to be, and what did it actually turn out to be? You are calibrating your estimator. The goal is not to be right the first time. The goal is to be less wrong over time, which is what compounding actually requires.\nThese are working notes. The frameworks are not original to me. Kairos comes from Greek philosophy and rhetoric, the Kelly Criterion from information theory, and optimal stopping from mathematics. What is mine is the integration and the application to the specific decisions I face.","href":"https://ak33m.com/posts/when-to-act-how-much-to-commit/","kind":"page","lang":"en","lastmod":"2026-04-03T00:00:00Z","objectID":"722ba806d5e6400e451d16f50efd04e6","publishDate":"2026-04-03T00:00:00Z","section":"posts","tags":["decision-making","strategy","chess","kelly-criterion","philosophy"],"title":"When to Act and How Much to Commit","type":"posts"},{"content":"The Problem I Wanted to Solve I\u0026rsquo;m a builder, and the hardest part of building good software isn\u0026rsquo;t the code; it\u0026rsquo;s listening. Specifically, listening to what users are actually struggling with, not just what they say they want.\nAI already helps me write code faster. I wanted it to help me with the part that matters more: understanding the problem before I build the wrong solution.\nWhat Is Candor? Candor is an AI-powered digital twin that lets product managers and developers run product discovery interviews without needing a real customer in the room.\nThe research backs this up: LLMs trained on demographic personas reproduce human consumer responses with 90% test-retest reliability, making them effective stand-ins for early-stage customer discovery.\nHere\u0026rsquo;s how it works:\nYou describe a customer persona You conduct a voice interview, and you can interrupt the AI mid-response, just like a real conversation The AI surfaces pains, gains, and jobs to be done as a real customer would Hesitations, workarounds, and emotional cues are captured as signals Follow-up questions are suggested to help you dig deeper How I Built It The technical architecture was one of the most interesting parts of the project:\nEvent-sourced domain model -every insight, association, and session event is immutable and replayable Dual projections -events project into both an RDF knowledge graph (SPARQL-queryable) and relational tables (SQL-queryable) Async enrichment pipeline -a dedicated Gemini Flash model extracts structured insights after each conversation turn without blocking the flow Embedding-based deduplication -cosine similarity at a 0.85 threshold catches paraphrased duplicates so insights don\u0026rsquo;t pile up redundantly Dynamic voice selection -an LLM picks from 8 voice profiles to match the persona description Deployed on Google Cloud Run, with prompts fine-tuned using promptfoo The stack: Python, Gemini, and the Agent Development Kit (ADK).\nThe Pivot Initially it was built from the perspective of a user using the tool to describe an issue they were having and the AI would help the user understand the problem better. But I quickly realized that the real value was in using the tool to run discovery interviews with other people. So I pivoted to make it a tool for running interviews, and that turned out to be a much more compelling use case.\nWhat I\u0026rsquo;m Proud Of I shipped a working product in 4 days -and then actually used it to validate other ideas I\u0026rsquo;d been kicking around. That\u0026rsquo;s the best proof of concept: when the tool you built becomes the tool you reach for.\nThe live voice experience was also a revelation. You take for granted the subtleties of voice-enabled apps -like allowing the user to cut off the AI mid-sentence -but building it from scratch made me appreciate every nuance.\nAnother unexpected takeaway: this way of running discovery interviews is surprisingly forgiving. Without the social pressure of keeping a real conversation flowing, you have the space to think, probe, and iterate freely.\nWhat\u0026rsquo;s Next I\u0026rsquo;d love to integrate Candor with common product discovery tools and make it easy to drop into different workflows. If you work in product and want to try it, the app is live:\n👉 signal-456101394130.us-central1.run.app","href":"https://ak33m.com/posts/building-candor/","kind":"page","lang":"en","lastmod":"2026-03-16T00:00:00Z","objectID":"e2ab0c7757d1174f8038510da2f418d1","publishDate":"2026-03-16T00:00:00Z","section":"posts","tags":["hackathon","ai","product-discovery","gemini","python","devpost"],"title":"Building Candor: AI-Powered Product Discovery at the Gemini Live Agent Challenge","type":"posts"},{"content":"A few months ago, I was introduced to spec-driven development with AI and Kiro. While I didn\u0026rsquo;t continue using Kiro, I kept using the technique because it helped guard against the challenges of working with AI at the time. I\u0026rsquo;d spend time building out a detailed spec requirements, edge cases, acceptance criteria; hand it to the model, and watch it produce something technically faithful to the document but somehow still wrong.\nSo I\u0026rsquo;d refine the spec. Add more detail. Go back and forth. Recently, I realized this is waterfall development on a tighter loop. I\u0026rsquo;d just rebuilt the waterfall inside my AI workflow without realizing it.\nThe Spec Problem Spec-driven development felt like the better way to work with AI. You think everything through upfront, write it down precisely, and let the model execute. It seemed more rigorous than just winging it with prompts.\nBut the spec creates a false ceiling. You\u0026rsquo;re front-loading all your thinking into a document that has to be correct before anything moves. The longer the spec, the more surface area for something to be subtly off. Instead of a short feedback loop, you\u0026rsquo;ve got a long one disguised as planning.\nThe worst part is that reading back through a spec to check it is its own cognitive tax. You\u0026rsquo;re not building anything; you\u0026rsquo;re auditing a document you or AI wrote.\nWhat Actually Works Better As the models have improved, I\u0026rsquo;ve found that precise articulation in the moment beats upfront specification. Not vague, but precise ones. There\u0026rsquo;s a difference. For example, a vague prompt like \u0026ldquo;Make this code faster\u0026rdquo; leaves the model guessing your intentions and priorities. In contrast, a precise prompt would be \u0026ldquo;Optimize this function to reduce its time complexity from O(n^2) to O(n), while keeping the output the same.\u0026rdquo; The latter is clear about what you want and why, which leads to much better results.\nThe format that best maps to how current models process intent is one most developers have encountered but rarely taken seriously: the user story.\nAs a [person], I want to [do something], so that [outcome].\nIt sounds almost insultingly simple. But that structure, actor, action, purpose is narrative. And narrative is the native format of language models. When you write in that shape, you\u0026rsquo;re not just describing a feature; you\u0026rsquo;re giving the model a perspective from which to reason.\nDevelopers Aren\u0026rsquo;t Always Users Here\u0026rsquo;s the uncomfortable part. A lot of developers are bad at this. Not because they can\u0026rsquo;t write, but because they\u0026rsquo;ve never had to inhabit the user\u0026rsquo;s perspective. You can be an excellent engineer and have very little intuition for how someone else experiences the thing you build.\nOpen source software is the most honest illustration of this. There are open-source projects that are technically extraordinary but practically unusable for anyone who didn\u0026rsquo;t build them. Commercial alternatives with a fraction of the technical depth dominate because someone on the team was thinking about the person on the other end.\nThat\u0026rsquo;s not a coding skills gap. It\u0026rsquo;s an empathy gap. And AI coding tools won\u0026rsquo;t cover for it, they\u0026rsquo;ll actually expose it faster.\nWho This Shift Favors If precise, user-centric articulation is now a core part of writing software, then product people have a significant natural advantage. They spend their days thinking about users, writing in a narrative style, and translating needs into requirements. That\u0026rsquo;s the exact muscle this demands.\nThis doesn\u0026rsquo;t make developers obsolete. The technical judgment about architecture, tradeoffs, and when the AI is confidently wrong still matters enormously. But the entry point to building is shifting. The person who can describe what a user actually needs, clearly and precisely, is more valuable in an AI-assisted workflow than they\u0026rsquo;ve ever been before. The good news is that developers can adapt to this shift. Building user-centric skills is a learnable process, whether through working alongside product people, practicing user story writing, or seeking direct feedback from real users. Collaborating more closely across roles makes teams stronger, and developers who embrace this perspective will be even more effective in an AI-first world.\nThe question for developers is whether that\u0026rsquo;s a threat or an invitation to grow.\nThe Practical Shift If I were to distill this into something actionable:\nStop thinking about what the system should do and start thinking about who is using it and why. Write that down first. Let the spec emerge from building rather than precede it.\nThe feedback loop gets shorter. The output gets closer to what you actually wanted. And you spend less time auditing documents and more time making decisions.\nThat, it turns out, is what agile was always supposed to feel like.","href":"https://ak33m.com/posts/dont-go-chasing-waterfalls/","kind":"page","lang":"en","lastmod":"2026-03-08T10:00:00-04:00","objectID":"3ef6de139a277f74b842290f27c5c1f7","publishDate":"2026-03-08T10:00:00-04:00","section":"posts","tags":["ai","agile","product-development","user-stories"],"title":"Don't Go Chasing Waterfalls","type":"posts"},{"content":"Event sourcing is an architectural pattern in which every change to an application\u0026rsquo;s state is recorded as a sequence of events (Fowler, 2005). Event sourcing is a companion architecture to domain-driven design, with events related to aggregate root entities within the domain. In domain-driven design, we model the domain by creating a ubiquitous language that captures its core concepts. Those objects are subject to certain actions, and it\u0026rsquo;s natural to think of these actions as events that have occurred. As an example, if you have an aggregate root \u0026ldquo;Order\u0026rdquo;, when the order is created, you may emit an event \u0026ldquo;order.created\u0026rdquo;. When the credit for the order is approved, you may have \u0026ldquo;order.approved\u0026rdquo;. When the order is shipped, \u0026ldquo;order.shipped\u0026rdquo; would be emitted and so on. What you end up with is an append-only log of all the things that are happening in the system.\nflowchart LR subgraph Command Side A[User Action] --\u003e B[Application] B --\u003e C[Publish Event] end subgraph Event Store C --\u003e D[(Append-Only Log)] D --\u003e E[order.created] D --\u003e F[order.approved] D --\u003e G[order.shipped] D --\u003e H[order.delivered] end subgraph Read Side / Projections D --\u003e I[Event Bus / Broker] I --\u003e J[Read Model / Snapshot] I --\u003e K[Activity Feed] I --\u003e L[Process Mining] I --\u003e M[Analytics] end In practice, these events are typically stored in an event store, which is a specialized database or a dedicated table in a relational database designed to persist events in sequence. Each event includes details such as a timestamp, type, payload, and a reference to the aggregate it affects. When a change occurs, the application code publishes a new event to the event store within a transaction. Other parts of the system can react to these events by subscribing to them, for example, using a message broker or an event bus to notify interested components that something has happened. This allows for decoupled processing and integration with other services.\nThis append-only log is useful in many ways. One of the most common uses I have for those events is troubleshooting. In non-event-sourced systems, the states are updated in line with the record in the database. Want to know if the order was approved before it was shipped? You have to assume that the code enforced that variant (you know what they say about assuming), or check the application logs, which may or may not have the details you\u0026rsquo;re looking for. With event sourcing, you can examine all the events related to an entity to see how it changed over time. Similar to how git log helps understand how code changes over time, the events related to an aggregate root provide similar clarity.\nNot only can you see the history of an entity, but you can also get a snapshot of an object\u0026rsquo;s state at a specific time. These snapshots can be created routinely to reduce the need to constantly replay millions of events, or on an as-needed basis. This is done by replaying the events up to a certain time and reducing them to obtain the aggregate root\u0026rsquo;s state at that time. This state could be projected onto a data store to make quick querying more feasible in an event-sourced system (querying the raw event store isn\u0026rsquo;t very practical). The ability to retrieve an entity\u0026rsquo;s state at a specific time can be useful for debugging. It is also useful when facilitating object versioning and rollback functionality. Rolling back an entity is simply reducing the events to the point in time you want to revert to, giving you a time-machine experience for your entities.\nIn addition to debugging, events can provide insights into who is using an application and how they use it. The most basic insights can be gained by exposing events in an activity feed that shows who did what in the application\u0026rsquo;s user interface (e.g., \u0026ldquo;Jane just approved Order ABC\u0026rdquo;).\nEvents can also be a source of high-quality data for process mining. Process mining aims to discover, monitor, and improve real business processes by extracting knowledge from event logs available in information systems (e.g., ERP, CRM). Rather than rely on \u0026ldquo;assumed\u0026rdquo; workflows, process mining uses actual data to reconstruct what is really happening. Process mining sits at the intersection of data science and process science and typically relies on data science techniques to gather data. (What is Process Mining?, 2021) With applications built on event sourcing, you would rely less on ETL techniques, as you would have access to high-fidelity data to support process analysis.\nTo give a concrete example, consider an e-commerce company using event sourcing for its order fulfillment process. Every time an order is placed, approved, packaged, shipped, and delivered, a corresponding event is appended to the event store. When the company wants to analyze its order delivery process, process mining tools can directly access these events to map out the actual flows and timelines of orders. This approach can reveal steps that often cause delays, such as repeated packaging attempts or shipping bottlenecks. By having this granular, reliable event data at hand, the company can identify unexpected inefficiencies and focus its efforts on the areas most in need of improvement, leading to faster and more consistent order deliveries.\nThere are some challenges working with events. One challenge is the high volume of data generated by events. Each aggregate root instance can generate 10s or hundreds of events (depending on how you model the actions and how many of those actions occur during its lifetime). The volume of events can grow quickly depending on your data model. To mitigate these events, there should be sparse updates with payloads that contain only the data relevant to the update. Instead of storing the entity\u0026rsquo;s current state in each event update, store only the minimum data needed for that update. Additionally, the event should be projected using data stores optimized for reads to avoid frequent reads from the event store. The event store itself should be purpose-built to optimize for sequential reading and unstructured data (No SQL databases are great candidates for event stores)\nAnother challenge is that having events serve as the canonical source of all updates to an entity makes complying with the GDPR\u0026rsquo;s \u0026ldquo;right to be forgotten\u0026rdquo; requirements more difficult. Unlike in a fully normalized database, where a reference to a user may be removed upon request, user information may be spread across many events and, conceptually, contradict the idea of an append-only event log. To mitigate this, each event row could be encrypted with a key specific to that row. If a request is to be removed, the key used to decrypt it will be disposed of. This still violates the event log\u0026rsquo;s immutability. Another approach is to isolate personally identifiable information (PII) from the event log and enrich the data with the personal information on demand.\nIn summary, event sourcing provides deeper visibility, traceability, and data-driven insights for modern applications. By treating every state change as a durable event, you can not only reconstruct and audit the lifecycle of any entity but also empower advanced analytics, process optimization, and user-facing transparency. While event sourcing introduces certain technical and compliance challenges, these can be addressed with thoughtful design and supporting technologies. Ultimately, event sourcing enables systems that are not only robust and resilient but also observable and ready to adapt to evolving business needs.","href":"https://ak33m.com/posts/event-sourcing-observability/","kind":"page","lang":"en","lastmod":"2026-02-22T10:00:00-04:00","objectID":"a0467127e957c7dfe03f509b16efbe1f","publishDate":"2026-02-22T10:00:00-04:00","section":"posts","tags":["event-sourcing","observability","domain-driven-design","architecture","process-mining"],"title":"I Was Blind, but Now I See. Event Sourcing and Observability","type":"posts"},{"content":"What a difference 3 years makes. In 2022, I wrote about running Wepala as an agency and celebrating 5 years of building amazing things. Now, in 2025, I find myself reflecting on the evolution of our business and the industry as a whole. Are we witnessing the end of the era of the agency? (TLDR; yes, at least for me.)\nOver the last few years, I\u0026rsquo;ve seen a significant shift in how businesses approach software development. AI has become a game changer in the industry, automating many tasks that were once done by humans. At Wepala, we embraced this change, leveraging GitHub Copilot and other AI tools to enhance our development process. This has allowed us to focus more on architecture and design while AI handles the more mundane tasks. Projects that used to take months can now be completed in weeks, with better code coverage and less technical debt.\nOn the other hand, macroeconomic factors have also played a role in shaping the industry. With companies sobering up from the pandemic hiring sprees and the subsequent layoffs, many agencies have had to adapt to a new reality. For Wepala, clients have reneged on contracts, and we\u0026rsquo;ve had to pivot our business model to focus more on product development rather than just agency work. With a glut of developers in the market and competitors using AI tools to spam clients, it\u0026rsquo;s become increasingly complex to stand out.\nI still believe in the power of product development and innovation. The key to success lies in building products that solve real problems and provide value to users. AI offers the opportunity to do just that. I love writing code, building systems, and creating products that make a difference. The challenges mentioned above affected how I go about it (I no longer have a team of developers to work with), but I still love it. I still want to create great products and work with great people without the tedium of running an agency.","href":"https://ak33m.com/posts/shop-getting-smaller/","kind":"page","lang":"en","lastmod":"2025-05-19T15:08:21-04:00","objectID":"ebc71df90819ead0247940a31b79d363","publishDate":"2025-05-19T15:08:21-04:00","section":"posts","tags":[],"title":"Shop Getting Smaller","type":"posts"},{"content":"With the rise of chatbots and voice assistants, there has been a lot of talk about the rise of conversational user interfaces (CUI). CUIs allow users to interact with a system using natural language. The most common CUIs are chatbots and voice assistants.\nCUIs are not new. They have been around for a long time. The first chatbot was created in 1966, and the first voice assistant was built in 1978.\nGraphical user interfaces (GUI) allow users to interact with a system using graphic elements such as buttons, menus, and icons.\n🔑 The First Principles of CUIs CUIs are a high-precision interface. This means that the user can be particular about what they want. CUIs require little to no training. The user can start using the interface immediately. CUIs require minimal cognitive load. The user can remember where things are and what to do. CUIs need little screen real estate. NLP has improved to the point where CUIs can be very precise and natural. 📖 Use Cases I think CUIs are great for:\nGetting work done on your mobile Getting information quickly Scenario 1 You\u0026rsquo;re headed to back-to-back meetings and need to get some information from your CRM. You can\u0026rsquo;t use your laptop because you\u0026rsquo;re on the go. You can use your phone, but the mobile app usually is a condensed version of the desktop app, and you can\u0026rsquo;t get the information you need.\nScenario 2 You\u0026rsquo;re headed to a meeting and need to present information on the company\u0026rsquo;s health. You need to get sales information, budgets, expenses, etc., to show models and forecasts to the rest of the team.\nWith a CUI, you can get precisely the information you need without wrangling or even being familiar with the different applications that contain the data.\n🎯 CUI Example APP While there are many other use cases, I think these two are common enough that we\u0026rsquo;ve been tackling them head on with WeOS.\nWe\u0026rsquo;ve been working on an app that can help you get information from your different applications that is as simple as sending a message on your phone.\nNeed to know the average order total? Just ask! Need to know what are the most important deals in your pipeline? Just ask! Need to know how much you spent on marketing last month? Just ask! 🤔 Things to consider While I\u0026rsquo;m very bullish on CUIs, GUIs are not going anywhere. There are some things that GUIs are better at.\nIt\u0026rsquo;s much faster to show a user dashboard with a lot of information than to have a user ask for each piece of information. GUIs are also great at letting a user know what they CAN and CANNOT do. With a CUI the user can suffer from the blank page problem where they have to guess what they can do. GUIs allows for more complex tasks with layered functionalities Conclusion CUIs are a natural progression from CLIs, to GUIs to CUIs. Work is becoming more mobile and distributed and CUIs are going to get more and more prevalent.\nI enjoy being able to get the information whenever and wherever I am because inspiration doesn\u0026rsquo;t only strike when I\u0026rsquo;m at my desk. Getting work done using devices that have smaller and smaller form factors (your phone, your watch, your glasses) is going to be the norm.\nAI has made it possible to build CUIs that are more precise and more natural. I\u0026rsquo;m excited to see what the future holds.","href":"https://ak33m.com/posts/cui-vs-gui/","kind":"page","lang":"en","lastmod":"2023-10-05T16:15:22-04:00","objectID":"f16d9177ca724c6b99859bb1cd8bb303","publishDate":"2023-10-05T16:15:22-04:00","section":"posts","tags":["ai","nlp","openai","chatbot","cui","ux"],"title":"CUI vs GUI","type":"posts"},{"content":"After reading Andressen Horowitz\u0026rsquo;s article on LLM Architecture I decided to look into Langchain. Langchain describes itself as a framework for developing applications powered by language models. I have been working with OpenAI for some time now\n❓Why I decided to look into Langchain I\u0026rsquo;ve been working with OpenAI for some time now and I was intrigued that there are already frameworks for building applications powered by language models. One of the problems I\u0026rsquo;ve been working on is effectively testing and iterating models and I hoped that Langchain would help with that. We\u0026rsquo;re putting our models in production and we want to improve the performance of our models. I am anticpating increased complexity and I expected langchain to provide an opinionated way to manage that complexity. 🔗 Langchain as a framework Langchain seems to have 2/3 languages they support; javascript/typescript and python. I looked at the python version because I prefer to use python over javascript for data science stuff. Right now we use a mix of Go and Python but I was open to switching to python if it made sense.\n🔑 What I did I setup a fastAPI project and made an endpoint for a simple question answering model. I setup a langchain project and tried to use the components to make a simple question answering model. I integrated it with our existing WeOS chat app to see how it would work in production. I setup an Agent I used some of the tools and toolkits 👍 What I liked Setup was easy The documentation was good with clear examples. The different components were well explained and I was able to get a good understanding of the framework There are a lot of people using langchain so you will find articles to help you along the way The framework and examples give you ideas of how you can structure your own prompts ( this example shows you how to make a custom agent but the example prompt is also useful) The design pattern of the framework is easy to use and you can really chain together different components to build your own implementation. It uses a MIT license so we would be able to use it in production I liked that it was LLM agnostic and you could mix and match 👎 What I didn\u0026rsquo;t like A lot of what I didn\u0026rsquo;t like is related to python not being my main programming language (I main Go) and the reasons for that\nIt was a bit confusing on whether to use a chain or an agent. I ended up making a chain and linking that to an agent The method signatures are similar between components but different enough that I had to keep looking at the documentation to see what I was doing wrong. It was really slow compared to our existing implementation. I\u0026rsquo;m not sure if this is because of the way I implemented it or if it\u0026rsquo;s because of the framework. It does mask some things (this is common with frameworks) and I had to dig into the code to see what was going on. I\u0026rsquo;m not sure if this is a good or bad thing. 🏁 Conclusion Langchain is a treasure trove of best practices that is extremely helpful. We\u0026rsquo;re pretty far along with our own AI implementaitons so switching from Go to python would be an investment and the speed concern is a blocker. We\u0026rsquo;ll most likely be taking the links from Langchain and using them in our own implementation. I would recommend Langchain to anyone who is starting out and looking to go from 0-100 really quickly.","href":"https://ak33m.com/posts/langchain/","kind":"page","lang":"en","lastmod":"2023-07-04T08:25:00-04:00","objectID":"19a4bc60baa5362a0550e2ee1627c1f3","publishDate":"2023-07-04T08:25:00-04:00","section":"posts","tags":["ai","openai"],"title":"To Langchain or not to Langchain","type":"posts"},{"content":"I started Wepala to create a company that would build amazing things. At a time when outsourcing work to Asia was the thing to do, I realized that the Caribbean was better positioned to deliver (no time or language barriers). I was pitching Nearshoring before there was a buzzword for it. Over the last five years, we\u0026rsquo;ve developed relationships with our clients as we built out minimal viable products (MVPs) for them and watched as they’ve found their place in the market. We\u0026rsquo;ve also been able to develop our products, and we\u0026rsquo;ve learned a tremendous amount along the way.\nPhoto by Clark Tibbs on Unsplash\nAs we look forward to another five years, I want to continue this hybrid agency model of not just executing one-off projects but helping our clients and their products evolve. We\u0026rsquo;ve formalized our processes and focussed on an iterative approach to product innovation and development. In just a week, we are able to build a functional prototype and validate new innovations with actual potential users. With a prototype in hand, entrepreneurs, CTOs, and CPOs can make decisions understanding what can work. An excellent example of this is the North Coast Jazz mobile app we created. We used the design sprint to brainstorm and validate with patrons what should be in a festival app, and two weeks after the design sprint, we had an app in the App Store and Play Store.\nAs an entrepreneur myself, I know the frustration of having something in your mind\u0026rsquo;s eye but not being able to see it come to fruition. Your idea may not always be a hit but not knowing is worse than failure. I\u0026rsquo;ve been most happy about being able to try a lot of the ideas that have come up with the team (including trying bitcoin mining). I believe everyone has great ideas, but it’s the execution that matters.","href":"https://ak33m.com/posts/running-d-shop/","kind":"page","lang":"en","lastmod":"2022-05-31T11:03:00-04:00","objectID":"f64c14f3266032ffebf8f514a428a7ce","publishDate":"2022-05-31T11:03:00-04:00","section":"posts","tags":["wepala"],"title":"5 Years of Running D Shop","type":"posts"},{"content":"Everyone has felt the impact of Covid-19, and the technology industry is no exception. In challenging times businesses have increasingly turned to technology to meet those challenges. To satisfy the increased demand for software, we need more developers. Major technology companies have complained for some time that there is a shortage of developers. As the founder of a small technology solutions company, I\u0026rsquo;d argue it\u0026rsquo;s a bit more nuanced that.\nWith Wepala, I want to allow developers to work on projects that they are interested in. Over the last five years, our strategy has been to engage university graduates, train them, and allow them to work on projects for international clients. Alongside client work, we\u0026rsquo;ve also been able to work on our own ideas, fulfilling the dream of working on things that we\u0026rsquo;re passionate about.\nI always tell developers that I don\u0026rsquo;t expect them to stay with us for the rest of their careers. When I look back on my own career, Wepala is the longest job I\u0026rsquo;ve ever had. I\u0026rsquo;ve been an employee, a contractor, and everything in between, and I would readily admit that my view of work has been shaped by the changing times and my own life experiences.\nWhat is an employee? In legal terms, \u0026ldquo;An employee is an individual who works under the supervision or control of an employer; a worker who is employed by an employer. An employee works in the service of the employer under an express or implied contract of hire that gives the employer the right to dictate the employee\u0026rsquo;s work duties.\u0026rdquo; The legal definition is subject to many different interpretations. At Wepala, employees are expected to meet specific technical performance standards, and they are expected to take on duties like helping train other developers, participate in brainstorms for projects that they are not working on, etc. Employees get mandated leave (i.e., public holidays) and various employment benefits (travel allowances, bonuses, etc.)\nA contractor, by contrast, is defined as \u0026ldquo;A legal category of worker that is distinct and different from an employee. The key to the definition is that, unlike employees, independent contractors retain control over how they do their work\u0026rdquo;. To what extent the contractor has control will depend on their industry and terms of engagement. If you want to be a successful contractor in the technology industry, you have to master being able to go into the project and quickly understand their way of doing things (retaining control over the how does not mean that you can simply write everything in Go). As a contractor, you have to figure out quickly how you add value to the project because it is much easier to make a change with contractors than with employees. The benefit for contractors is flexibility in the \u0026ldquo;how,\u0026rdquo; which can translate to flexibility in time, being able to fulfill multiple contracts at the same time, and using tools that you\u0026rsquo;re most comfortable with (mac vs. windows laptop).\nPhoto by Yasmina H on Unsplash\nWhich is better? Well, it depends on the individual and where they are on their \u0026ldquo;developer journey.\u0026rdquo; There were times in my own journey where my goals aligned with the company I worked for, and I was happy to be an employee. At other times in my journey, I wanted to simply lend my skills to someone else\u0026rsquo;s project and then get back to mine. Your life circumstances often dictate which type of \u0026ldquo;work\u0026rdquo; is best for you.\nCovid-19 has forced all companies to contemplate the nature of work. Large companies have been forced to accommodate remote work. Remote work has been on the rise for a number of years, but current circumstances have advanced the debate significantly. In many organizations, employees are demanding that they be allowed to work from home partially or indefinitely. Employees also want more control over when they execute their work. On the other hand, the same companies that once preferred to be in control of how their team did things are now looking further to get remote developers to get the job done. The desires of developers and the wants of the companies need not be in conflict with each other.\nRunning a small technology company, I\u0026rsquo;m caught in the middle. We\u0026rsquo;ve always structured compensation based on the \u0026ldquo;level\u0026rdquo; team member you are (e.g., Developer 1, Developer 2, etc.). Each level gets standard compensation, and compensation is not negotiated. The correctness of this could be debated, but it\u0026rsquo;s important to us because it ensures that everyone gets equal compensation regardless of sex or ethnicity. We can\u0026rsquo;t make the offers that major technology companies do, but I recognize each individual\u0026rsquo;s prerogative to do what is in their best interest.\nHow do we balance these concerns? Well, one thing we can do is give developers more options. We can ensure that we have developer desires aligned with the company\u0026rsquo;s wants. This means thinking about how we can give developers an opportunity to be a contractor to better fit their needs but continue to be fair and equal to all members of our team. I understand wanting to work extremely hard to secure a nest egg for a major life event or wanting to be able to take time off to watch World Cup (all things that I\u0026rsquo;ve done). Once you are able to execute and show results, this model benefits the company as well and can be accommodated.\nWe can also continue to optimize for discovering and nurturing developers that want to be part of Wepala ideas and culture. As a \u0026ldquo;startup,\u0026rdquo; we do need employees to help figure out things that we\u0026rsquo;ve not been able to. Innovation does require space to learn, make mistakes, and share, and that is what is provided to employees. We need to do a better job recognizing developers that are good candidates for employment and ensuring they get the resources for their continued success.\nI don\u0026rsquo;t have all the answers, but I do think solutions begin with understanding. If you are a developer and you are open to helping me understand the developer perspective or would like to be a member of the Wepala team, complete this questionnaire. My aim is to make Wepala a place where team members don\u0026rsquo;t have to choose between earning a good living and working on things that they are passionate about. I firmly believe in the power of the \u0026ldquo;and\u0026rdquo; as described in a book that I learned a lot from, \u0026ldquo;Built to Last.\u0026rdquo; Adjusting to the changing environment is one-way Wepala will continue to last.","href":"https://ak33m.com/posts/new-normal/","kind":"page","lang":"en","lastmod":"2021-09-14T08:05:53-04:00","objectID":"28a599f7cbb4743488bec015c9891ec2","publishDate":"2021-09-14T08:05:53-04:00","section":"posts","tags":["covid-19","wepala"],"title":"New Normal","type":"posts"},{"content":"So I\u0026rsquo;ve always had a hate-hate relationship with Magento (there never was love). Ours was a convenient relationship; I needed something to run an online bookstore we wanted to start, and all the other solutions we looked at didn\u0026rsquo;t fit the bill. We wanted to accept payments in Trinidad and Tobago dollars, something you don\u0026rsquo;t get easier with hosted solutions. We also wanted something that had broad support and a variety of templates. Let\u0026rsquo;s be frank; we settled for Magento.\nGetting setup with Magento was no work in the park. It took 3 developers a couple hundred hours to setup the instance just right. We tuned and hardened that install till we got it to run just how we wanted. We even wrote our own module to get the payments just how we wanted it. It was a learning experience, and one might have imagined we\u0026rsquo;d have learned our lesson.\nFast-forward two years, and we\u0026rsquo;re now looking at helping other businesses establish their online presence. Setting up something quick and offering a wide array of templates to choose from is still critical. We\u0026rsquo;ve been approached to help folks set up their e-commerce presence, and a quote to build a bespoke system is eye-watering. The challenge for us is how do we balance making something affordable while keeping the lights on? I had the bright idea to look at Magento again. In my defense, I was coming off the high of exorcising old PHP demons. I\u0026rsquo;d gotten this sweet setup using Docker, where I was practicing Test-Driven Development (TDD), doing Domain Driven Design (DDD), and able to step through and debug code. If I could do it with Symfony, I could do it with Magento, right? (TLDR; NOPE! Magento is a piece of crap and this post is me throwing in the towel)\nDocker Using the same principles to get set up with Magento did help in the beginning. I set up Docker containers for my Magneto install (something we were unable to achieve in our first foray). The image for the webserver container looked something like this:\nFROM php:7.4-apache RUN pecl install xdebug-3.0.1 RUN docker-php-ext-enable xdebug RUN echo \u0026#34;xdebug.mode=debug\u0026#34; \u0026gt;\u0026gt; /usr/local/etc/php/php.ini RUN apt-get update \u0026amp;\u0026amp; apt-get install -y \\ libfreetype6-dev \\ libjpeg62-turbo-dev \\ libpng-dev \\ git \\ zlib1g-dev \\ libzip-dev \\ unzip \\ libjpeg62-turbo-dev \\ libmcrypt-dev \\ libedit-dev \\ libedit2 \\ libxslt1-dev \\ libonig-dev \\ \u0026amp;\u0026amp; docker-php-ext-configure gd --with-freetype --with-jpeg\\ \u0026amp;\u0026amp; docker-php-ext-install -j$(nproc) gd \\ \u0026amp;\u0026amp; docker-php-ext-install zip \\ \u0026amp;\u0026amp; docker-php-ext-install mysqli \u0026amp;\u0026amp; docker-php-ext-enable mysqli \\ \u0026amp;\u0026amp; docker-php-ext-install pdo pdo_mysql \\ \u0026amp;\u0026amp; docker-php-ext-install opcache bcmath intl mbstring soap xsl sockets RUN a2enmod rewrite \u0026amp;\u0026amp; service apache2 restart RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer COPY ./composer.json /var/www/html/composer.json COPY ./bin /var/www/html/bin COPY ./app/bootstrap.php /var/www/html/app/bootstrap.php COPY ./auth.json /var/www/html/auth.json RUN composer install The Docker compose file that setup the other services used 3rd party images and looked like this:\nversion: \u0026#34;3.1\u0026#34; services: redis: image: redis:3.2 db: image: mysql:8 restart: always environment: - MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD - MYSQL_DATABASE=$MYSQL_DATABASE - MYSQL_USER=$MYSQL_USER - MYSQL_PASSWORD=$MYSQL_PASSWORD ports: - \u0026#34;3306:3306\u0026#34; testdb: image: mysql:8 restart: always environment: - MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD - MYSQL_DATABASE=$MYSQL_DATABASE - MYSQL_USER=$MYSQL_USER - MYSQL_PASSWORD=$MYSQL_PASSWORD ports: - \u0026#34;3307:3306\u0026#34; selenium: # hostname: selenium.magento2.docker image: \u0026#39;selenium/standalone-chrome:latest\u0026#39; ports: - 4444 environment: - JAVA_OPTS=-Dwebdriver.chrome.whitelistedIps= depends_on: webserver: condition: service_started webserver: build: . ports: - \u0026#34;6080:80\u0026#34; volumes: - /Users/\u0026lt;User Name\u0026gt;/PhpstormProjects/MyModule:/var/www/html/app/code/MyProject/MyModule - ./composer.json:/var/www/html/composer.json - ./dev:/var/www/html/dev - ./app/design:/var/www/html/app/design - ./app/etc:/var/www/html/app/etc - ./app/autoload.php:/var/www/html/app/autload.php - ./app/bootstrap.php:/var/www/html/app/bootstrap.php - ./pub:/var/www/html/pub environment: APACHE_DOCUMENT_ROOT: /var/www/html/public #change the line below with your IP address XDEBUG_CONFIG: remote_host=192.168.1.100 depends_on: - db - es01 - redis es01: image: elasticsearch:7.9.3 environment: - xpack.security.enabled=false - discovery.type=single-node - \u0026#34;ES_JAVA_OPTS=-Xms512m -Xmx512m\u0026#34; ports: - 9200:9200 - 9300:9300 Initially, I mounted the project root to the document root, but Docker on Mac performs terribly with PHP. There is an issue with the file system that disproportionately affects PHP projects because of the many files that get called on each request. The fix? Install composer in the image and install dependencies in the container. Of course, this move was not without consequences. I had to now be a bit more specific about what I was mounting. The Magento framework dependencies are not simply in the public packagaist repo but in Adobe\u0026rsquo;s own repo; so I had to get the credentials in the container in a way that I\u0026rsquo;m not proud of.\nWe are working on a module for Magento that is in its own repo. To get things in the right place I mounted the module to the app/code folder through Docker. I tried symlinks early on but that didn\u0026rsquo;t work (you have to do some configuring to get Magento to be happy with symlinks I believe)\nThe other problem I had with Magento and Docker is that the project requires a lot of memory. Magento 2.4 now requires Elasticsearch (damn it, Adobe) and it kept crashing during specific commands because the Elasticsearch container kept running out of memory. The fix for that issue was to set up a public Elasticsearch instance for myself and another developer to use (every step I took, I felt dirtier and dirtier).\nInstall The install was pretty easy, all things considered. I did have some issues at first landing the exact config I wanted, but once I got it (and documented it), I installed and re-installed it a few times. There is an issue doing an install with a app/etc/env.php already being there. Also, because of the Elasticsearch requirement the install would error out if the Elastichsearch container went down during the install (the memory hog that is PHP I had to run the command without memory limits).\nTDD It is possible to be test-driven with Magento. On the surface, it shouldn\u0026rsquo;t be too bad; there are examples of unit, functional and integration tests. The problem is the beast is so big that it\u0026rsquo;s tricky to wrap your hands around it. I got unit tests going but to be honest, unit tests weren\u0026rsquo;t really useful here because I had to mock so much and what we were working on didn\u0026rsquo;t really have much business logic to make the unit tests valuable. This meant I had to turn to integration tests. Integration tests was the straw that broke the camel\u0026rsquo;s back. After patiently wrangling things, hacks to get the commands to run in the container, I hit some weird error that it couldn\u0026rsquo;t instantiate an interface (of course you can\u0026rsquo;t and that\u0026rsquo;s usually indicative of something wrong with the dependency injection that should be fixed with a quick jump start using bin/magento setup:di:compile but no dice). Even if I got it running, it would have been after setting it to do a clean up after each test which guaranteed it would run like crap.\nI also had a look at setting up functional tests using the MFT framework and long story short that too was a waste of time. Got selenium etc setup but never got even the core tests running without issue.\nDDD Generally, Magento is built on DDD principles that should be helpful, but the abstractions are too much to bear. At some point, you have to commit to something. I hated it in Java, and it was sad to see the disease spread to PHP. I get it; Java developers started the Magento project but have we forgotten what to do when in Rome? I don\u0026rsquo;t like this implementation of Model View ViewModel (MVVM), or maybe I don\u0026rsquo;t like MVVM at all, I don\u0026rsquo;t know. I like that everything was a module and that modules have a standard structure, I disliked the module\u0026rsquo;s complexity.\nCommunity I wasn\u0026rsquo;t there for the early days of Magento but I suspect Adobe being involved hasn\u0026rsquo;t all been suitable for the project. Everything is Adobe branded, but I don\u0026rsquo;t get that it\u0026rsquo;s good for users (or their brand, frankly). The documentation that Adobe has put together just makes you go in circles. I don\u0026rsquo;t think the community pay off is there because modules for Magento community are not equal to the WordPress community. The themes tend to be very expensive compared to other platforms. It feels like everything they do is geared towards pushing you to their own cloud-hosted solution that is really expensive.\nThat said, I found some excellent resources that helped me move the football down the field, and I\u0026rsquo;m glad for that.\nConclusion This direction wasted a ton of my time and one of my developer\u0026rsquo;s time (this was the poor chap\u0026rsquo;s introduction to PHP). I really really wanted this to work but the amount of time spent getting set up to do \u0026ldquo;basic\u0026rdquo; things that we\u0026rsquo;re accustomed to is too much. Since picking up Go I\u0026rsquo;ve been really critical of PHP. I try not to be dogmatic, hell I recently changed my stance on Wordpress after looking at it again for an episode of LinkWe. That said I\u0026rsquo;m writing this post as a deterrent to future me or any other member of my team from bringing up Magento as a viable solution. It doesn\u0026rsquo;t make sense for us and we\u0026rsquo;d probably be better off writing applications ourselves in Go.\nI heart open source but projects like Magento scar developers. I think broadly, it\u0026rsquo;s interesting that so much projects are in PHP. I could understand the historical reason, but it\u0026rsquo;s time to move on, I guess. Not saying we are the ones to make the waves but based on how painful it has been to find suitable open source projects; it might be time for the Wepala team to double down (triple down) and start cranking out stuff that makes sense for us, our customers, and the wider community.","href":"https://ak33m.com/posts/its-over-magento/","kind":"page","lang":"en","lastmod":"2021-03-27T17:05:53-04:00","objectID":"cf61b3745e425c9843b8307301b09924","publishDate":"2021-03-27T17:05:53-04:00","section":"posts","tags":["php"],"title":"It's Over Magento!","type":"posts"},{"content":"I recently made an Augmented Reality Easter Egg Hunt app for my kids to play. It took me a week of part-time work to get it done (with some help on design and graphics). A big reason for getting something up so quickly was the ViroReact, a library for rapidly developing cross-platform AR/VR experiences.\nThe technologies used in the app include:\nReact Native - mobile development\nRedux - state management\nViro React\nGetting started with ViroReact was trivial based on the quick start. It\u0026rsquo;s the quick start that convinced me to try making the app in such a short space of time. The issue with the quick start is that it provides an example of code that runs within a sample app. Using the sample app, I quickly ran into problems when it came to customizing the experience, and the development workflow was a bit tedious. After wrangling with the example app for some time, I decided to work with a clean install of React Native.\nI installed the latest version of React Native (v0.62 at the time of this writing). I set up the basic screens, and then I began setting up ViroReact based on the instructions provided in the documentation. There is a diff of changes to follow as well but I found it necessary to make some tweaks based on issues encountered.\nTweaks You can see the full set of tweaks here\nI did NOT add the product flavors described to the build.gradle. It was messing up the build tools that React Native provides and I didn\u0026rsquo;t want that (the scripts expect InstallDebug target but setting up the product flavors changed the names of the target)\nBecause I didn\u0026rsquo;t setup the product flavors I used the constant for the platform I was building for in the MainApplication class (i.e. packages.add(new ReactViroPackage(ReactViroPackage.ViroPlatform.AR));)\nI used a version of the library that was patched (react-viro@npm:@iskander508/react-viro@0.61.2) to fix issues with versions of react \u0026gt; 0.59 (https://github.com/viromedia/viro/issues/756)\nPros Once I got the lib going, it did work as advertised, and it was easy to create objects\nAdding interactivity was a breeze\nIt has been open sourced (though it didn\u0026rsquo;t start that way).\nThe concepts of the library were straight forward and easy to understand\nCons Getting it set up in an existing project was not easy or well explained (hence this post)\nThe library uses a navigator as the base. This caused problems with the stack navigation I was trying to use and had the consequence of I couldn\u0026rsquo;t add elements to that screen that were not meant to be in the AR experience\nI noticed there was some importing of AWS SDKs to the source. They didn\u0026rsquo;t seem to affect things on android BUT the library tries to open something in the Amazon store (it repeatedly prompted on my daughter\u0026rsquo;s Fire tablet).\nAt times items that were placed seemed to drift\nIt was a learning experience for sure, and I\u0026rsquo;ve put the code on GitHub for others to explore further. The biggest issue is that the placement of the eggs is not consistent. The kids love it, but it\u0026rsquo;s something I\u0026rsquo;d like to fix. The problem could lie with my approach, so I won\u0026rsquo;t hold this against ViroReact. I\u0026rsquo;d also like to improve usability by giving more feedback and I\u0026rsquo;d like to make it multiplayer as originally planned.","href":"https://ak33m.com/posts/viro-react/","kind":"page","lang":"en","lastmod":"2020-04-13T15:57:22-04:00","objectID":"7753c127f7ae5c53448455980abe0270","publishDate":"2020-04-13T15:57:22-04:00","section":"posts","tags":["react","react-native","android"],"title":"Viro React","type":"posts"},{"content":"It\u0026rsquo;s Easter, and my family and I usually host an Easter Egg Hunt for the kids. Currently, because of COVID-19 strict social distancing guidelines are being followed, and we plan to have a small hunt with our kids this year. On Saturday (April 4th), I thought it would be a great idea to create an Augmented Reality Easter Egg Hunt where a \u0026ldquo;bunny\u0026rdquo; would place eggs using the app, and participants can find the eggs using the app.\nA few days before Easter Sunday, and here is the first release! You can download the apk. I\u0026rsquo;m also trying to put in the play store but not sure it will be approved in time (it being Easter and all :) ). I\u0026rsquo;d love to get feedback on what works and what doesn\u0026rsquo;t. I\u0026rsquo;d also like to hear what folks would like to see next.\nBelow are some of the features I planned. The crossed-out items are those that didn\u0026rsquo;t make the initial release\nBunny Hiding eggs in an Augmented Reality World The ability to choose eggs to hide from a list (basket ?) Create and/or source new egg designs Invite participants Track the progress of the hunt Declare a winner! Egg Hunter Join an egg hunt using an invite code Setup an account Find eggs in an Augmented Reality World View the progress of the hunt See egg details We worked on it in a very limited space of time (5 days), but we were able to learn a lot along the way. I am pleased to say that we got something completed, and I\u0026rsquo;ll be sharing some of those learnings in future posts. I didn\u0026rsquo;t do all the work myself; Simon Sankar helped with the design, Kevin Christopher helped out with on the home stretch with some of the fine tunings. The rest of Wepala helped test, gave feedback, and added to the list of ideas.","href":"https://ak33m.com/posts/easter-egg-hunt/","kind":"page","lang":"en","lastmod":"2020-04-10T09:08:21-04:00","objectID":"e2cc4b523a4aac0a3a1a4d4c2dd5a254","publishDate":"2020-04-10T09:08:21-04:00","section":"posts","tags":["react","react-native","android","covid-19"],"title":"Easter Egg Hunt","type":"posts"},{"content":"unsplash-logoMarvin Meyer\nToday I was doing a bit of research to understand what people are searching for when they look for help with technology online. The usual terms that came up include CRM, social media, and e-commerce. There was one term that sparked an interest more than the others, and that term was Information Technology or IT.\nInstinctively as a software developer, I\u0026rsquo;ve shunned the phrase IT as a way to describe what I do. The expression is ubiquitous in Trinidad and Tobago, along with its cousin Information and Communications Technology (ICT). John Daintith defined Information Technology (IT) as the use of computers to store, retrieve, transmit, and manipulate data or information. This definition seems to speak to the media more than it does the data itself. Saying you\u0026rsquo;re in IT conjures up thoughts of setting up networks and fixing the printer.\nA contemporary approach to IT means going beyond the physical devices and considering the social, organizational, and intellectual properties that make up the system. What we do with the information is now more important than how we transmit it. The types of business that leverage technology has changed considerably as well. While large enterprises continue to invest in technology, medium, and small businesses now appreciate the value technology adds to what they are trying to do. Setting up a website or Facebook page is accessible to any entrepreneur. Being bombarded by requests and having to keep the online presence up to date brings new challenges.\nI\u0026rsquo;ve always believed that everyone has great ideas. Technology is a resource for helping people make their ideas real, and I\u0026rsquo;ve been passionate about making technology accessible to everyone and not just those in the know. When asked what we do at Wepala, I usually say that we build technology solutions that range from websites, mobile apps to bespoke systems. What I should be saying is that we\u0026rsquo;re in IT. Our job is to make it easy for businesses to gather, store, and use information to bring value to the market. Over the years, we\u0026rsquo;ve built content management systems, e-commerce solutions, social media tools, etc., to help enable the workflows of our clients. In a lot of cases, our team acts as the technology team (IT department?) for companies. In short, we make technology approachable and accessible, and that\u0026rsquo;s what IT is all about.\nWe\u0026rsquo;ve been working hard at ways to make the tools needed by companies and entrepreneurs easier and cheaper to implement. We\u0026rsquo;ve been discussing how to make open-source software commercially viable without losing the essence of open-source, among other things. I\u0026rsquo;d love to get perspective on what are some of the IT needs that people have (that go beyond setting up printers :) ) so that we can figure out ways that we can help.","href":"https://ak33m.com/posts/we-in-it-to-win/","kind":"page","lang":"en","lastmod":"2020-04-03T13:08:21-04:00","objectID":"cdd8e8531df660b8583a23fc93970896","publishDate":"2020-04-03T13:08:21-04:00","section":"posts","tags":["IT"],"title":"We're in IT to win","type":"posts"},{"content":"Let me start off by saying that I\u0026rsquo;m a long time Mint user (9 years) and I always rave how using Mint changed my life. This was back when I had no budgeting system in place and I was desperate to get visibility into what was going on in my finances. By simply being able to see where my money was going I was able to make significant life decisions that I am proud of.\nI\u0026rsquo;ve since matured a bit more and my budgeting needs have changed. I still want to be able to see what\u0026rsquo;s going on with my finances but I also want to better plan for the medium and long term, and Mint isn\u0026rsquo;t very good for that. I am not a finance expert and the tips below are based on my own trials.\nTLDR; For visibility into my finances across all my accounts (which span countries and different currencies) - Wallet App For financial goal planning I use a spreadsheet to plan each month in detail To figure out what is the best use of money (should I invest more or pay to principal on the mortgage?), I use an amoritization calculator to analyze the annual savings if I pay off my mortgage and compare the return on investment of comparable amount using a Return on Investment Calculator Save for the future (college, retirement etc) by creating a macro plan for the different stages of retirement (resource still being worked on) Visibility into finances Because my family and I split time between the Caribbean and the US, our finances are split between the two. On the US side most budgeting tools keep pace, they over syncing etc but on the Caribbean side the banks are a lot less technologically advanced so syncing is not even available.\nVisibility of finances also meant being able to understand what our balance and spending power was, taking into account credit card balances etc. With Mint I felt I never got a true sense of how income was spent because of what I felt was double counting of credit card payments (it should be a transfer between accounts but Mint never got that quite right).\nLastly the issue of currency conversion was lost in translation because I couldn\u0026rsquo;t import the info from the Caribbean accounts.\nThe solve this issue I initially planned to leverage double entry accounting principles. For the uninitiated double entry accounting is where every transaction is recorded as two parts where 1 account is debited and another corresponding account is credited. This seems tedious (especially if it\u0026rsquo;s being done manually) but it addresses a number of scenarios encountered when managing accounts including transferring between accounts, positive balances vs negative balances. After some research I saw that many developers before me come to a similar conclusion though the projects they started have stalled for the most part.\nA co-worker recommended the Wallet App for budgeting and I wrote this article that describes how I set that up. This app has been a huge help in visualizing the flow of income as well as keep track of the spending targets that I\u0026rsquo;ve setup.\nFinancial Goals A lot of people have this notion that good budgeting and being financially responsible is stashing money away and spending as little as possible. I\u0026rsquo;ve always readily acknowledged those methods are not for me. I feel like assets are to be used whether it\u0026rsquo;s to create new opportunities or leveraged in some way. Having huge accumulation of savings isn\u0026rsquo;t the best thing.\nWhen people set financial goals they set this lovely target, \u0026ldquo;I need to save $2000 to go to Europe in 6 months\u0026rdquo;. Then they begin Netflix and chilling, and cutting out expenses deemed unnecessary. The thing is for you to go to Europe in 6 months, you have to buy tickets, the value of which might go up by the time you save the entire sum. Also where are you stashing the money you saved? Are you putting it in a special account? You must put in somewhere safe how else do you not spend it?\nTo solve this issue I used a spreadsheet to plan my future spending in greater detail. Similar to cash flow projections I laid out all my income, recurring expenses as well as one time expenses. Each month the ending balance is carried over. You can see my template here\nThe advantages of this approach are :\nNot all goals require a lump some catch. With this method instead of saving a lump sum as a goal you simply put what you\u0026rsquo;d like to purchase in the correct month. Then you have the option to adjust you expenditure in prior months to ensure you have a balance to cover the purchase. This might mean making some short terms adjustments or stashing some cash the old fashion way. It\u0026rsquo;s more forgiving. If you spend more than you should in one category it\u0026rsquo;s not a big deal once your ending balance is in the range you need for planned in order to meet you goals Easier to identify \u0026ldquo;extra\u0026rdquo; cash. In my first pass I added a category for paying to my mortgage principal but left it empty. When I finished filling out my income and expenses I used the ending balance at the end of the year to determine how much I could afford to dedicate to prepaying the mortgage. It\u0026rsquo;s easier to identify good spending goals. In my first pass it was obvious that we were living month to month. The starting balance for the month was not enough to cover that month\u0026rsquo;s expenses. One of our first goals was to get to 1 month liquidity. We also quickly noticed that a big part of the low ending balance was the amount we pay in mortgage. Best Way To Invest Over the years I\u0026rsquo;ve invested mainly in stocks and the returns have been good. That said I don\u0026rsquo;t always have the time to do all the research needed to keep my portfolio in good shape. I\u0026rsquo;m also cognizant of the need to diversify my portfolio. Diversification is tricky because it\u0026rsquo;s not very straight forward to compare the return on different types of investment. Do you buy stocks? Do you pay of the mortgage?\nTo get a handle on what was going on with the mortgage, I created a spreadsheet that outlined the amoritization schedule. You can also use this calculator to get the same info.\nThe next step was to apply the additional payments. Using the calculator put in one future payment and see the net effect over the years. Use the reduction of the interest payments to calculate the savings in interest payments. You can now use savings amount to compare the return on invest of the same amount. To calculate the the potential return on an investment I used an investment calculator that accounts for inflation, and taxes. It should be noted that investment capital depreciates over time because of inflation, though home equity can improve over time if the home appreciates. You can factor this into your decision as well.\nIn my case my planned pre-payment yielded interest savings (7.2%) that was comparable to an investment with 9% yield over the same period. Even if I looked at an investment vehicle that yielded 7.2% that was tax free it still makes sense to pay off the mortgage because of appreciation of the home vs the depreciation of the investment capital because of inflation.\nSave For The Future Figuring out the right mix of savings and investment is an important first step in planning for the future. The next step is getting into the specifics. My plan here is to make a wealth projection sheet similar to the one I use for setting my financial goals; this version of the sheet will be based on years instead of months. This sheet will also take into account ALL balances including the investment account, 401K, mortgage balance etc. The idea is to have a macro plan for what needs to happen leading up to retirement as well as post retirement.\nConclusion Getting a handle on your finances might seem daunting at first but these practical tips can help anyone get a better understanding of what is going on and what needs to be done.","href":"https://ak33m.com/posts/intermediate-budgeting/","kind":"page","lang":"en","lastmod":"2018-08-26T13:08:21-04:00","objectID":"22375fb5c32f94d0cbc1852bff58f9a7","publishDate":"2018-08-26T13:08:21-04:00","section":"posts","tags":["finance"],"title":"Intermediate Budgeting","type":"posts"},{"content":"Wallet budget bakers image The Wallet App (BudgetBakers) is a great app for those who want more granular control of their finance tracking.\nPros You can import records manually. This means if your bank is not supported in the account linking no worries The CSV import in particular works pretty well. It allows you to map columns etc Wallet allows for managing accounts with different currencies. Wallet is mobile first. There have been many times that I\u0026rsquo;ve been outside and I remember a category I want to create and it\u0026rsquo;s great that I can do it from the mobile app app You get stats on a specific account Most features are available for free Cons Wallet treats credit card accounts like an asset account Wallet doesn\u0026rsquo;t allow for detailed future budgeting (you can only do the standard goal setting) Tips Do NOT connect to your bank account. The issue with the bank sync is that it only goes back to 2 months prior for some bank accounts and you can\u0026rsquo;t manually add records to those account. Future tips assume that all accounts were created manually Before importing the bank records be sure to set the starting balance to the balance at the start of the import period Use the website to do CSV imports. I find it easier to do imports on the computer instread of the mobile app For credit card accounts (or any other liability account) the starting balance should be a negative number (or 0). If you don\u0026rsquo;t do this Wallet will recognize the balance as positive. Ensure that money moved between your accounts are marked as transfers. E.g a credit card payment should be marked as a transfer between your asset account (e.g. checking) to the credit card. This helps avoid the credit card payment from showing up as income. By accurately marking transfers, the charts provided will be accurate. You don\u0026rsquo;t want money transferred from another account showing up as \u0026ldquo;income\u0026rdquo;. When you do imports you should confirm the balance for that account in the app matches the account\u0026rsquo;s official statement. If it doesn\u0026rsquo;t then something went wrong somewhere along the line. There can many many reasons why an import could go wrong but some that I\u0026rsquo;ve encountered include the impot seemingly being too large , issue with the export that was too large, incorrect starting balance If there is something wrong with the import you can delete the import (and the records that was added from the import). This granular control makes Wallet viable Use a spreadsheet to plan future budget in detail and set the budgets in Wallet\u0026rsquo;s budget section so that you can get alerts. I created a basic spreadsheet found here than can help.","href":"https://ak33m.com/posts/budgetbakers-gettingstarted/","kind":"page","lang":"en","lastmod":"2018-08-19T13:08:21-04:00","objectID":"955abdecadabfab19fc7a96d57699dcd","publishDate":"2018-08-19T13:08:21-04:00","section":"posts","tags":["finance"],"title":"Budget Baker (Wallet App) Getting Started","type":"posts"},{"content":"Hello World!(again). I used to be a semi-active blogger many years ago when I was a Flash developer. Like most folks back then (and even now) I used Wordpress. My blog was more of a note to self but it was relatively popular because of the news aggregator the Flash community used. (Un)like most folks I didn\u0026rsquo;t keep the software up to date and paid the price. At the time I simply took down the site and figured I\u0026rsquo;d back up the content at some point. Alas that never happened and I toasted the server having never backed up my content.\nSo much has happened since then and there have been a lot of things I wanted to blog about. In the interim I tried posting on LinkedIn, writing (never publishing) things on Medium or simply writing my thoughts in a notebook. I didn\u0026rsquo;t like LinkedIn because it\u0026rsquo;s not open, I don\u0026rsquo;t go in LinkedIn as often and it just never really caught on. I read a lot of content on Medium but using it as a content platform didn\u0026rsquo;t work. I didn\u0026rsquo;t like the idea of my notes \u0026ldquo;trapped\u0026rdquo; in Medium and I write for myself anyway not the likes.\nFast forward a whole lot and I started thinking about blogging again because of the revamp of the company website. The Wepala team has grown and we\u0026rsquo;ve had the opportunity to work on great projects (WFC for the win!) so why not share? This time around, I figured I\u0026rsquo;d choose my platform carefully. Things that I kept in mind:\nI don\u0026rsquo;t like the idea of my content being \u0026ldquo;stuck\u0026rdquo; on a site I wanted a platform that makes it easy to republish across LinkedIn, Medium etc I know I write long posts I get ideas for posts at odd times so posting in a specific platform was a major reason why I didn\u0026rsquo;t blog as often as I could I didn\u0026rsquo;t want to lose my content like the last time One of our team members Marcus mentioned that he uses a static generator site. I looked into it and I really liked the idea of the blog just being a simple static site. I settled on Hugo since it promises to be fast, it seemed easy enough to setup and use, and I\u0026rsquo;ve been learning Golang so I figured I can modify things if I need to.\nPros (so far): Very easy to install I really like being able to check my site into a repo (i.e. content is backed up!) Being able to easily run the blog on my local means I can write posts without having an internet connection I like the ease of writing in an editor of my choosing (vs a web RTE ) Templates are easy to find and install Cons (so far) Figuring out how to create a static page that used the variables available to templates was harder that I thought it would be. After some searching and disappointment I realized I could create the page as a content and give it a type and specify a layout without there being an archetype The templating hierarchy can get complicated pretty quickly. Synopsis I really like it generally. We\u0026rsquo;re probably going to use this for the company website and a few other sites we are currently working on. I\u0026rsquo;m already thinking of ways we can add a few things to make it a bit more user friendly so we can use this on client projects (maybe a desktop app that makes it easy to clone hugo sites, run hugo etc). I\u0026rsquo;m also going to get content from my old website in here via the Wayback machine so that things will not be so bare\u0026hellip;","href":"https://ak33m.com/posts/hello-world/","kind":"page","lang":"en","lastmod":"2018-03-03T10:07:39-04:00","objectID":"e2aee69cf0508da721fcf1b13ccf2888","publishDate":"2018-03-03T10:07:39-04:00","section":"posts","tags":["hugo","golang"],"title":"Hello World","type":"posts"}]