<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>AL+ Thoughts</title>
  <subtitle>Things we have learned by building, inheriting, repairing, and maintaining software.</subtitle>
  <link href="https://alplustech.com/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://alplustech.com/thoughts/" rel="alternate" type="text/html"/>
  <id>https://alplustech.com/</id>
  <updated>2026-10-12T00:00:00.000Z</updated>
  <author><name>AL+</name><email>paul@alplustech.com</email></author>
  <rights>©  Alplus Technologies S.R.L.</rights>
  <entry>
    <title>Software development outsourcing: decide who owns delivery</title>
    <link href="https://alplustech.com/thoughts/software-development-outsourcing/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/software-development-outsourcing/</id>
    <published>2026-10-12T00:00:00.000Z</published>
    <updated>2026-10-12T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>Choose what to outsource, compare development partners, and use a responsibility worksheet to agree acceptance, access, support, and exit before work starts.</summary>
    <content type="html"><![CDATA[<p>Software development outsourcing means hiring an external developer or company to do some or all of the engineering work. It can make sense when you need delivery capacity or skills you do not have internally. Before choosing a provider, decide whether you need people to join a team you already manage or a partner to take responsibility for a defined piece of software.</p>
<p>Keep a named person in your business responsible for priorities and accepting the result. An external team can design, build, and operate software, but it still needs decisions about your users and business rules. If nobody can make those decisions, adding developers will not resolve the problem.</p>
<h2>Decide what responsibility you are buying</h2>
<p>Provider labels differ. Ask who performs each job and who can approve the result rather than assuming a “dedicated team” includes everything you need.</p>
<p>On a narrow screen, scroll the table sideways to read all columns.</p>
<table>
<thead>
<tr>
<th>What you need</th>
<th>What the external provider does</th>
<th>What you must arrange internally</th>
</tr>
</thead>
<tbody>
<tr>
<td>Additional engineering capacity</td>
<td>Works on tasks within your existing delivery process.</td>
<td>Technical direction, task readiness, review, release, and product decisions.</td>
</tr>
<tr>
<td>Delivery of a bounded project</td>
<td>Coordinates the agreed design, implementation, testing, and release work.</td>
<td>A decision-maker, access to relevant users, acceptance criteria, and timely answers.</td>
</tr>
<tr>
<td>Continued ownership of an existing system</td>
<td>Takes on explicitly agreed maintenance and development responsibilities.</td>
<td>Business priorities, approval limits, and an agreed route for support and incidents.</td>
</tr>
</tbody>
</table>
<p>These are practical distinctions, not standardized packages. A project provider may exclude hosting or support. A maintenance provider may exclude new development. Record those boundaries before comparing proposals.</p>
<p>If your main problem is a lack of internal engineering leadership, buying individual developers leaves that gap open. Ask explicitly whether the engagement includes technical direction and coordination. If you already have those functions, extra implementation capacity may be enough.</p>
<h2>Check whether outsourcing is the right next step</h2>
<p>An external partner is worth considering when you can describe a useful outcome, appoint someone to make decisions, and provide the access or information needed to deliver it. For example, you may have a known operational bottleneck but lack the engineers to build the solution.</p>
<p>Pause the build when the larger uncertainty is whether people need the product, whether an existing tool can do the job, or whether a required integration is possible. Resolve the uncertainty first. Our <a href="/thoughts/mvp-vs-prototype/">MVP versus prototype guide</a> explains how to choose a smaller experiment before commissioning a working product.</p>
<p>Do not assume outsourcing will be cheaper. Compare the whole proposed engagement: discovery, implementation, your team's review time, integrations, release, running costs, and work after launch. A lower hourly rate cannot tell you how much work is included or whether two proposals promise the same result.</p>
<h2>Use a responsibility worksheet before selecting a provider</h2>
<p>For each item below, write four things: <strong>the provider's job, your business's job, the evidence you will review, and what is excluded</strong>. An unanswered item is a question to resolve, not an implied commitment.</p>
<ol>
<li><strong>Priorities and decisions.</strong> Name the person who can approve scope and resolve conflicting requirements. Agree where questions and decisions are recorded, including how blocked work is handled.</li>
<li><strong>Implementation and review.</strong> Identify who designs the solution, writes the code, reviews changes, and maintains the tests. Ask how you will see working progress and which people will actually do the work.</li>
<li><strong>Acceptance.</strong> Define the behavior a user must be able to complete, including important errors and access restrictions. Record who reviews it and how defects, changed requirements, and incomplete work are distinguished.</li>
<li><strong>Accounts and access.</strong> List who controls the code repository, hosting, domain, data, and external services. Specify the access the provider needs and how it is removed when no longer needed.</li>
<li><strong>Release and recovery.</strong> Assign deployment, monitoring, backups where required, and recovery from a failed change. Name the evidence that shows the relevant procedure works; a document alone may not be enough.</li>
<li><strong>Work after launch.</strong> Agree who receives problems, who investigates them, what availability is included, and how additional work is approved. Do not assume a development engagement includes continuous incident response.</li>
<li><strong>Exit and continuity.</strong> Specify the documentation, account access, open-issue list, and knowledge transfer another engineer would need. Agree when these are delivered, not just that a handover exists.</li>
</ol>
<p>The <a href="https://www.gov.uk/service-manual/the-team/working-contractors-third-parties">GOV.UK guidance on working with contractors</a> provides a useful reference for knowledge transfer and limiting access to what the work needs. Its government procurement process is not a requirement for your private software project.</p>
<p>Technical control and legal rights are separate questions. Access to a repository does not settle rights to the code or third-party components. Record the agreed rights and any licensing constraints alongside the practical ability to continue the work.</p>
<h2>Test a proposal against one real workflow</h2>
<p>Consider a hypothetical customer portal. A customer submits a service request, an operator accepts it, and the customer sees the decision. This is an illustration, not an AL+ client result.</p>
<p>A proposal that promises “a portal with three screens” leaves substantial questions open. Use the worksheet to ask who defines the approval rules, checks customer isolation, connects notifications, releases the application, and handles a failed notification.</p>
<p>For one reviewable milestone, you could require:</p>
<ul>
<li>A customer can submit a request and see its current status.</li>
<li>An authorized operator can accept it; another customer cannot read or change it.</li>
<li>The decision remains recorded if sending the notification fails.</li>
<li>The agreed person can find the failure and follow the documented recovery path.</li>
</ul>
<p>Ask the provider to identify what it can demonstrate with test data, what needs access to another system, and which unknowns prevent a dependable estimate. This makes the first commitment reviewable without pretending that the entire project is already known.</p>
<h2>Compare providers using evidence you can inspect</h2>
<p>Request a walkthrough of how a relevant kind of change is reviewed, tested, released, and handed over. A provider can use its own demonstration system or an anonymized example; it should not need to disclose another client's private code to explain its process.</p>
<p>Ask what happens when a requirement changes, an engineer becomes unavailable, or a dependency fails. For US or Canadian businesses working with a remote provider, agree the actual working-hour overlap and how decisions move forward outside it. Geography alone does not establish a usable communication plan.</p>
<p>For security, ask what practices and checks apply to your data and release. <a href="https://csrc.nist.gov/pubs/sp/800/218/final">NIST's Secure Software Development Framework</a> offers a vocabulary purchasers can use in discussions with suppliers. Referencing it is not proof that a provider follows it, and it does not establish an AL+ certification.</p>
<p>For the project requirements themselves, use the <a href="/thoughts/planning-custom-software-development/">custom software development brief</a>. Keep that brief separate from the worksheet: one describes the software you need; the other assigns the work needed to deliver and own it.</p>
<h2>Discuss a defined software project with AL+</h2>
<p><a href="/custom-software-development/">AL+ provides custom software development</a> for web applications, SaaS products, APIs, and internal tools, with maintenance after launch. We work remotely, in English or Romanian. We agree the delivery and operating responsibilities in writing before we start.</p>
<p><a href="mailto:paul@alplustech.com?subject=Software%20development%20outsourcing%20enquiry">Email AL+ about software development outsourcing</a> with the workflow, what already exists, who can make product decisions, the responsibility you need us to take, and any budget or timing constraints. Send a description first; do not include passwords or private customer records.</p>
]]></content>
  </entry>
  <entry>
    <title>Mobile app development cost: planning a native iOS release</title>
    <link href="https://alplustech.com/thoughts/mobile-app-development-cost/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/mobile-app-development-cost/</id>
    <published>2026-10-09T00:00:00.000Z</published>
    <updated>2026-10-09T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>Understand the work behind an iOS app estimate: user journeys, device features, backend integrations, App Store release, and ongoing maintenance.</summary>
    <content type="html"><![CDATA[<p>The cost of a mobile app depends on its behavior, data, integrations, and release requirements. Counting screens alone misses much of the work.</p>
<p>This guide focuses on native iPhone and iPad projects, the scope of our <a href="/ios-app-development/">iOS app development service</a>. It helps you describe the app and compare proposals without relying on a generic price range.</p>
<h2>Define what the user can complete</h2>
<p>Start with one journey: the user opens the app, does a useful task, and receives a result. Explain who the user is, how often they repeat the task, and what happens when they make a mistake.</p>
<p>A simple-looking screen may need complicated rules. A log that works offline needs decisions about storage and later updates. A paid feature needs purchase, restoration, and access behavior. A camera feature needs permissions and a usable path when access is denied.</p>
<p>Separate essential behavior from later ideas before asking for a quote.</p>
<h2>Check the requirements that change the work</h2>
<p>An estimate should address the requirements that apply to your product:</p>
<ul>
<li><strong>Devices and platform support:</strong> iPhone, iPad, orientation, and supported operating system versions.</li>
<li><strong>Account and data model:</strong> local records, sign-in, synchronization, deletion, and account recovery where needed.</li>
<li><strong>Backend services:</strong> existing APIs, new server work, credentials, and data ownership.</li>
<li><strong>Device features:</strong> camera, notifications, location, or health-data access, with appropriate permissions.</li>
<li><strong>Commerce:</strong> paid downloads, in-app purchases, subscriptions, and restoration if the product needs them.</li>
<li><strong>Accessibility and language:</strong> the interface behavior and content required by the intended users.</li>
<li><strong>Verification and release:</strong> testing, store assets, privacy disclosures, review feedback, and handover.</li>
</ul>
<p>Not every app needs every item. The goal is to identify the relevant work before it disappears from the estimate.</p>
<h2>Separate the app from the backend</h2>
<p>If the app uses an existing service, include its API documentation and explain who maintains it. Check whether a test environment and the required permissions are available.</p>
<p>If the backend does not exist, it is part of the project. The app interface and the server are different work, but their behavior must agree. Specify what happens when the connection fails or an operation is retried.</p>
<p>For a product with online customer workflows and billing, also consider the <a href="/custom-software-development/">SaaS development scope</a>.</p>
<h2>Include App Store release work</h2>
<p>Agree who owns the Apple developer account, who can sign and submit builds, and who prepares the store information and review responses.</p>
<p>Release work can include screenshots, product descriptions, privacy information, testing access, and explanations for reviewers. Apple's review decision remains outside the developer's control. A proposal should not promise approval on a fixed date.</p>
<p>Keep account ownership and access clear so that another developer can maintain the app later.</p>
<h2>Existing apps need a different starting point</h2>
<p>For an existing app, provide its store link, source access, backend information, and the current issue or desired change. Establish whether the project builds reproducibly and whether signing and account access are available.</p>
<p>A small requested change can reveal an outdated dependency or a missing release process. Ask the provider to distinguish the feature work from the work needed to ship it safely.</p>
<p>Our <a href="/software-takeover/">software takeover service</a> covers this review, while <a href="/software-maintenance/">maintenance</a> covers ongoing releases and improvements.</p>
<h2>Compare proposals by deliverables and ownership</h2>
<p>Ask what is included, what is excluded, how completion will be verified, and what you receive at handover. Compare the same user journey and platform support in each proposal.</p>
<p>Budget separately for third-party services and continuing maintenance. Obtain current account and provider prices directly from their owners; they are not fixed development fees.</p>
<p>A <a href="/custom-software-development/">focused MVP</a> can reduce the initial feature scope while retaining the release and operating work a real product needs.</p>
<h2>Prepare an app brief</h2>
<p>Send the intended users, core journey, supported devices, relevant integrations, any existing app or prototype, and your budget and deadline constraints. If it is a fitness product, describe the records and personal data it handles; see <a href="/ios-app-development/">fitness app development</a>.</p>
<p><a href="mailto:paul@alplustech.com?subject=iOS%20app%20project%20enquiry">Email AL+ about your mobile app</a>. You do not need a finished specification to start the discussion.</p>
]]></content>
  </entry>
  <entry>
    <title>MVP development cost: what belongs in the estimate</title>
    <link href="https://alplustech.com/thoughts/mvp-development-cost/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/mvp-development-cost/</id>
    <published>2026-10-09T00:00:00.000Z</published>
    <updated>2026-10-09T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>Compare MVP development estimates by user journey, integrations, acceptance criteria, ownership, and the costs that continue after launch.</summary>
    <content type="html"><![CDATA[<p>A useful MVP estimate describes the product you will receive, the assumptions behind the work, and the responsibilities that remain after release. The headline price is only one part of that decision.</p>
<p>There is no single budget for every minimum viable product. A first release with one user role and an existing data source is different from a product with billing, several permissions, and an integration nobody has checked.</p>
<h2>Start with one complete user journey</h2>
<p>Write down who the user is, where they begin, what they do, and the result they receive. Include the important failure cases. If a user pays and the product cannot provide the result, what happens next?</p>
<p>This journey is the starting point for <a href="/custom-software-development/">MVP development</a>. It is also the basis for deciding what can wait. A feature is not essential merely because it appears in a competitor's product.</p>
<p>For example, a scheduling product might first let a customer choose an available slot and receive confirmation. Staff administration, cancellation behavior, time zones, and notifications still need decisions. A large analytics dashboard may be able to wait.</p>
<h2>Split the estimate into reviewable work</h2>
<p>Ask the developer to identify the work in each area:</p>
<ul>
<li><strong>Discovery and design:</strong> resolve requirements, map the journey, and agree acceptance criteria.</li>
<li><strong>Application development:</strong> interfaces, business rules, account access, data, and the selected workflows.</li>
<li><strong>Integrations:</strong> external APIs, credentials, payment handling, and recovery when a provider fails.</li>
<li><strong>Verification:</strong> test the important behavior, including errors and permissions.</li>
<li><strong>Release:</strong> deployment or store submission, environment configuration, access handover, and operating instructions.</li>
<li><strong>Ongoing ownership:</strong> maintenance, support, provider charges, and subsequent changes.</li>
</ul>
<p>These are budget components, not six mandatory contracts. Their purpose is to show what the proposal includes.</p>
<h2>Identify assumptions before they become extra work</h2>
<p>An estimate should say which systems already exist, who can grant access, what data is available, and what still needs a technical check.</p>
<p>If an integration has no usable test environment, do not treat its behavior as settled. If a prototype works only on its creator's computer, leave room to establish the build and release process.</p>
<p>Ask how uncertain work will be investigated and how the estimate changes when an assumption is wrong. A fixed scope still needs a process for changes.</p>
<h2>Compare the same release in each proposal</h2>
<p>Two proposals are comparable only if they cover the same behavior and responsibilities. Ask each provider:</p>
<ol>
<li>What can a real user complete at the end?</li>
<li>What is explicitly excluded?</li>
<li>Which acceptance criteria will demonstrate that the work is complete?</li>
<li>Who owns the source, accounts, data, and deployment?</li>
<li>What happens after the first release?</li>
<li>Which decisions must I make before work can proceed?</li>
</ol>
<p>A lower quote that excludes release, tests, or handover may describe a different product.</p>
<h2>Keep running costs separate</h2>
<p>Development is only part of the budget. Hosting, email delivery, monitoring, storage, paid APIs, payment fees, and maintenance may continue after launch. Not every product needs every provider.</p>
<p>Ask for the expected services and the assumptions behind their use. Third-party prices can change; obtain current prices from the providers before committing to a budget. Define who pays each bill and who owns each account.</p>
<p>For a subscription product, review <a href="/custom-software-development/">SaaS development</a>. For a native app, review <a href="/thoughts/mobile-app-development-cost/">mobile app development cost</a>.</p>
<h2>Send a brief that makes an estimate possible</h2>
<p>Include the intended users, one complete journey, any existing prototype, integrations, required deadline, and your budget constraint. A budget band helps a provider propose a realistic scope; it does not replace an estimate.</p>
<p>Use the <a href="/thoughts/planning-custom-software-development/">custom software planning guide</a> to prepare the brief.</p>
<p><a href="mailto:paul@alplustech.com?subject=MVP%20project%20enquiry">Email AL+ about your MVP</a>. Include what the first release must let a user do and what you need to learn from it.</p>
]]></content>
  </entry>
  <entry>
    <title>MVP vs prototype: what should you build first?</title>
    <link href="https://alplustech.com/thoughts/mvp-vs-prototype/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/mvp-vs-prototype/</id>
    <published>2026-10-09T00:00:00.000Z</published>
    <updated>2026-10-09T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>Choose a prototype, proof of concept, or MVP by the question you need to answer. Use a decision table and a practical first-release brief.</summary>
    <content type="html"><![CDATA[<p>A prototype helps you test an idea or interaction. A minimum viable product, or MVP, lets real users complete a useful task so you can learn from actual use. Build a prototype when the design is uncertain; build an MVP when you are ready to deliver and operate a small product. If the uncertainty is technical, a focused proof of concept may come first.</p>
<p>These are different purchases. A polished demonstration does not necessarily include the data handling, permissions, release process, or support that a working product needs. Before comparing development proposals, name the question you want the work to answer.</p>
<h2>Prototype, proof of concept, and MVP compared</h2>
<p>The labels vary between teams. Agree the intended result rather than relying on the name in a proposal.</p>
<p>On a narrow screen, scroll the table sideways to read all columns.</p>
<table>
<thead>
<tr>
<th>Deliverable</th>
<th>Question it answers</th>
<th>What you should be able to observe</th>
<th>What it does not establish</th>
</tr>
</thead>
<tbody>
<tr>
<td>Prototype</td>
<td>Can users understand and complete this proposed interaction?</td>
<td>People try a limited journey; you see where they hesitate or misunderstand it.</td>
<td>Reliable integrations, production operation, or willingness to pay.</td>
</tr>
<tr>
<td>Proof of concept</td>
<td>Can a specific technical approach work under the relevant constraints?</td>
<td>A narrow experiment demonstrates a capability, such as reading the required data from a provider.</td>
<td>A complete product or a usable customer experience.</td>
</tr>
<tr>
<td>MVP</td>
<td>Can a small working product deliver the intended value to its first users?</td>
<td>Real users complete the core task; you collect feedback and observe use.</td>
<td>Product-market fit, profitable acquisition, or readiness for every future customer.</td>
</tr>
</tbody>
</table>
<p>A prototype can be a paper sketch, a clickable design, or a limited coded interface. Its usefulness comes from what you learn, not how much code it contains. The <a href="https://www.gov.uk/service-manual/agile-delivery/how-the-alpha-phase-works">GOV.UK alpha guidance</a> makes the same practical distinction: test risky assumptions with prototypes rather than treating experimental code as production software.</p>
<p>An MVP can be offered to a small invited group. It does not need every feature, but the people using it need a way to complete the promised task and obtain help when it fails.</p>
<h2>Choose the smallest deliverable that resolves the uncertainty</h2>
<p>Ask what could make the next development commitment wasteful.</p>
<ul>
<li><strong>The need is uncertain:</strong> talk to intended users and inspect their current work. Neither a prototype nor an MVP replaces discovering whether the problem matters.</li>
<li><strong>The interaction is uncertain:</strong> use a prototype to test the difficult steps. You may not need to design the entire product to learn where people get stuck.</li>
<li><strong>The integration is uncertain:</strong> run a proof of concept with representative data and realistic access. A successful request to a test endpoint does not prove the whole integration is ready.</li>
<li><strong>The value in real use is uncertain:</strong> consider an MVP with a small, complete journey and a plan to observe what happens after release.</li>
</ul>
<p>You do not have to buy all three in sequence. If the workflow is already understood and the technology is established, a separate prototype may add little. If a required integration cannot work, building the rest of the product first is the wrong order.</p>
<h2>One booking idea, three different scopes</h2>
<p>Consider a hypothetical booking product. Customers need to choose an available appointment, receive confirmation, and change the booking if necessary. This is an illustrative example, not an AL+ client result.</p>
<p><strong>A prototype</strong> could show appointment selection, the confirmation screen, and the cancellation path. Test whether people understand the choices and whether staff can use the proposed administrative view. The appointments and confirmations can be simulated if that is explained to participants.</p>
<p><strong>A proof of concept</strong> could examine the calendar provider. Can the application read availability, create a booking, and recognize a conflicting change using the access the business can obtain? Document what the experiment tested, the environment used, and what remains untested.</p>
<p><strong>An MVP</strong> could let a limited group make real bookings for one service at one location. It would also need the relevant rules for time zones, conflicts, cancellation, staff access, and failure recovery. A large reporting dashboard may wait; preventing two people from booking the same slot may not.</p>
<p>The decision is about the uncertainty and the promised outcome. “Only five screens” is not enough to distinguish those scopes.</p>
<h2>A brief you can use before asking for a quote</h2>
<p>Fill in these six lines. If you cannot answer one, record it as an open question rather than an assumption.</p>
<ol>
<li><strong>User and task:</strong> who needs to do what, and what do they do today?</li>
<li><strong>Question to answer:</strong> what uncertainty must this piece of work resolve?</li>
<li><strong>Deliverable:</strong> prototype, technical experiment, or a working first release; explain why.</li>
<li><strong>Evidence of completion:</strong> what behavior or observation would let you accept the work?</li>
<li><strong>Scope and exclusions:</strong> which users, devices, integrations, and failure cases are included; what can wait?</li>
<li><strong>Next decision:</strong> what will you do if the result supports the idea, contradicts it, or is inconclusive?</li>
</ol>
<p>For the booking example, an acceptance statement might be: “An invited customer can book a genuinely available slot, receive confirmation, and cancel it; staff can see the change.” That describes product behavior. “The app has a booking screen” describes an interface and leaves the important work unresolved.</p>
<p>Use the <a href="/thoughts/mvp-development-cost/">MVP development cost guide</a> to compare estimates for the same deliverable and exclusions.</p>
<h2>What an MVP still needs after the feature list is reduced</h2>
<p>Small scope does not remove the responsibilities created by real users and real data. Identify which apply before launch:</p>
<ul>
<li>Access rules and correct handling of the information the product stores.</li>
<li>A repeatable release process and control of the repository and service accounts.</li>
<li>A way to notice failures and recover important work or data.</li>
<li>A support contact and someone responsible for the next release.</li>
<li>A plan for collecting feedback that informs a specific product decision.</li>
</ul>
<p>Those requirements should match the actual release. Do not add infrastructure for imagined scale, but do not omit a recovery path for information you cannot afford to lose. The <a href="https://www.gov.uk/service-manual/agile-delivery/how-the-beta-phase-works">GOV.UK beta guidance</a> offers a useful model: invite a limited group, learn from real use, and plan the capacity to support that learning.</p>
<h2>Can you turn a prototype into an MVP?</h2>
<p>Sometimes. First inspect what the prototype actually contains. The interface may be reusable while simulated data, temporary authentication, or local-only setup must be replaced. Code written for an experiment may be cheaper to discard than to make dependable.</p>
<p>Ask the developer to separate reusable work, missing production work, and unresolved assumptions. An AI-built prototype needs the same review; a convincing demo is evidence that the demo works, not that the product is ready for customers.</p>
<h2>Discuss the next useful release</h2>
<p><a href="/custom-software-development/">AL+ provides MVP development</a> for founders who need one complete first journey and clear ownership after launch. Send the six-line brief, any existing prototype, and your budget or timing constraints.</p>
<p><a href="mailto:paul@alplustech.com?subject=Prototype%20or%20MVP%20project%20enquiry">Email AL+ about your prototype or MVP</a>. We can discuss which deliverable addresses the question you need to answer.</p>
]]></content>
  </entry>
  <entry>
    <title>Planning custom software development: scope and cost</title>
    <link href="https://alplustech.com/thoughts/planning-custom-software-development/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/planning-custom-software-development/</id>
    <published>2026-10-09T00:00:00.000Z</published>
    <updated>2026-10-09T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>Prepare a custom software development brief: users, workflows, integrations, scope, cost drivers, and acceptance checks before you ask for a proposal.</summary>
    <content type="html"><![CDATA[<p>A useful custom software development brief describes the work the software must make possible. It does not need to prescribe a framework or list every screen. It needs enough detail for a development partner to identify the unknowns and propose a bounded first release.</p>
<p>Use this checklist before asking for a proposal. It helps you compare what providers will deliver, rather than comparing prices for different interpretations of the same idea.</p>
<h2>1. Name the user and the task</h2>
<p>Write one sentence: “A [user] needs to [complete a task] so that [useful outcome].” For example, an operations manager needs to approve a booking without copying information between three systems. This is an illustrative workflow, not a client result.</p>
<p>List the other people involved. A customer, an administrator, and a finance operator may need different permissions even when they use the same record.</p>
<h2>2. Describe what happens today</h2>
<p>Explain the current process, including spreadsheets, emails, and manual checks. Name the step that costs time or causes mistakes. Include one anonymized example of the input and the expected output.</p>
<p>Do not send passwords, customer records, or production credentials in the first email. Describe the systems involved; arrange appropriate access after the project is agreed.</p>
<h2>3. Define one complete first release</h2>
<p>Choose a workflow a real user can finish. Specify what starts it, what the software does, and how the user knows it succeeded. Include the failure path: what happens when input is wrong, an approval is refused, or an integration is unavailable?</p>
<p>Put everything else in a separate later list. A small first release can have fewer features while still needing reliable data handling, access control, and a way to recover from failure.</p>
<h2>4. List integrations and data</h2>
<p>Name each external service, the information exchanged, and who controls access. Say whether the provider has a documented API and whether test access exists. These are questions to resolve, not capabilities to assume.</p>
<p>If data must move from an old system, describe its format, approximate size, quality problems, and the period when both systems may need to run. Migration is work beyond building the new screens.</p>
<h2>5. State the constraints that change the proposal</h2>
<p>Include budget limits, any fixed date and its reason, required accessibility, data location constraints, and who will use the system. If requirements need specialist legal or security advice, identify who will provide it.</p>
<p>For remote work, agree how decisions will be recorded, who can approve scope, and what overlap in working hours is necessary. A stalled decision can delay delivery even when implementation is straightforward.</p>
<h2>6. Compare cost drivers, not just totals</h2>
<p>Software development cost depends on the workflows, permission rules, integrations, data work, and operating requirements. The same screen count can hide very different amounts of work.</p>
<p>Ask each provider to separate known scope from assumptions. Compare these five items:</p>
<ul>
<li>The working behavior included in the first release.</li>
<li>The unknowns that must be checked before an estimate is dependable.</li>
<li>The work excluded from the proposal.</li>
<li>How a scope change affects the price and schedule.</li>
<li>What happens after launch, including hosting costs and maintenance.</li>
</ul>
<p>A price without those boundaries is difficult to compare. This checklist does not provide a universal project price; a credible estimate needs the actual requirements.</p>
<h2>7. Decide how you will accept the work</h2>
<p>Write checks in user terms: “An operator can approve a request, the customer receives the correct update, and the decision is recorded.” Define representative examples and errors the system must handle.</p>
<p>Agree how you will see progress and test releases. Also agree who owns the repository, infrastructure accounts, documentation, deployment process, and backups. The <a href="/thoughts/what-a-software-handover-should-contain/">software handover checklist</a> describes the artifacts you should be able to receive.</p>
<h2>Send a brief that starts a useful conversation</h2>
<p>Your first email can be short: the user, the workflow, what exists today, the important integration, and your budget or timing constraints. A finished specification is not required.</p>
<p><a href="/custom-software-development/">AL+ provides custom software development services</a> with ownership after launch. <a href="mailto:paul@alplustech.com?subject=Custom%20software%20project">Email paul@alplustech.com</a> with those details to discuss your project with the people who would build it.</p>
]]></content>
  </entry>
  <entry>
    <title>Software maintenance cost: what your budget should cover</title>
    <link href="https://alplustech.com/thoughts/software-maintenance-cost/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/software-maintenance-cost/</id>
    <published>2026-10-09T00:00:00.000Z</published>
    <updated>2026-10-09T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>Estimate maintenance for an existing web app or SaaS: separate takeover, upkeep, support and feature work, then compare what each quote includes.</summary>
    <content type="html"><![CDATA[<p>Software maintenance cost depends on the system you have and the responsibility you want someone to take. A useful budget separates the work needed to take over the application, the recurring work that keeps it dependable, and the changes you want to ship.</p>
<p>If you are comparing providers, ask each to price the same scope. A monthly figure that excludes deployment, dependency updates, and incident investigation cannot be compared with one that includes them.</p>
<h2>Start with the application, not a percentage</h2>
<p>The original build price does not tell a new provider whether your backups restore, your dependencies are supported, or your payment integration fails quietly. Before treating any estimate as a commitment, establish what runs in production and which parts need attention.</p>
<p>Write down:</p>
<ul>
<li>What the application does and which workflows matter most.</li>
<li>Whether it is a web app, SaaS product, API, or internal system.</li>
<li>The runtime, framework, database, and hosting, if known.</li>
<li>Who can access the repository, deployments, and provider accounts.</li>
<li>Recent failures, deferred updates, and the next planned changes.</li>
<li>The hours when the business needs support and who handles urgent incidents.</li>
</ul>
<p>If the original developer has left, use the <a href="/thoughts/codebase-takeover-checklist/">codebase takeover checklist</a> to identify missing access and knowledge. You can collect this information without choosing a new provider first.</p>
<h2>Separate four parts of the budget</h2>
<h3>1. Initial takeover and stabilization</h3>
<p>A new team needs to understand production, check access, establish a repeatable deployment, and verify recovery. Missing documentation or an unsupported framework can add work before normal maintenance begins.</p>
<p>Ask what the initial scope delivers and what would trigger a revised estimate. Keep it separate from the ongoing monthly commitment so both parties can see the cost of inheriting the system.</p>
<h3>2. Recurring upkeep</h3>
<p>List the planned work: dependency and security updates, release checks, backup restoration tests, monitoring, and operational documentation. Agree how often each happens and what evidence you receive.</p>
<p>Hosting, database, email, and other provider bills belong in the operating budget too. State whether you pay those directly or through the maintenance provider. Engineering time and infrastructure bills are different costs.</p>
<h3>3. Support and incident work</h3>
<p>Specify the coverage hours, time zone, contact route, and what counts as urgent. Response time means someone starts assessing the problem; it does not mean the problem is resolved within that time.</p>
<p>For a US or Canadian business using a remote team, discuss overlap explicitly. Do not assume a monthly maintenance arrangement includes overnight or weekend response.</p>
<h3>4. Planned improvements</h3>
<p>Separate bug fixes from changes to how the product works. A new integration or a large workflow change needs a scope, even when the same team does both maintenance and development.</p>
<p>Agree how work is prioritized, how estimates are approved, and what happens when the month contains more work than the available capacity. That discussion matters more than the label on the package.</p>
<h2>A budget worksheet you can send to providers</h2>
<p>Fill in these lines before comparing quotes:</p>
<ul>
<li><strong>Initial work:</strong> access gaps, deployment setup, recovery checks, and urgent repairs.</li>
<li><strong>Recurring engineering:</strong> tasks, frequency, and capacity included.</li>
<li><strong>Provider bills:</strong> hosting, database, email, monitoring, and other services.</li>
<li><strong>Support:</strong> coverage hours, response expectations, and incident scope.</li>
<li><strong>Product changes:</strong> priorities and a separate approval path.</li>
<li><strong>Uncertainty:</strong> areas the provider must inspect before committing.</li>
</ul>
<p>For each quote, ask the provider to mark what is included, excluded, or not yet known. Ask how unused capacity and work above the agreed scope are handled. Do not assume either rolls over or is automatically billable.</p>
<h2>When a low quote leaves work uncovered</h2>
<p>A provider may reasonably offer a narrow service. The risk is a gap nobody owns: application support without dependency upgrades, monitoring without a person receiving alerts, or backups without a restoration check.</p>
<p>Ask who is responsible for each gap. You might keep a task internally, hire a specialist, or include it in the maintenance scope. The useful outcome is explicit ownership.</p>
<h2>Repair, modernization, or ongoing maintenance?</h2>
<p>If the application is supported and easy to deploy, recurring upkeep may be enough. If a framework upgrade, deployment repair, or data migration is needed first, scope that work separately.</p>
<p>Our <a href="/thoughts/repair-or-rewrite/">repair or rewrite guide</a> helps distinguish targeted work from replacement. The maintenance budget should reflect that decision rather than hide a modernization project inside routine upkeep.</p>
<h2>Discuss maintenance for your application</h2>
<p>AL+ provides <a href="/software-maintenance/">software maintenance services</a> for existing web applications and SaaS products, including systems built by another developer or agency.</p>
<p><a href="mailto:paul@alplustech.com?subject=Software%20maintenance%20budget">Email paul@alplustech.com about software maintenance</a>. Describe the application, its stack if known, your country, the current problem, and the support hours you need. Send a description first; keep passwords, API keys, and customer data out of the email.</p>
]]></content>
  </entry>
  <entry>
    <title>Vibe coding cleanup: how to hire help for your app</title>
    <link href="https://alplustech.com/thoughts/vibe-coding-cleanup/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/vibe-coding-cleanup/</id>
    <published>2026-10-09T00:00:00.000Z</published>
    <updated>2026-10-09T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>Need help with an AI-built app? Define the failure, agree a repair scope, and ask for evidence on permissions, recovery, deployments and tests.</summary>
    <content type="html"><![CDATA[<p>Vibe coding cleanup is the work of inspecting and repairing an application built largely with AI coding tools. If your app works in a demo but fails with real users, the first task is to understand the failure and agree what a repair must prove.</p>
<p>You do not need to decide on a full rewrite before asking for help. You need a description of the application, an example of what goes wrong, and an engineer who can explain the system before changing it.</p>
<h2>Describe the problem you need solved</h2>
<p>“Clean up the code” can mean fixing a payment failure, preventing one user from seeing another user's records, or making deployments repeatable. Those require different work and different checks.</p>
<p>Start with one example. Record what you did, what you expected, what happened, and whether you can repeat it. Mention whether the app has paying users or holds real customer data. Keep that data out of screenshots and emails you send to potential providers.</p>
<h2>Prepare a short brief</h2>
<p>Include:</p>
<ul>
<li>What the app does and who uses it.</li>
<li>Which coding tools produced it and whether you have the source repository.</li>
<li>Where it is hosted and which database or external services it uses.</li>
<li>One reproducible failure, or the specific launch question you need answered.</li>
<li>Who controls the hosting, domain, payments, and repository accounts.</li>
<li>Any deadline and the part of the product that must keep working.</li>
</ul>
<p>Unknown answers are useful too. Write “unknown” rather than guess. Arrange access separately after agreeing who should receive it and why.</p>
<h2>Ask for a bounded first scope</h2>
<p>A first scope should name the area being inspected, the proposed output, and how the result will be verified. For example: reproduce a cross-account access problem, repair the server-side permission check, and demonstrate that account A cannot retrieve account B's record.</p>
<p>That example describes a task, not a claim that your app has this defect. The same approach works for a failed deployment or a background job: establish the actual behavior, fix the cause, and repeat the flow.</p>
<p>Ask which findings could expand the scope. If the repair exposes a wider problem, the next work should be discussed rather than silently added.</p>
<h2>What useful cleanup leaves behind</h2>
<h3>Permissions checked with different users</h3>
<p>Ask how the provider will verify that one user cannot read or change another user's data. A hidden interface button is not evidence of a server-side restriction.</p>
<h3>A recovery path that has been exercised</h3>
<p>A configured backup is only part of the story. Ask whether a backup has been restored in a separate environment and how the restored data was checked.</p>
<h3>A repeatable deployment</h3>
<p>Another engineer should be able to deploy from the repository using documented configuration. Discuss rollback, including whether a database change can be reversed safely.</p>
<h3>Tests for the repaired behavior</h3>
<p>Tests should exercise the flow that failed and assert a concrete result. A successful build alone does not establish that the payment, permission, or user workflow now works.</p>
<h3>A written list of remaining risks</h3>
<p>Ask for known problems, deferred work, and limits of the review. Repairing one defect does not establish that the entire app is ready for production. The <a href="/thoughts/production-readiness-checklist-ai-generated-applications/">production-readiness checklist</a> gives you a broader set of questions.</p>
<h2>Repair or rewrite?</h2>
<p>A repair is worth considering when the application serves a useful purpose and its problems can be isolated and verified. Replacement may be appropriate when the existing design prevents the required behavior or the system cannot be operated responsibly within your constraints.</p>
<p>Ask the provider to explain that decision against the actual app. “AI wrote it” is not enough information to justify either choice. Our <a href="/thoughts/repair-or-rewrite/">repair or rewrite guide</a> describes how to examine the tradeoffs.</p>
<h2>Plan who owns the app afterwards</h2>
<p>Agree who receives alerts, maintains dependencies, controls provider accounts, and handles future changes. Cleanup is a bounded intervention; keeping the application dependable is ongoing work.</p>
<p>You can continue using AI coding tools. Changes still need review and verification against the system you now understand. Keep deployment instructions and the list of known risks available to whoever works on it next.</p>
<h2>Ask AL+ about your AI-generated application</h2>
<p>AL+ <a href="/services/ai-app-rescue/">assesses and repairs existing applications</a> and maintains them afterwards. The work starts from the existing system and keeps what is useful.</p>
<p><a href="mailto:paul@alplustech.com?subject=AI-generated%20application%20enquiry">Email paul@alplustech.com about your AI-built app</a>. Send the short brief above and the problem you need solved. We can discuss fit and the next step from that context; a cost or deadline needs an agreed scope.</p>
]]></content>
  </entry>
  <entry>
    <title>Web app vs mobile app: choose the first platform</title>
    <link href="https://alplustech.com/thoughts/web-app-vs-mobile-app/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/web-app-vs-mobile-app/</id>
    <published>2026-10-09T00:00:00.000Z</published>
    <updated>2026-10-09T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>Decide whether your first product needs a web app or a native mobile app. Compare user journeys, device needs, offline work, release scope, and ownership.</summary>
    <content type="html"><![CDATA[<p>Choose between a web app and a mobile app by the task your users need to complete. A web app is often a useful starting point for work reached through a link and performed across different devices. A native mobile app becomes a stronger candidate when the core journey depends on specific device capabilities or frequent use on a phone. Test the requirements before committing to either.</p>
<p>“People will use it on mobile” does not settle the decision. A web application can work in a mobile browser. “We need offline access” is not enough either: offline behavior must be designed, and some web applications can support it. The useful question is which approach can deliver your actual workflow with acceptable constraints.</p>
<h2>What is the difference?</h2>
<p><strong>A web application</strong> runs in a browser. Users can usually reach it through a URL, and the interface can adapt to a phone, tablet, or desktop. Its capabilities depend on the browsers and devices you support.</p>
<p><strong>A native mobile application</strong> is built for a particular platform, such as iOS. It is installed on the device and uses that platform’s interface conventions and available APIs. Supporting another native platform creates additional delivery and verification work.</p>
<p><strong>A progressive web app, or PWA,</strong> uses web technologies with additional capabilities such as installation and designed offline behavior. <a href="https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps">MDN’s PWA documentation</a> explains those possibilities. Availability and behavior still need checking on your target devices; “PWA” is not a promise that every native feature works everywhere.</p>
<p>Use the requirements below to choose the first product surface.</p>
<h2>Compare the constraints before the technology</h2>
<p>On a narrow screen, scroll the table sideways to read all columns.</p>
<table>
<thead>
<tr>
<th>Requirement</th>
<th>Web app: what to check</th>
<th>Native app: what to check</th>
</tr>
</thead>
<tbody>
<tr>
<td>Customers arrive through a link</td>
<td>Can they complete the journey in the supported browsers without installation?</td>
<td>Is installing an app an acceptable step before they receive value?</td>
</tr>
<tr>
<td>Work spans desktop and phone</td>
<td>Are the layouts and interactions suitable for both?</td>
<td>Will desktop users also need a web interface?</td>
</tr>
<tr>
<td>A device feature is essential</td>
<td>Is the required API available and reliable on the exact browsers you must support?</td>
<td>Does the platform provide the capability, and what permissions and restrictions apply?</td>
</tr>
<tr>
<td>The connection is unreliable</td>
<td>Which actions work offline, and how will stored work synchronize?</td>
<td>The same questions apply; installation alone does not make server-dependent actions work offline.</td>
</tr>
<tr>
<td>Several platforms are required</td>
<td>Verify behavior across the supported browser and device combinations.</td>
<td>Define each platform’s scope and the tests, release work, and maintenance it needs.</td>
</tr>
<tr>
<td>Releases must change frequently</td>
<td>Plan deployment, compatibility, and recovery for changes to the running service.</td>
<td>Also account for distribution, review where applicable, and users on older app versions.</td>
</tr>
</tbody>
</table>
<p>Do not treat these as a score where the most ticks win. One essential capability can determine the approach. Several preferences may not justify the additional product surfaces.</p>
<h2>Two examples that lead to different first releases</h2>
<p><strong>A customer approval portal:</strong> customers receive a link, review documents, approve work, and sometimes complete the task on a phone. Staff manage the records at a desk. A responsive web application is a reasonable first candidate. Before building an app, test whether installation would improve the important journey at all.</p>
<p><strong>A field recording tool:</strong> staff capture information throughout the day in places with poor connectivity. The product needs specific device behavior, local records, and later synchronization. Evaluate a native app and a PWA against those exact requirements. A small capability experiment on the actual devices may resolve the choice more usefully than a generic feature comparison.</p>
<p>These are hypothetical workflows, not claims about AL+ client results. The first favors easy access across devices; the second makes device and connection behavior central. Neither determines the architecture of every product in its category.</p>
<h2>Offline work needs a written behavior, not a label</h2>
<p>Describe what happens before, during, and after the connection fails:</p>
<ol>
<li>Which information must already be on the device?</li>
<li>Which actions can the user complete without a server response?</li>
<li>How does the interface show saved, pending, failed, and synchronized work?</li>
<li>What happens if another person changes the same record?</li>
<li>What happens when the user signs out, loses the device, or returns after a long interruption?</li>
</ol>
<p>A cached screen and an offline business transaction are different requirements. For example, displaying a previously loaded appointment does not establish that a new booking can be confirmed without reaching the system that owns availability.</p>
<p>Native and web implementations both need decisions about data, conflicts, and recovery. Check the relevant platform documentation and verify the critical behavior rather than promising it from a technology name.</p>
<h2>The backend is a separate part of the decision</h2>
<p>An installed app can still depend on accounts, shared records, payments, notifications, and administrative tools running elsewhere. A web application can need those same services.</p>
<p>For either approach, identify which backend already exists, who controls it, which interfaces are available, and what must be built. Moving the interface to a phone does not resolve an unreliable integration or unclear data ownership.</p>
<p>Include the administrative workflow. If someone must correct a record or support a customer, decide how they will do it. A mobile customer experience and a web administration interface can be different surfaces of one product, but both belong in the scope.</p>
<h2>Compare complete release estimates</h2>
<p>Ask each proposal to separate the shared product work from the platform work:</p>
<ul>
<li><strong>Shared behavior:</strong> business rules, data, access, integrations, and server operation.</li>
<li><strong>Interface work:</strong> user journeys and layouts for each supported surface.</li>
<li><strong>Verification:</strong> the devices, browsers, permissions, and failure cases that will be checked.</li>
<li><strong>Release:</strong> deployment or store submission, account access, support information, and recovery.</li>
<li><strong>Maintenance:</strong> compatibility changes, fixes, releases, and continuing provider charges.</li>
</ul>
<p>There is no reliable universal percentage by which one approach is cheaper. An existing backend, a required device capability, or a second interface can change the comparison. Compare the same useful release rather than two screen counts or hourly rates.</p>
<p>Our <a href="/thoughts/mobile-app-development-cost/">mobile app cost guide</a> explains the work in a native iOS estimate. It is a scope checklist, not a promise of a standard project price.</p>
<h2>A platform decision brief</h2>
<p>Write these six lines before asking a developer to choose a stack:</p>
<ol>
<li><strong>Core journey:</strong> what a user must complete from start to result.</li>
<li><strong>Users and devices:</strong> who uses it, where, how often, and on which devices.</li>
<li><strong>Essential capabilities:</strong> the exact device behavior or integrations the journey depends on.</li>
<li><strong>Connection behavior:</strong> what must happen when the network is unavailable.</li>
<li><strong>Existing systems:</strong> the backend, data, accounts, and interfaces already available.</li>
<li><strong>First-release boundary:</strong> the supported platforms, exclusions, budget constraints, and reason for any fixed date.</li>
</ol>
<p>If a capability could change the decision, request a focused technical check before a full build. If the uncertainty is how people use the interface, a <a href="/thoughts/mvp-vs-prototype/">prototype may be the right first step</a>.</p>
<h2>Discuss the workflow before committing to a platform</h2>
<p><a href="/custom-software-development/">AL+ builds custom web applications</a> and <a href="/ios-app-development/">native iPhone and iPad apps</a>, with responsibility for the connected services and maintenance after launch. We can discuss the first platform around the task, target devices, and existing system.</p>
<p><a href="mailto:paul@alplustech.com?subject=Web%20or%20iOS%20platform%20decision">Email AL+ about your web or iOS project</a>. Send the six-line brief so the conversation starts with the requirements that determine the work.</p>
]]></content>
  </entry>
  <entry>
    <title>Choosing a language for software you will maintain</title>
    <link href="https://alplustech.com/thoughts/betting-on-rust-for-now/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/betting-on-rust-for-now/</id>
    <published>2026-10-06T00:00:00.000Z</published>
    <updated>2026-10-24T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>Rust, Rails or another stack? Choose for the application, the people maintaining it and the cost of operating it, rather than a benchmark ranking.</summary>
    <content type="html"><![CDATA[<p>The programming language affects who can maintain an application and what it costs to run. It does not tell you whether the application solves the right problem. A business buying software needs an explanation of the choice in terms of its own requirements.</p>
<h2>Start with the work the application must do</h2>
<p>Describe the important workflows, expected use, integrations and constraints. A reporting tool used by a small team has different demands from a service processing a continuous stream of events.</p>
<p>Ask the developer which requirement makes the proposed language a good choice. An existing team, a library the application needs, or compatibility with a current system may matter more than a performance comparison.</p>
<h2>Treat benchmarks as a question to investigate</h2>
<p>A benchmark measures a particular implementation on particular hardware, with a particular workload. Different database access, caching or error handling can change the result. Throughput without correct results does not establish that a system meets its users' needs.</p>
<p>Before paying for a migration on performance grounds, reproduce the problem in your application. Identify where the time goes and compare changes under the same conditions. The useful result is the improvement to the workflow that matters to the business.</p>
<h2>Include maintenance in the decision</h2>
<p>A language choice also determines which developers can review changes, which dependencies you rely on, and how releases work. Ask who will maintain the system after launch and how another developer would take over.</p>
<p>Our experience includes Ruby on Rails, Elixir, Rust and native iOS development. We choose within that experience according to the project. We discuss compatibility and maintenance before proposing a new stack.</p>
<h2>A working application needs a reason to change</h2>
<p>An application written in Rails or Phoenix does not need a rewrite because another language is popular. Improvements to queries, deployment, monitoring or a specific slow component may address the actual problem with less disruption.</p>
<p>Our <a href="/services/ai-app-rescue/">modernization service</a> begins with the existing system. We compare targeted improvements and replacement against the work you need the application to support.</p>
<h2>What to ask before agreeing a stack</h2>
<ul>
<li>Which business requirement does this choice address?</li>
<li>Who can maintain the application and review changes?</li>
<li>Which operating costs and external services does it introduce?</li>
<li>How will you measure whether performance is sufficient?</li>
<li>What would justify changing this decision later?</li>
</ul>
<p>You do not need to choose a programming language before contacting us. Describe the task, the users, what already exists and any constraints. We can discuss the technical choices as part of <a href="/custom-software-development/">scoping a custom software project</a>.</p>
]]></content>
  </entry>
  <entry>
    <title>Codebase takeover checklist: what to inspect before accepting a system</title>
    <link href="https://alplustech.com/thoughts/codebase-takeover-checklist/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/codebase-takeover-checklist/</id>
    <published>2026-09-10T00:00:00.000Z</published>
    <updated>2026-09-10T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>A reusable checklist for taking over software from another developer, agency, or team: access, production, data, change safety, dependencies, security, knowledge, and cost. Use it before you agree to own the system.</summary>
    <content type="html"><![CDATA[<p>Before you accept responsibility for a system someone else built, inspect it. This is the checklist AL+ uses when <a href="/software-takeover/">taking over software</a>. It is written so that a founder, a CTO, or an incoming team can use it without us. Work through it in order; the first sections protect you from the failures that cannot be undone.</p>
<p>The checklist has eight parts. Each item is a question with a yes-or-no answer. A &quot;no&quot; is not a reason to refuse the system. It is a line in the plan.</p>
<h2>1. Access and ownership</h2>
<p>The most common takeover failure is discovering, weeks in, that a critical account belongs to someone who has left.</p>
<ul>
<li>Is the source code in a repository your company owns, with administrator rights held by your company?</li>
<li>Do you have owner-level access to hosting, DNS, the domain registrar, databases, object storage, and CDN?</li>
<li>Are email sending, payment providers, third-party APIs, app store accounts, and monitoring registered to company addresses, not personal ones?</li>
<li>Where do secrets live, and can you rotate every credential the previous developer had without an outage?</li>
<li>Which accounts are paid, on which card, and when does each renew or expire?</li>
<li>Are there licences (fonts, libraries, SaaS seats, map tiles) that will lapse when the previous team's accounts close?</li>
</ul>
<p>If any answer is &quot;we do not know&quot;, stop and find out before you change anything.</p>
<h2>2. Production reality</h2>
<p>The repository tells you what was intended. Production tells you what is true.</p>
<ul>
<li>What is deployed right now, from which commit, and does it match the main branch?</li>
<li>How is it deployed? By hand, by a script, by a pipeline? Can you repeat it?</li>
<li>What runs on a schedule: cron jobs, queues, scheduled functions, webhooks? Where are they configured?</li>
<li>Which external services does the system call, and which call it?</li>
<li>What do the logs and error trackers say has been failing quietly?</li>
<li>What environments exist besides production? Is there a staging environment that resembles it?</li>
</ul>
<h2>3. Data</h2>
<p>Data is the part of a system you cannot regenerate.</p>
<ul>
<li>Where does data live: databases, files, third-party services, spreadsheets?</li>
<li>How large is it, and how fast is it growing?</li>
<li>When was the last backup, and has a backup ever been restored somewhere and checked?</li>
<li>What personal data is held, under which legal basis, and where is it documented?</li>
<li>Are there migrations pending, half-applied, or applied by hand?</li>
<li>Can you export the data in a form you could move to another system?</li>
</ul>
<p>Restore a backup to a safe place during the review. A backup that has never been restored is a hope, not a backup.</p>
<h2>4. Change safety</h2>
<p>You will need to change the system. Find out how dangerous that is.</p>
<ul>
<li>Can you run the system on a developer machine from the repository alone?</li>
<li>Are there tests? Do they pass? What do they cover?</li>
<li>Is there a review step before code reaches production?</li>
<li>Can a bad release be rolled back, and has that been done before?</li>
<li>Does a trivial change (a typo in a footer) travel through the full path in under a day?</li>
</ul>
<p>If the answer to the last question is no, fixing that path is the first engineering task, before any feature.</p>
<h2>5. Dependencies and platform</h2>
<ul>
<li>What are the runtime, framework, and database versions, and when does each reach end of life?</li>
<li>How many dependencies are there, how old are they, and which are unmaintained?</li>
<li>Do any carry known vulnerabilities?</li>
<li>When was the last upgrade, and what broke?</li>
<li>Is anything pinned to a version for a reason nobody remembers?</li>
</ul>
<h2>6. Security basics</h2>
<p>This is not a penetration test. It is the minimum you must know before you own the system.</p>
<ul>
<li>Is authorization enforced on the server, or only in the interface?</li>
<li>Are secrets in the code or in the repository history?</li>
<li>Is user input validated before it reaches the database or the shell?</li>
<li>Who has access to production, and is that access individual and revocable?</li>
<li>Are there administrative endpoints, debug modes, or default credentials still enabled?</li>
<li>Is transport encrypted everywhere, including between services?</li>
</ul>
<h2>7. Knowledge</h2>
<ul>
<li>Is the previous developer reachable, and willing to answer questions for a fee?</li>
<li>Is there any written description of the architecture, the deployment, or the reasons behind major decisions?</li>
<li>Which parts of the system does nobody currently understand?</li>
<li>Which parts does everybody avoid touching, and why?</li>
<li>What incidents happened in the last year, and how were they resolved?</li>
</ul>
<p>Ask about decisions, not code: why this database, why this hosting, what they would change, what they were afraid of. Record the answers.</p>
<h2>8. Cost and fit</h2>
<ul>
<li>What does the system cost per month in hosting, licences, and third-party services?</li>
<li>What does it cost in engineering time to keep running today?</li>
<li>What does the business need from it in the next twelve months?</li>
<li>Is any large part of it serving a use case that no longer exists?</li>
<li>Is this a system to own, to <a href="/services/ai-app-rescue/">modernize in place</a>, or to replace? The answer comes from the previous seven sections, not from the first meeting.</li>
</ul>
<h2>How to use the result</h2>
<p>Write the answers down as a single document, with a &quot;no&quot; list ranked by risk. The ranking becomes the first weeks of work: access and billing first, then backups and deployments, then the fragile parts, then the wanted ones. A takeover done in this order shows the business a new feature later than it hoped and an outage never.</p>
<p>If you would rather have us run this review and take the system over afterwards, <a href="/software-takeover/">that is what our software takeover service is</a>. If you want to run it yourself, the checklist is yours.</p>
]]></content>
  </entry>
  <entry>
    <title>Production-readiness checklist for AI-generated applications</title>
    <link href="https://alplustech.com/thoughts/production-readiness-checklist-ai-generated-applications/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/production-readiness-checklist-ai-generated-applications/</id>
    <published>2026-09-10T00:00:00.000Z</published>
    <updated>2026-09-10T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>Thirty concrete checks that separate a working AI-generated (vibe-coded) prototype from production software: security, data, failure handling, operations, coherence, dependencies, and ownership.</summary>
    <content type="html"><![CDATA[<p>An AI-generated application is production-ready when it can serve strangers, survive failure, protect its data, and be changed by someone who understands it. Most vibe-coded prototypes meet none of these conditions, and their builders cannot tell, because a demo with one honest user never exercises them.</p>
<p>This checklist is the set of criteria AL+ checks when <a href="/services/ai-app-rescue/">productionizing an AI-generated application</a>. It applies equally to a prototype built by hand. Each item is verifiable; do not accept a &quot;probably&quot;.</p>
<h2>Security: does it protect data from anyone but its owner?</h2>
<ol>
<li>Every authorization decision is enforced on the server. Hiding a button in the interface is not authorization.</li>
<li>Database access rules (row-level security or the equivalent) are enabled and tested with a second account.</li>
<li>No secret, API key, or password is in the source code or in the repository history.</li>
<li>User input is validated and parameterized before it reaches the database, the file system, or a shell.</li>
<li>Administrative routes, debug modes, and sample accounts are removed or locked.</li>
<li>Rate limiting exists on login, signup, password reset, and any endpoint that costs money to call.</li>
<li>Access to production (hosting, database, secrets) is individual, minimal, and revocable.</li>
</ol>
<h2>Data: can it be lost, and can it be recovered?</h2>
<ol start="8">
<li>Backups run automatically, and one has been restored to a separate environment and checked.</li>
<li>Each kind of data has one home. The same fact is not stored in two tables or two services that can disagree.</li>
<li>Schema changes are migrations under version control, not edits made in a database console.</li>
<li>Personal data held is listed, with a reason for holding it and a way to delete it on request.</li>
<li>The free tier, quota, or plan the data lives on is known, along with what happens when it is exceeded.</li>
</ol>
<h2>Failure: what happens when something goes wrong?</h2>
<ol start="13">
<li>A failed external call produces a message the user can act on, not a blank screen.</li>
<li>Errors are recorded somewhere a human will see them, with enough context to reproduce them.</li>
<li>Timeouts and retries are deliberate; a slow third party cannot hang the whole application.</li>
<li>Background jobs that fail are visible, and a job that silently stops running raises an alert.</li>
<li>Someone is notified when the application is down, by a channel they actually read.</li>
</ol>
<h2>Operations: can it be run by someone other than its author?</h2>
<ol start="18">
<li>Deployment is repeatable from the repository, by script or pipeline, not by hand.</li>
<li>A deployment can be rolled back, and the rollback has been rehearsed once.</li>
<li>A staging environment exists that resembles production closely enough to catch mistakes.</li>
<li>Configuration is separate from code and documented, including every environment variable.</li>
<li>There is a written page covering how to deploy, roll back, restore, and whom to call at each provider.</li>
</ol>
<h2>Coherence: can it be changed without breaking something unrelated?</h2>
<ol start="23">
<li>There is one way to do each common thing (fetch data, handle auth, call an API), not three generated variations.</li>
<li>The parts that matter most (payments, permissions, data changes) have automated tests that run before deployment.</li>
<li>Someone can explain, in plain sentences, how a request travels through the system and where its data ends up.</li>
<li>Dead code, unused dependencies, and abandoned experiments have been removed.</li>
</ol>
<h2>Dependencies: will it still build next year?</h2>
<ol start="27">
<li>Runtime, framework, and major libraries are on supported versions with known end-of-life dates.</li>
<li>Dependencies with known vulnerabilities have been upgraded or replaced.</li>
<li>The project builds from a clean checkout on a machine that is not the author's.</li>
</ol>
<h2>Ownership: who answers for it?</h2>
<ol start="30">
<li>One named person or team is responsible for the application in production and has the access, knowledge, and time to act.</li>
</ol>
<h2>How to read the result</h2>
<p>The count matters less than the pattern. A prototype that fails items 1 to 7 is not ready for a single external user, whatever else is true. One that fails only items 23 to 29 is safe to run but expensive to change, which is a problem you can schedule.</p>
<p>We check all thirty before taking responsibility for an application, and we keep what already works: the goal is production readiness, not a rewrite. <a href="/services/ai-app-rescue/">The service page describes how</a>; the longer argument is in <a href="/thoughts/ai-built-software-still-needs-an-engineer/">AI-built software still needs an engineer</a>.</p>
]]></content>
  </entry>
  <entry>
    <title>What a good software handover should contain</title>
    <link href="https://alplustech.com/thoughts/what-a-software-handover-should-contain/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/what-a-software-handover-should-contain/</id>
    <published>2026-09-10T00:00:00.000Z</published>
    <updated>2026-09-10T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>The seven artifacts an outgoing developer or agency should hand over with a software system: access, environment map, operating manual, architecture notes, decision log, open issues, and a recorded walkthrough.</summary>
    <content type="html"><![CDATA[<p>A software handover is complete when the incoming team can deploy, restore, and change the system without contacting the outgoing one. Most handovers deliver a repository and a goodbye. This is what a good one contains, in the order the incoming team will need it.</p>
<p>Use this list in two directions. If you are leaving a system, deliver these seven things. If you are receiving one, ask for them by name before the previous team's last day, because after that day every item costs ten times more to recover.</p>
<h2>1. Transferred ownership of every account</h2>
<p>Not shared logins: ownership. Repositories, hosting, DNS and registrar, databases, object storage, email delivery, payment providers, third-party APIs, app store accounts, monitoring, and any SaaS the system depends on, each transferred to an account controlled by the company that owns the software. A spreadsheet listing each service, its purpose, the owning account, the payment method, and the renewal date is the single most valuable document in the handover.</p>
<h2>2. An environment map</h2>
<p>One page that answers: what runs where. Production, staging, and any other environments; the servers or platforms behind each; the databases and stores they use; the scheduled jobs and where they are configured; the external services called and the services that call in. A diagram helps, but a list is enough. The test is whether an engineer who has never seen the system can point at every moving part.</p>
<h2>3. An operating manual</h2>
<p>How to deploy a change, and how to roll one back. How to restore a backup, with the last date it was rehearsed. How to rotate each secret. How to add an administrator. What to do when the site is down, the queue is stuck, or the database is full. Who to call at each provider. This document is short and boring, and its absence is why most inherited systems have their first outage in the first month.</p>
<h2>4. Architecture notes</h2>
<p>Not a specification. A few pages on how the system is put together and why: the main components, how a request travels through them, where the data lives, the parts that are fragile, and the parts nobody should touch without reading the notes first. Written by the people leaving, while they still remember.</p>
<h2>5. A decision log</h2>
<p>The decisions that shaped the system and the reasons behind them: why this database, why this hosting, why this framework, why that integration was built in-house. The reasons matter more than the decisions. A decision without its reason gets reversed by the next team for the same reason it was made.</p>
<h2>6. The open issues, honestly</h2>
<p>Known bugs, workarounds in place, deferred upgrades, dependencies near end of life, security concerns, and the things that keep the outgoing engineers up at night. An honest list here saves the incoming team months of discovery and protects the outgoing team's reputation when the issues surface anyway.</p>
<h2>7. A recorded walkthrough and a question window</h2>
<p>One or two recorded sessions walking through the environment map, the deployment, and the architecture notes, with questions. Then an agreed window, paid if necessary, during which the outgoing team answers questions by email. A few hours of the previous developer's time are worth weeks of archaeology.</p>
<h2>What to do if you receive less than this</h2>
<p>Most incoming teams receive item one partially and nothing else. In that case, run <a href="/thoughts/codebase-takeover-checklist/">the codebase takeover checklist</a> yourself and write these seven artifacts as you go. The first three are urgent; the rest can follow in the first months.</p>
<p>If you would rather have the incoming team be us, <a href="/software-takeover/">software takeover</a> is the service, and producing this handover for the next team is part of how we finish it.</p>
]]></content>
  </entry>
  <entry>
    <title>Software needs an owner</title>
    <link href="https://alplustech.com/thoughts/software-needs-an-owner/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/software-needs-an-owner/</id>
    <published>2026-09-01T00:00:00.000Z</published>
    <updated>2026-09-01T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>Software becomes expensive when nobody clearly owns it. Ownership is a role, not a repository permission, and most struggling systems are missing it.</summary>
    <content type="html"><![CDATA[<p>Software becomes expensive when nobody clearly owns it. Not when it is old, not when it is written in the wrong language, and not when it was built quickly. Those things make software harder. A missing owner makes it expensive.</p>
<h2>What an owner is</h2>
<p>An owner is one party who can answer three questions about a system without looking anything up for very long:</p>
<ol>
<li>How does it work, end to end, in production?</li>
<li>What is likely to break next, and what happens to users when it does?</li>
<li>What would it cost to change it in a specific way?</li>
</ol>
<p>The owner does not have to be the person who wrote the code. They rarely are. They are the person who is responsible for the system's behavior over time and has the access, knowledge, and authority to act on that responsibility.</p>
<p>An owner is a role, not a permission. Having admin rights on a repository is not ownership. Being the person everyone emails when something breaks is closer, but only if that person can also decide what to fix and when.</p>
<h2>How ownership goes missing</h2>
<p>The same patterns tend to show up when a system has lost its owner.</p>
<p><strong>The developer left.</strong> A freelancer, an early employee, or a small agency built the product and moved on. The code is fine. The knowledge left with them, and nobody was asked to pick it up.</p>
<p><strong>The product was built quickly.</strong> A prototype turned into a business faster than anyone planned. Decisions that made sense for a demo are now load-bearing, and nobody remembers which ones.</p>
<p><strong>The product was built with AI.</strong> A founder or a small team produced a working application in weeks using AI tools. It works. Nobody on the team can explain why, which is a different problem from it being badly written.</p>
<p><strong>Ownership was split.</strong> One vendor runs the infrastructure, another maintains the application, and the customer's own team owns the data. Each party is responsible for their part. Nobody is responsible for the system.</p>
<p>In every case the symptom is the same. Small changes take weeks. Estimates are wide and nervous. Incidents are resolved by restarting things. Every conversation about the software starts with &quot;we would need to look into that.&quot;</p>
<h2>Why this costs more than it looks</h2>
<p>Unowned software does not fail loudly. It fails through friction.</p>
<p>Each change carries an unknown risk, so changes are batched, delayed, or avoided. Features the business needs are quietly dropped. Security updates are postponed because nobody knows what they might break. When a dependency finally forces the issue, the upgrade is large, urgent, and done by someone learning the system under pressure.</p>
<p>The cost shows up as slower product decisions, as staff who route around the software instead of through it, and eventually as a proposal to rewrite the whole thing. Rewrites proposed for this reason are usually a purchase of ownership at the highest available price.</p>
<h2>What taking ownership looks like</h2>
<p>Ownership starts with understanding, not with changes.</p>
<p>The first weeks are spent reading code, mapping infrastructure, tracing how data moves, and writing down what nobody wrote down. We measure what the system actually does in production, because documentation and reality drift apart. We make a list of what is fragile and what is fine, and we resist the urge to fix things before the list is complete.</p>
<p>Then ownership becomes routine. Dependencies are updated on a schedule. Backups are tested, not assumed. Deployments become boring. Monitoring answers questions before users ask them. Changes have a known cost because someone knows the system.</p>
<p>None of this is glamorous. It is the difference between software that can be changed and software that can only be replaced.</p>
<h2>What we are arguing for</h2>
<p>Every piece of software that matters to a business should have a named owner who understands it and answers for it. If that owner is inside your organization, protect their time. If nobody fits the description, that is the problem to solve first; <a href="/software-takeover/">taking over an existing system</a> and <a href="/software-maintenance/">maintaining it long term</a> is the work AL+ exists for. Everything else, including whether to modernize, rewrite, or leave the system alone, is a decision an owner makes.</p>
]]></content>
  </entry>
  <entry>
    <title>Repair or rewrite?</title>
    <link href="https://alplustech.com/thoughts/repair-or-rewrite/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/repair-or-rewrite/</id>
    <published>2026-08-18T00:00:00.000Z</published>
    <updated>2026-09-10T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>A rewrite is a conclusion you reach after understanding a system, not a starting point. Most systems proposed for rewrite need an owner, a plan, and a few months of repair.</summary>
    <content type="html"><![CDATA[<p>A rewrite is a conclusion, not a starting point. Most systems proposed for a rewrite do not need it. They need an owner, a repair plan, and a few months of patient work. A few of them do need a rewrite, and the only way to tell the difference is to understand the system first.</p>
<h2>Why rewrites are proposed</h2>
<p>Rewrites are rarely proposed because a system is technically beyond repair. They are proposed because nobody on the current team understands the system, and rebuilding it feels like the only way to get that understanding back.</p>
<p>That is an honest motivation. It is also the most expensive way to achieve the goal. A rewrite recreates the knowledge by recreating the software, and everything the old system learned from years of production, every edge case and every fix, has to be learned again.</p>
<p>The second common reason is frustration. Slow changes, recurring incidents, and an unfamiliar stack make a fresh start attractive. The frustration is real. The remedy is usually ownership, not replacement.</p>
<h2>What we look at before deciding</h2>
<p>We do not answer the repair-or-rewrite question in the first meeting. We answer it after a review that covers five things.</p>
<p><strong>What the system does.</strong> Not what the documentation says or what the founder remembers. What it does in production, for which users, and how often. Many rewrites are scoped against imagined usage.</p>
<p><strong>Where the risk is.</strong> Which parts break, which parts nobody touches, and which parts hold data that cannot be lost. Risk is usually concentrated in a small part of the codebase.</p>
<p><strong>Whether it can be changed safely.</strong> Is there a way to deploy a change and know it worked? Are there tests, staging environments, backups, and rollbacks? If not, those come first regardless of the final decision, because a rewrite without them is a bigger version of the same problem.</p>
<p><strong>What the stack costs to keep.</strong> Frameworks and runtimes reach end of life. Hosting bills grow. Some stacks are hard to hire for. These are real costs, but they are measurable, and they are often smaller than a rewrite.</p>
<p><strong>What the business needs next.</strong> A system that needs three small features a year has different requirements from one that needs to double its capability. The rewrite decision depends on the destination, not only on the current state.</p>
<h2>When repair is the answer</h2>
<p>Repair is the answer more often than teams expect. The signs:</p>
<ul>
<li>The core data model is sound, even if the code around it is messy.</li>
<li>Problems are concentrated. Two or three modules cause most incidents.</li>
<li>The system is in production with real users, and the behavior they depend on is mostly undocumented.</li>
<li>The stack is old but supported, or can be upgraded in steps.</li>
</ul>
<p>Repair means establishing ownership, adding the safety equipment (tests around the risky parts, monitoring, reliable deployments), and then improving the system in place, one bounded change at a time. Users see stability first and improvements second. Nothing is thrown away until its replacement is proven.</p>
<h2>When a rewrite is the answer</h2>
<p>Some systems do need to be replaced. The signs are specific:</p>
<ul>
<li>The platform is unsupported and cannot be upgraded. A framework with no security fixes is a deadline.</li>
<li>The data model is wrong for what the business now does, and every feature fights it.</li>
<li>The system was built for a scale or a use case that no longer exists, and most of it is dead weight.</li>
<li>The cost of understanding it exceeds the cost of specifying it, which happens with generated or heavily copied code that has no coherent design.</li>
</ul>
<p>Even then, we rewrite in pieces where we can. A new system that takes over one responsibility at a time from the old one keeps the business running and keeps the decision reversible.</p>
<h2>A decision matrix</h2>
<p>The five review areas above reduce to a small table. Score each row for the system in front of you; the column with the most marks is the recommendation, and a single &quot;replace&quot; in the platform row overrides the rest.</p>
<table>
<thead>
<tr>
<th>Question</th>
<th>Points to repair</th>
<th>Points to modernize in place</th>
<th>Points to rewrite or replace</th>
</tr>
</thead>
<tbody>
<tr>
<td>Is the platform supported?</td>
<td>Yes, current versions</td>
<td>Yes, but several upgrade steps behind</td>
<td>No, and it cannot be upgraded</td>
</tr>
<tr>
<td>Does the data model fit the business?</td>
<td>Yes</td>
<td>Mostly; a few structures fight new features</td>
<td>No; every feature works around it</td>
</tr>
<tr>
<td>Is there a safe way to change it?</td>
<td>Yes</td>
<td>Partly; tests and rollback exist for some parts</td>
<td>No, and adding them costs more than the parts are worth</td>
</tr>
<tr>
<td>Where is the risk?</td>
<td>Concentrated in two or three modules</td>
<td>Spread across a layer that can be replaced alone</td>
<td>Everywhere; no coherent design to preserve</td>
</tr>
<tr>
<td>How much of it is still used?</td>
<td>Most of it</td>
<td>Most of it, with dead areas to delete</td>
<td>A minority; the rest serves cases that no longer exist</td>
</tr>
<tr>
<td>What does the business need next?</td>
<td>Small features and stability</td>
<td>Significant new capability on the same foundation</td>
<td>A different product</td>
</tr>
</tbody>
</table>
<p>Repair is <a href="/software-maintenance/">maintenance</a> with a plan. Modernizing in place is <a href="/services/ai-app-rescue/">our modernization service</a>. A rewrite is still done in pieces where we can, with the old system running until each piece has proven itself.</p>
<h2>The position</h2>
<p>Understand the system, make it safe to change, then decide. Teams that skip to the rewrite skip the part where they learn what they are replacing, and that knowledge is the most expensive thing to rebuild.</p>
]]></content>
  </entry>
  <entry>
    <title>Taking over software after the developer leaves</title>
    <link href="https://alplustech.com/thoughts/taking-over-software-after-the-developer-leaves/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/taking-over-software-after-the-developer-leaves/</id>
    <published>2026-08-04T00:00:00.000Z</published>
    <updated>2026-08-04T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>A practical sequence for inheriting a system whose builder is gone: secure access, understand production, write down what nobody wrote, then change things.</summary>
    <content type="html"><![CDATA[<p>When the developer who built your software leaves, the software does not change. Your relationship to it does. You now own a system nobody on your side understands, and the order in which you do the next things matters more than how fast you do them.</p>
<p>This is the sequence we follow when we take over a system in that state.</p>
<h2>First: secure access before anything else</h2>
<p>Before reading a line of code, collect and verify access to everything the system depends on: source control, hosting, domain registrar, DNS, databases, email sending, payment providers, third-party APIs, app store accounts, and monitoring. Confirm that each account is owned by the company, not by a personal address that left with the developer.</p>
<p>Rotate credentials the departed developer had. Do it carefully, one system at a time, with a way to roll back. A rushed credential rotation is the most common way a takeover causes its first outage.</p>
<p>Check billing. Systems fail months after a departure because a card on a forgotten account expired.</p>
<h2>Second: understand production, not the repository</h2>
<p>The repository tells you what the developer intended. Production tells you what is true. Start there.</p>
<ul>
<li>What is actually deployed, from which commit, and does the repository match it?</li>
<li>What runs on a schedule? Cron jobs, queues, and scheduled functions are where surprises live.</li>
<li>What talks to what? Map every external service, webhook, and integration.</li>
<li>What data exists, where, how large, and when it was last backed up? Then restore a backup somewhere safe to prove it works.</li>
<li>What do the logs and error trackers say has been failing quietly?</li>
</ul>
<p>This phase produces a map. It usually reveals two or three things that were one bad day away from failing.</p>
<h2>Third: write down what nobody wrote down</h2>
<p>Every inherited system has knowledge that lived only in the developer's head. Recover as much as you can while it is recoverable. If the developer is reachable and willing, a few paid hours of questions are worth more than weeks of archaeology. Ask about the decisions, not the code: why this database, why this hosting, what they would change, what they were afraid of.</p>
<p>Then write the operating manual the system never had. How to deploy. How to roll back. How to restore. Who to call at each external provider. Where the secrets live. It does not need to be long. It needs to exist and to be correct.</p>
<h2>Fourth: make one change safely</h2>
<p>Before any real work, make a trivial change and ship it through the full path: commit, review, test, deploy, verify, and know how you would undo it. If any step is missing or manual, fix that first. The ability to change the system safely is the foundation for everything else, and it is worth a week of effort even if the change itself is a typo in a footer.</p>
<h2>Fifth: address the fragile parts, then the wanted ones</h2>
<p>Now the map from step two becomes a plan. Expired certificates, unsupported dependencies, failing backups, and single points of failure come first. They are rarely what the business asked for and always what it needs.</p>
<p>Feature work starts after that. It goes faster than expected, because by now someone understands the system, and estimates are based on knowledge instead of hope.</p>
<h2>What to expect</h2>
<p>A takeover done in this order takes several weeks before the business sees a new feature. That is the cost of not doing it, made visible. Teams that skip to feature work inherit every risk the previous developer was silently managing and discover them one incident at a time.</p>
<p>The goal is not to replace the departed developer. It is to make the system not depend on any single person again. The full list of what to inspect is in <a href="/thoughts/codebase-takeover-checklist/">the codebase takeover checklist</a>, and <a href="/software-takeover/">software takeover</a> is the service when you would rather we did it.</p>
]]></content>
  </entry>
  <entry>
    <title>AI-built software still needs an engineer</title>
    <link href="https://alplustech.com/thoughts/ai-built-software-still-needs-an-engineer/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/ai-built-software-still-needs-an-engineer/</id>
    <published>2026-07-21T00:00:00.000Z</published>
    <updated>2026-10-24T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>AI changes how code is produced. It does not remove technical responsibility. Software generated quickly still needs someone who understands it and answers for it in production.</summary>
    <content type="html"><![CDATA[<p>AI changes how code is produced. It does not remove technical responsibility. A working application built in a week with AI tools has the same obligations as any other software in production: it has to stay up, protect its data, survive its dependencies, and be changeable by someone who understands it. Those obligations do not disappear because the code was cheap to write.</p>
<h2>What has actually changed</h2>
<p>Producing code used to be the expensive part. Now it is often the cheap part. A founder with a clear idea can have a functioning product without hiring a developer, and many do. That is a real change and mostly a good one. More things get built, and more of them get built by the people who understand the problem.</p>
<p>What has not changed is everything that happens after the code exists. Deployment, monitoring, backups, security updates, access control, performance under load, data migrations, and the slow accumulation of changes that a real business demands. This work was never about typing speed. It is about understanding a system well enough to be responsible for it.</p>
<h2>Where AI-built software gets into trouble</h2>
<p>The same problems repeat across AI-built systems. None of them are about code quality in the usual sense.</p>
<p><strong>Nobody can explain the system.</strong> The team can describe what they asked for. They cannot describe what they got. When something breaks, the debugging conversation starts from zero every time.</p>
<p><strong>The design is local, not global.</strong> Each feature was generated to satisfy its own prompt. Together they form a system with three ways of doing the same thing, duplicated logic, and data that lives in more places than it should. Each piece is reasonable. The whole is hard to change.</p>
<p><strong>Security is assumed.</strong> Authentication, authorization, input validation, secrets handling, and rate limiting are present in the form the tool produced by default, which may or may not be the form the business needs. Nobody checked, because nobody knew what to check.</p>
<p><strong>Operations were never designed.</strong> There is a deployment because the hosting platform made one. There are no backups, no alerts, no staging environment, and no plan for the day the database fills up.</p>
<p><strong>Dependencies are frozen.</strong> The generated project pinned whatever versions existed that week. A year later, several are unsupported, and upgrading means understanding code nobody has read.</p>
<h2>Who takes responsibility after the prototype?</h2>
<p>A tool does not take responsibility for operating the application. Agree who understands the system, checks proposed changes, receives alerts and can restore the data. Those responsibilities need named people and an agreed scope, however the first version was produced.</p>
<h2>What an engineer adds to AI-built software</h2>
<p>Not rewriting it. Usually the right move is to keep what works and add what is missing.</p>
<ul>
<li><strong>Understanding.</strong> Read the whole system and write down how it actually works, so the next change starts from knowledge.</li>
<li><strong>Coherence.</strong> Consolidate the three ways of doing one thing into one. Give the data one home.</li>
<li><strong>Safety.</strong> Review authentication and authorization by hand. Move secrets out of the code. Add validation where user input meets the database.</li>
<li><strong>Operations.</strong> Backups that are tested, monitoring that alerts a human, deployments that can be rolled back.</li>
<li><strong>A dependency plan.</strong> Upgrade what is unsupported, and schedule the rest.</li>
</ul>
<p>Future changes can then be checked against a system the team understands.</p>
<h2>The position</h2>
<p>Code has become cheap. Responsibility has not. Software that a business depends on needs an engineer who understands it and answers for it, however the code was produced. Getting that in place early costs far less than discovering its absence during an incident. The concrete criteria are in <a href="/thoughts/production-readiness-checklist-ai-generated-applications/">the production-readiness checklist for AI-generated applications</a>; our <a href="/services/ai-app-rescue/">application repair service</a> starts with the actual problems in the existing application.</p>
]]></content>
  </entry>
  <entry>
    <title>Maintenance is product work</title>
    <link href="https://alplustech.com/thoughts/maintenance-is-product-work/" rel="alternate" type="text/html"/>
    <id>https://alplustech.com/thoughts/maintenance-is-product-work/</id>
    <published>2026-07-07T00:00:00.000Z</published>
    <updated>2026-07-07T00:00:00.000Z</updated>
    <author><name>Paul</name></author>
    <summary>Most of a product&#39;s life happens after launch. Treating maintenance as a cost to minimize is how software quietly degrades and how the best improvements never get made.</summary>
    <content type="html"><![CDATA[<p>Most of a product's life happens after launch. A product that ships in six months and runs for six years spends more than ninety percent of its life in what most budgets call maintenance. Treating that time as a cost to minimize is how software quietly degrades, and how the improvements users would have valued most never get made.</p>
<h2>The accounting problem</h2>
<p>Building is a project. It has a start, an end, a budget, and someone who is proud of it. Maintenance is a line item. It has a monthly figure that someone tries to reduce every year.</p>
<p>This framing makes a strange claim: that the product was finished at launch and everything after is upkeep. No product that has users is finished. Users find the edges. The market moves. Dependencies change under it. The business learns what it actually needed, which is never quite what it specified.</p>
<p>The work that responds to all of that is product work. It happens to occur after launch.</p>
<h2>What maintenance actually contains</h2>
<p>When we maintain a system, the work falls into four kinds, and only one of them is what the word suggests.</p>
<p><strong>Keeping it running.</strong> Dependency updates, security patches, certificate renewals, backup verification, capacity, incident response. This is upkeep, and it is not optional. Skipping it is borrowing at a high interest rate.</p>
<p><strong>Keeping it correct.</strong> Fixing bugs, yes, but mostly noticing where the software's behavior has drifted from what users need. Reports that used to be right. Integrations whose other side changed. Edge cases that became common cases as the business grew.</p>
<p><strong>Keeping it changeable.</strong> Removing complexity that no longer earns its place. Simplifying the parts that every change has to pass through. Improving tests and deployments so that the next feature costs less than the last one. This work is invisible in the product and decisive for its future.</p>
<p><strong>Making it better.</strong> Small improvements informed by real usage: a faster page that people visit every day, a form that fails less often, a workflow with one step fewer. These are the highest-return changes in most products, and they are only visible to someone who is paying attention after launch.</p>
<p>A maintenance budget that covers only the first kind produces software that runs, drifts, hardens, and eventually gets rewritten.</p>
<h2>Why this matters for who does the work</h2>
<p>If maintenance is upkeep, it can go to whoever is cheapest. If maintenance is product work, it needs people who understand the product and its users, and who are trusted to make decisions.</p>
<p>We think the second view is correct, and it changes how we work. The people who maintain a system are the people who know it best. They should be the ones proposing what to build next, because they see where the friction is. They should have authority to remove things, not only to add them. And their time should be protected from being consumed entirely by the first kind of work, because the other three are where the value is.</p>
<h2>What we do about it</h2>
<p>When we take responsibility for a system, we plan maintenance as a product function. Upkeep is scheduled and boring. A share of every month goes to keeping the system changeable. And we keep a short list of small improvements drawn from real usage, worked through steadily.</p>
<p>The result is a system that gets better with age instead of worse, and a business that never has to fund a rewrite to buy back the years it spent minimizing the maintenance line.</p>
<h2>The position</h2>
<p>Launch is the beginning. Budget, staff, and pay attention to the years after it as the product work they are, and most of the reasons for rewriting software go away. This is the shape of <a href="/software-maintenance/">software maintenance as AL+ practices it</a>.</p>
]]></content>
  </entry>
</feed>
