SaaS DiaryA solo developer's diary of building and running software

A solo developer's work log

The errors I ran into, and how I fixed them

SaaS Diary is the work log of a solo developer who builds and ships apps and plugins. These English articles cover API pitfalls, numbers we measured, and the fixes that worked.

Latest articles

Tech logphp2shell (CVE-2026-109618 / 109619) can't be assessed with php -v: where version numbers diverge across FPM, Docker and distrosWhether php2shell affects you depends on the version of the PHP that handles web requests. php -v reports only the CLI version. Docker images stay old until you pull and recreate. Ubuntu and RHEL ship fixes under old numbers such as 8.3.6 and 8.0.30. This article includes a table of fixed packages as of 2026-10-22 and commands to check your own server. Tech logSeparate inventory adjustment gains and losses in Odoo 19 and 20 (Stock Valuation Account Incoming and Outgoing are gone)Odoo 19 and 20 have one Loss Account on the Inventory adjustment location, so counts that find stock and counts that lose stock both post there and the profit and loss shows only the net. What changed from Odoo 18, the debit and credit of each case, the manual workaround, and a Gain Account next to the Loss Account. Tech logHow to add a search bar that shows products as you type on WixThe no-code way to show products as visitors type on Wix: install Live Product Search Bar and drag it into your header. Suggestions with photo, name and price appear from the first letter, small typos are forgiven, and new or deleted products are reflected for the next visitor. Tech logHow to let members delete their own account on Wix (and their contact, for GDPR)The no-code way to let Wix site members delete their own account: install Delete Member Account and place its Delete Account Button on your members' account page. Members see what will be deleted, confirm twice, and are logged out; you can have their contact deleted too. Also below: what Wix does on its own, and the code route. Tech logHow to approve Wix members automatically (and bulk approve pending members)The no-code way to approve Wix site members automatically: keep signups on "Only people I approve", install Member Approval Rules and add the addresses or, with Pro, the domain you expect. Listed people are approved once they confirm their email; everyone else waits in one list you can approve or block in bulk. Also below: what Wix does on its own, and the code route. Tech logHow to only allow business emails on a Wix form (block Gmail, Yahoo and disposable addresses)The no-code way to accept work addresses only on the Wix Forms form you already have: Business Email Only refuses Gmail, Yahoo, Outlook and other free email from many countries plus 9,226 disposable domains, with your message under the email field, partner exceptions and a test box. One form is free. Also below: what Wix Forms' own validations can do. Tech logKPI dashboard for Odoo Community 20: shared dashboards from any list or pivot, where each user sees only their own numbersOn Odoo 20 Community you can view ready-made dashboards but not build your own or share one with your team. An add-on turns any list, pivot or graph into a number card or chart from the gear menu, and counts every card with the viewer's own access rights, so salespeople see only their own totals. Tech logHow to limit a Wix form to one submission per email (Wix Forms)The no-code way to allow one submission per email on the Wix Forms form you already have: install One Submission Per Email, tick the form and save. A repeat is not saved and your message appears under the email field, and one form is free. Also below: what Wix Forms limits on its own, and the ways that need code. Tech logAI assistant for Odoo Community: ask your Odoo data in plain English with your own OpenAI, Claude or Gemini key (Odoo 20)Odoo 20 Community has no AI assistant that answers questions about your records. To ask "What were confirmed sales per month this year?" inside Odoo, you need an add-on that uses your own OpenAI, Claude, Gemini or Ollama key. What to check first: read-only, the asking user's rights, no SQL, and answers you can open in Odoo. Tech logStop salespeople changing the unit price and hide cost in Odoo 17 to 20Odoo Community (17 to 20) has no setting to make Unit Price read-only for salespeople or to hide the product cost from them: cost and margin are open to every internal user, and a field made read-only in the form view can still be changed by import or API. What standard Odoo offers, the free workarounds, and how to enforce the rule on the server. Tech logMake AI agent changes in Odoo wait for approval (ChatGPT, Claude, MCP, n8n, Odoo 20)Odoo 20 has no approval step for API calls outside purchases: JSON-2, XML-RPC and JSON-RPC run the method as soon as the key is checked, and confirming an order or posting an invoice needs no more than ordinary Sales or Billing rights. What standard Odoo offers, free ways to limit an AI agent, and how to make its changes wait for a person. Tech logWhen was an Odoo API key last used? Find unused keys and limit API calls (Odoo 20)An Odoo 20 API key stores its description, user, scope, creation date and expiration date, and nothing about its use. Latest Login on the user changes only for some clients, the server log does not name the key, and Odoo has no limit on calls per key. What each source shows, free ways to keep keys under control, and how to see the last call, IP address and daily calls of every key. Tech logHow to see what ChatGPT, Claude or an MCP server changed in Odoo (Odoo 20)Standard Odoo 20 keeps three traces of an API change: the Last Updated by field, chatter tracking on tracked fields, and one line per call in the server log. None of them names the API key, and deleting a record also deletes its chatter. What each trace shows, a free setup that makes them more useful, and how to keep the previous values of the changes an AI agent makes. Tech logRead-only Odoo API key for ChatGPT, Claude or an MCP server (Odoo 20)In Odoo 20 Community the only scope a new API key can get is RPC, and a key acts with every right of its user: on 2026-10-09 the same key that read orders also confirmed them through /json/2/sale.order/action_confirm. The free way to limit an AI agent is a dedicated user; where that stops, and why an ordinary update from an agent can remove order lines.

What we build

Free calculators

Pricing calculators for handmade sellers and small shops. They open in the browser, with no sign-up.

Open the tools

Android games and utility apps

Puzzle games and on-the-job calculators for plumbing, embroidery, paint mixing and more, free to download on Google Play.

See on Google Play

About this site

GRAMSHIFT

SaaS Diary is run by GRAMSHIFT, a small independent studio that makes Android games, utility apps and plugins for business software. Most topics come from things we actually build and run, and almost all of the writing is done by AI (Claude).

Author profile → (Japanese)

日本語の記事はこちらです。

日本語のトップへ