Product team reviewing printed user flows together around a work table in a Boston studio at dusk

Working notes

Notes on building software products

These are our working notes on product strategy, design, engineering, and AI integration, written for people making decisions about software rather than for search rankings. Topics come from questions clients actually ask. If one of these is close to your situation, it is a decent starting point for a conversation.

What these notes are for

We write about the decisions that keep clients up at night, not the ones that look tidy in a deck. Scroll to a topic, or jump straight to the chapter that matches your project.

Choosing between a product consultancy and a general agency

The split comes down to where the ambiguity sits in your project. A well-specified build is a delivery problem; an unclear product direction is a discovery problem. Consultancies are usually more useful earlier, when the question is what to build. Sort that out first and the rest of the selection gets easier.

In practice we ask two things in the first conversation: can you describe the product in a single sentence a stranger would understand, and can you name the first slice you would ship? If both come easily, an agency that executes against your spec may serve you well. If either answer needs work, that work is the project's real first phase, and it belongs with a team that does discovery before delivery.

Rails, Hotwire, or a JavaScript stack

Rails tends to be right when a small team needs to ship a working product and the value is in domain logic. Hotwire has reduced the number of apps that genuinely need a separate front end. A JavaScript-heavy stack still makes sense when the interface itself is the complex part, or when your team already works there. The stack should follow those two questions, not a trend.

Two questions decide it more often than any benchmark: where does the product's difficulty live, and where does your team already have depth? A stack your engineers can extend on a Tuesday afternoon beats one that looks stronger in a conference talk. When you hire us to build, we plan the handover from the first sprint, because a working product you can maintain is the point of building it.

Engineer working through a web application at a standing desk in a brick studio, screens softly out of focus
Designer and mobile engineer reviewing a phone screen together on a sofa, printed screen drafts taped to the wall behind them

Is React Native still a good default for mobile?

For many new products, yes. It fits a shared core experience released to both stores by one team. Native is the better answer when you depend on platform-specific capability or want maximum performance on a single platform. The debate is worth having with real screens and real user flows on the table.

A practical way to decide: list the screens you plan to build in the first year and mark the ones that rely on platform-native features like deep device integration, background processing, or intensive rendering. If that list is short, a shared codebase will get you to both stores faster. If it is long, or if your team already has native engineers, the single-platform route often earns its cost.

What an AI integration project really includes

Beyond the chat interface, four things usually matter: connecting the model to your data, designing the experience around it, handling wrong or uncertain output, and deciding where a human reviews the result. Summarization and internal search tend to produce value before open-ended assistants do. The model choice is rarely the hard part.

We usually start with a small, high-signal problem, measure whether the output is trustworthy enough to act on, and only then widen the scope. That keeps a wrong answer from surprising your customers, and your team from carrying a rollout they cannot yet judge.

  • 01 · Grounding

    Connecting the model to your own data, documents, and internal tools so answers are about your business, not the internet at large.

  • 02 · Experience

    Designing where AI lives in the product, how much it does, and how a person can override it without losing their work.

  • 03 · Uncertainty

    Handling wrong, thin, or uncertain output, and writing the rules for when the assistant should say it does not know.

  • 04 · Review

    Deciding where a human reviews the result before it reaches a customer, a payment, or a regulated record.

Why payment flows deserve design attention

Stripe makes the integration straightforward; the product decisions around it are the hard part. Failed payments, upgrades mid-cycle, and refund paths affect revenue more than the checkout screen most teams obsess over. Treat them as core flows and review them with design and engineering in the same room.

Before a payment feature ships we walk the failure paths out loud: what the customer sees when a card is declined, what happens to access on a plan change, and how a support agent resolves a refund without writing to three systems. Those conversations usually change the design before any code is written.

Headless CMS or a simpler platform

If your content team will publish independently and the site will keep growing, a headless CMS earns its cost. For a small site that changes twice a year, it is infrastructure you will maintain for no reason. The honest answer depends on what the content operation looks like in a year, not on the launch.

The question we ask is who edits what, and how often. A marketing team running campaigns across multiple channels usually wants the headless route, because it can reuse content without an engineer in the loop. A company that updates a brochure site a few times a year is better served by something an editor can handle without a deploy. Getting that judgment right early saves a rebuild later.

Legacy modernization without a rewrite

Full rewrites fail often enough to treat them as a last resort. The more reliable path is to move high-value workflows off the old system in stages, keeping the business running throughout. It is slower to start and faster to finish, and it keeps the old system doing only what it is still good at.

  1. Map the flows

    Name the workflows that carry the revenue and the ones that only exist because nobody retired them. That list is the order of work.

  2. Separate safely

    Put a seam where modern code can read and write the old data without duplicating business rules in two places.

  3. Move one slice

    Rebuild the highest-value workflow first, ship it behind the seam, and prove it in production before the next slice begins.

  4. Retire the rest

    Shrink the old system to what it is still good at, then schedule its decommission once its last workflow has a home.

Design systems and the cost of inconsistency

A design system pays off when it removes decisions. Built poorly, it adds review cycles and arguments about naming. The useful version is tied to real components, documented where your team already works, and updated as the product changes. Measure it by whether new screens ship without a design debate.

A good signal is the first week a new engineer ships a screen without asking which button to use. If they still need to ask, the system is described in a document instead of living in the code.

Physical interface component sheet, swatch cards and a ruler laid out on a desk under side light

What GitHub's AI assistance changed in daily engineering

AI coding tools have compressed the routine parts of engineering: boilerplate, small refactors, test scaffolding. What has not changed is review discipline. Code still goes through pull requests and CI/CD, and someone still has to decide whether the change is right. The tooling shifts where time goes; it does not remove the need for judgment.

Planning tools get better when they do less

Comparisons between trackers are really arguments about workflow. A lightweight tool like Linear suits a team that wants speed and will tolerate less configuration. Jira suits organizations that need process and reporting. Picking the tool before deciding how you work is the reliable way to end up with both problems.

Empty meeting table by tall Boston studio windows at dusk with a faintly marked whiteboard in the background

If one of these sounds like your situation, bring it to a conversation

We work with teams in Boston and across the United States on product strategy, web and mobile engineering, custom software, AI integration, and UX/UI design. Our hours are Monday through Friday, 9:00 AM to 6:00 PM. Reach out with the problem you are trying to solve, and we will tell you whether the notes above match what we would do next.