Skip to main content

Field notes · the studio's working playbook

Things that break.

HTTP error codes with copy-paste Base44 prompts that fix them. Five workarounds for when the chat session freezes. The complete push-notification setup — service worker, manifest, VAPID, install flow — written down once so you don't have to figure it out yourself.

Section 01 · Errors

When the request fails. One prompt to fix each.

Pick an error code or symptom. The right panel shows what it usually means, the steps to fix it, and an AI prompt you can copy and paste straight into Base44 chat — the studio uses these every week.

Error 429 · Too Many Requests

You hit the rate limit on an API or your own backend. The fix is almost always client-side throttling or server-side caching.

Common causes

  • ·A useEffect firing on every render and calling an API
  • ·No debounce on a search input
  • ·Polling every 1 - 2 seconds instead of using websockets / SSE
  • ·Calling an LLM endpoint per keystroke instead of per submit

Steps to try

  1. Find the calling code in DevTools → Network → look for the repeated request
  2. Add useCallback / debounce / a stable dependency array
  3. Cache the response with React Query (staleTime: 5 minutes)
  4. If hitting a third-party API: implement client-side rate limiting

AI fix prompt · paste into Base44 chat

Look at the network tab — I'm getting a 429 Too Many Requests on [ENDPOINT]. Add proper rate limiting:
1. If the call is in a useEffect, audit its dependencies and wrap the handler in useCallback
2. If it's user-input driven, add a 400ms debounce
3. If it's a list fetch, switch to React Query with staleTime: 5 * 60 * 1000
4. Add exponential backoff on retries: 1s, 2s, 4s, give up after 3 attempts
Show me the changed code with comments explaining what you did.

Section 02 · Stuck sessions

When Base44 chat freezes. Five things that actually work.

Sometimes the chat hangs mid-turn. The work isn't lost — the session state is server-side. Here are the five workarounds that have unfrozen us, in roughly the order to try them.

01

Switch the LLM model in the chat selector

Each Base44 chat session is tied to a model. If Sonnet is stuck on a turn, switch to Opus, Haiku, or GPT-5 — the new model often picks up the conversation cleanly. Sometimes you need to switch back after one message.

02

Use the Visual Edit trick

Open Visual Edit on any element, make a tiny one-pixel change (e.g. padding: 17px), save. The chat unfreezes because the underlying file has changed and a new agent turn is triggered.

03

Open the same chat on a different device

A stuck mobile session often resumes on desktop, and vice versa. The session state is server-side — the client cache is the thing that froze.

04

Try a fresh browser or incognito

Service workers + stale localStorage can wedge the chat. A fresh window with no cached state usually clears it. Make sure you're still logged in.

05

Refresh + re-prompt with explicit instructions

Hard refresh (Cmd+Shift+R), then send: "Continue the previous turn. The last thing you wrote was [PASTE THE LAST FEW WORDS]. Pick up from there." This usually works on the second try.

Section 03 · Push notifications

Install-to-home-screen + push. The full walkthrough.

The complete recipe for adding PWA install + push notifications to a Base44 app. Service worker, manifest, install flow, settings panel, VAPID keys, test on every platform. One prompt you can paste at the bottom.

01

Decide what you actually want to notify users about

Before writing any code — list the categories. "All notifications on/off" is mandatory. Then specifics: drafts ready, builds shipped, account updates, marketing (always opt-in, never bundled). Bad notification taxonomy = uninstalls.

02

Ask Base44 to add PWA + push support

Use the prompt below. The key parts: a service worker, an install prompt that respects iOS (Share → Add to Home Screen) vs Android (beforeinstallprompt), a settings panel for category toggles, and a test notification button.

03

Generate VAPID keys locally

In your terminal: `npx web-push generate-vapid-keys`. Copy the public key + private key. The public key goes in your frontend env (VITE_PUSH_VAPID_PUBLIC_KEY). The private key goes in your BACKEND secrets — never expose it in frontend code.

04

Wire the subscription endpoint

Each user who opts in produces a PushSubscription object. Send it to your backend, store it on the user record. When you want to send a push, your backend uses the `web-push` Node library with the subscription + your VAPID private key.

05

Test on every platform before launch

Web (Chrome desktop), Android (installed PWA), iOS (must be installed to Home Screen, iOS 16.4+). The test notification button in your settings panel makes this easy — fire and confirm on each device.

VAPID quick reference

  1. Open your terminal.
  2. Run: npx web-push generate-vapid-keys
  3. Copy the public key and the private key.
  4. Set VITE_PUSH_VAPID_PUBLIC_KEY in your frontend env.
  5. Set VAPID_PRIVATE_KEY + VAPID_SUBJECT=mailto:you@example.com in your backend secrets.
  6. Never put the private key in frontend code or commit it to git.

Base44 prompt · paste straight into chat

Add push notifications to this app. Implement it as a proper PWA feature, not a hidden browser permission request. Specifically:

1. Service worker at /sw.js handling push events (showNotification) + notificationclick (focus or open the target URL)
2. Manifest at /manifest.json with proper icons (192, 512, 180 apple, 512 maskable), display: standalone, theme color
3. An install prompt component that:
   · On Android/desktop: catches beforeinstallprompt and shows an Install button on user action (NOT on page load)
   · On iOS: shows the Share → Add to Home Screen instructions
   · Tracks "user dismissed" in localStorage so we don't nag
4. After install (or if already installed): a follow-up prompt asking about push notifications. NEVER auto-request — only on explicit click.
5. A /settings/notifications page with:
   · Master on/off toggle
   · Category checkboxes (drafts_ready, project_updates, code_red, invoice_status, marketing — marketing default off)
   · Test notification button that fires a local notification via reg.showNotification()
6. Use VAPID keys from environment: VITE_PUSH_VAPID_PUBLIC_KEY in frontend, VAPID_PRIVATE_KEY + VAPID_SUBJECT in backend secrets. Never expose private key in frontend.
7. Persist each user's subscription server-side, linked to user ID

Test on Chrome desktop, Android PWA, iOS PWA before declaring done.

Settings categories that earn opt-ins

  • · All push notifications on/off (master toggle)
  • · Achievements / milestones
  • · New content available (e.g. new lesson)
  • · Streak + daily reminders
  • · Comments, messages, replies
  • · Order / booking / status updates
  • · Important account or app updates
  • · Marketing as a separate opt-in — default off
  • · Test notification button