<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Haeminway — Turn your monthly SaaS bill into zero with custom automation</title><description>Instead of subscription SaaS, I build one automation tool that fits your work and runs with no upkeep, inside the Google account you already have, so there&apos;s no server bill. (Bulk and enterprise scale are the exception.)</description><link>https://haeminway.com/</link><language>en-US</language><item><title>Cut Your Monthly SaaS Bill: Rent vs Own Your Automation</title><link>https://haeminway.com/en/guide/saas-cost-rent-vs-own/</link><guid isPermaLink="true">https://haeminway.com/en/guide/saas-cost-rent-vs-own/</guid><description>A SaaS subscription is a fixed cost you rent every month. Build the same job once as a tool that runs inside your own Google account and small-scale upkeep is near zero — though never 100% always free. How to decide rent vs own.</description><pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate><category>guide</category><category>Guide</category><category>Cost</category><category>Subscription</category><category>Ownership</category></item><item><title>How Adding AI Changes Your Upkeep: The One Exception to Zero</title><link>https://haeminway.com/en/guide/ai-cost-and-keys/</link><guid isPermaLink="true">https://haeminway.com/en/guide/ai-cost-and-keys/</guid><description>GAS automation runs at zero, but adding AI introduces one variable cost: per-call usage. It&apos;s usually pennies. Decide model, volume, and whose key up front and it&apos;s predictable. Watch the data leaving your account and keep a human approval gate.</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><category>guide</category><category>Guide</category><category>Cost</category><category>AI</category><category>Free Tier</category></item><item><title>Automating Your Work with Google Apps Script — The Complete Guide</title><link>https://haeminway.com/en/guide/apps-script-automation-guide/</link><guid isPermaLink="true">https://haeminway.com/en/guide/apps-script-automation-guide/</guid><description>How to automate repetitive work — orders, bookings, inventory, settlement, field input — with Google Apps Script (GAS). What it does, how far it stays free, and where it hits limits, in one place.</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><category>guide</category><category>Guide</category><category>Apps Script</category><category>Cost</category><category>Limits</category></item><item><title>An App Where Many Write to One Sheet: Concurrency, Duplicates, and Export Design</title><link>https://haeminway.com/en/notes/shared-sheet-inspection-app/</link><guid isPermaLink="true">https://haeminway.com/en/notes/shared-sheet-inspection-app/</guid><description>The places I actually got stuck building the CheckReport Demo, with the code. Concurrent saves to a shared sheet are blocked with ScriptLock + an idempotency key, cells hold only metadata, and exports are cut off with a time budget. Good code and bad code, side by side.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><category>notes</category><category>Apps Script</category><category>Concurrency</category><category>Sheets</category><category>Architecture</category><category>LockService</category><category>Export</category></item><item><title>How a Multi-User Inspection App Is Different</title><link>https://haeminway.com/en/guide/field-inspection-app-pattern/</link><guid isPermaLink="true">https://haeminway.com/en/guide/field-inspection-app-pattern/</guid><description>A single-user app just needs a screen. An inspection app where several people write the same data hinges on sharing, collisions, and reports. Even so, narrow the scope and you can start with GAS, Sheets, and Drive at no running cost. There&apos;s a public demo you can try yourself.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><category>guide</category><category>Usage Guide</category><category>Field Entry</category><category>Inspection</category><category>Apps Script</category><category>Cost</category></item><item><title>Don&apos;t Read Cells One at a Time: Service Calls Are the Real Cost</title><link>https://haeminway.com/en/notes/batch-service-calls/</link><guid isPermaLink="true">https://haeminway.com/en/notes/batch-service-calls/</guid><description>In GAS the slow part isn&apos;t JavaScript, it&apos;s service calls to Sheets and Drive. Swap in-loop getValue/setValue for batched getValues/setValues and it&apos;s tens of times faster.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><category>notes</category><category>Apps Script</category><category>Performance</category><category>Sheets</category><category>Pitfall</category></item><item><title>Stuffing JSON or Images into a Sheet Cell Will Break It</title><link>https://haeminway.com/en/notes/sheet-cell-json-limit/</link><guid isPermaLink="true">https://haeminway.com/en/notes/sheet-cell-json-limit/</guid><description>A Google Sheets cell caps at 50,000 characters. Put a photo or signature in a record row as a data URL and the save breaks. Keep only metadata in the cell.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><category>notes</category><category>Apps Script</category><category>Sheets</category><category>Pitfall</category><category>Serialization</category></item><item><title>Inventory in Google Sheets: How Far Automation Goes</title><link>https://haeminway.com/en/guide/spreadsheet-inventory-limits/</link><guid isPermaLink="true">https://haeminway.com/en/guide/spreadsheet-inventory-limits/</guid><description>One store or warehouse: stock in/out, low-stock alerts, and settlement: is fine with Sheets automation. Tens of thousands of SKUs and real-time multi-site is the limit.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><category>guide</category><category>Guide</category><category>Inventory</category><category>Cost</category><category>Limits</category></item><item><title>One Deploy Setting Decides Your Security Model: Execute as / Access</title><link>https://haeminway.com/en/notes/execute-as-and-access/</link><guid isPermaLink="true">https://haeminway.com/en/notes/execute-as-and-access/</guid><description>The &apos;execute as&apos; × &apos;who can access&apos; combination sets data permissions and whether your code is exposed. Public apps need their own app-level auth.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><category>notes</category><category>Apps Script</category><category>Deploy</category><category>Security</category><category>CORS</category></item><item><title>The 6-Minute GAS Limit: Chunk and Resume Before It Kills You</title><link>https://haeminway.com/en/notes/six-minute-limit/</link><guid isPermaLink="true">https://haeminway.com/en/notes/six-minute-limit/</guid><description>Apps Script kills any single run at 6 minutes. Design bulk jobs as chunk + cursor + time-trigger resume, or you get the half-processed-data accident.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><category>notes</category><category>Apps Script</category><category>Quota</category><category>Triggers</category><category>Pitfall</category></item><item><title>The Truth About Zero Upkeep: Why It&apos;s Free, and the Exceptions</title><link>https://haeminway.com/en/guide/truth-about-zero-cost/</link><guid isPermaLink="true">https://haeminway.com/en/guide/truth-about-zero-cost/</guid><description>It&apos;s free because there&apos;s no server to rent. Small workloads fit the Google free quota. Bulk sending, org features, and paid external APIs are the exceptions.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><category>guide</category><category>Guide</category><category>Cost</category><category>Free Tier</category><category>Limits</category></item><item><title>PropertiesService Is Not a Database: the 9KB Wall</title><link>https://haeminway.com/en/notes/properties-cache-limits/</link><guid isPermaLink="true">https://haeminway.com/en/notes/properties-cache-limits/</guid><description>A Properties value caps near 9KB. Cache only data you can lose. Big state goes to Sheet, Drive, or an external DB. Plain JSON loses types.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><category>notes</category><category>Apps Script</category><category>Data</category><category>Cache</category><category>Serialization</category></item><item><title>Why Saving a Screen as an Image Freezes on Mobile</title><link>https://haeminway.com/en/notes/mobile-canvas-export/</link><guid isPermaLink="true">https://haeminway.com/en/notes/mobile-canvas-export/</guid><description>Capturing the DOM via SVG foreignObject freezes or returns a blank image on mobile Safari and the GAS iframe. Draw to canvas directly, and download via Web Share.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><category>notes</category><category>Apps Script</category><category>Mobile</category><category>Canvas</category><category>Pitfall</category></item><item><title>Outsource vs Build vs SaaS: Compared by Cost</title><link>https://haeminway.com/en/guide/outsource-vs-build-vs-saas/</link><guid isPermaLink="true">https://haeminway.com/en/guide/outsource-vs-build-vs-saas/</guid><description>Three different cost structures. SaaS bills monthly, building costs your time, commissioning costs once. Standard features favor SaaS; tailored long-term use favors commissioning.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><category>guide</category><category>Guide</category><category>Cost</category><category>Comparison</category><category>Decision</category></item><item><title>Concurrent Writes to the Same Sheet Break: LockService and the 30-Run Ceiling</title><link>https://haeminway.com/en/notes/lockservice-concurrency/</link><guid isPermaLink="true">https://haeminway.com/en/notes/lockservice-concurrency/</guid><description>When users and triggers write the same asset, numbers collide and rows get overwritten. Guard with tryLock + finally + flush, and design for the 30-per-user concurrency ceiling.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><category>notes</category><category>Apps Script</category><category>Concurrency</category><category>LockService</category></item><item><title>Your /exec URL Must Not Change on Every Redeploy</title><link>https://haeminway.com/en/notes/stable-deploy-url/</link><guid isPermaLink="true">https://haeminway.com/en/notes/stable-deploy-url/</guid><description>Reuse the deployment ID when you push a new version with clasp and the /exec URL stays fixed. Guard shared sheet writes with LockService.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><category>notes</category><category>Apps Script</category><category>Deploy</category><category>clasp</category><category>Concurrency</category></item><item><title>External Calls Fail Sometimes: Exponential Backoff and a Retry Budget</title><link>https://haeminway.com/en/notes/retry-backoff/</link><guid isPermaLink="true">https://haeminway.com/en/notes/retry-backoff/</guid><description>Transient failures like 429, 503, and timeouts can be recovered by retrying. But never retry a non-idempotent write without an idempotency key, and stop before 6 minutes.</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><category>notes</category><category>Apps Script</category><category>Concurrency</category><category>Retry</category><category>External API</category></item><item><title>HtmlService Apps: Shell First, Then Async Load and Mobile Back</title><link>https://haeminway.com/en/notes/htmlservice-async-history/</link><guid isPermaLink="true">https://haeminway.com/en/notes/htmlservice-async-history/</guid><description>Loading data in the template delays first paint. Draw the shell first and load via google.script.run, but attach a failure handler to every call.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><category>notes</category><category>Apps Script</category><category>HtmlService</category><category>Mobile</category><category>Frontend</category></item><item><title>When to Graduate from GAS: Limit Signals and Moving to an External DB</title><link>https://haeminway.com/en/notes/when-to-leave-gas/</link><guid isPermaLink="true">https://haeminway.com/en/notes/when-to-leave-gas/</guid><description>GAS is strong at short automation and weak at long-running, high-volume, high-concurrency work. Quotas are shared per account. Know the signals and plan the move.</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><category>notes</category><category>Apps Script</category><category>Scaling</category><category>Quota</category><category>Architecture</category></item><item><title>Adding a Brain and an Engine Room to GAS: Vertex AI and Cloud Run</title><link>https://haeminway.com/en/notes/vertex-and-cloudrun/</link><guid isPermaLink="true">https://haeminway.com/en/notes/vertex-and-cloudrun/</guid><description>Add classification, summary, and drafts by calling Vertex AI (Gemini) straight from GAS. Hand heavy work that exceeds 6 minutes to Cloud Run. A human-approval gate stays mandatory.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><category>notes</category><category>Apps Script</category><category>Scaling</category><category>Vertex AI</category><category>Cloud Run</category></item></channel></rss>