By : Deep42Co Published On Sunday, November 15, 2026, 00:13 In PHP Scripts
Krikkit is a self-hosted AI website builder you run as your own SaaS. Your users describe the site they want, watch it take shape in a live workspace, and publish the result on your domain — while you decide the plans, the credits, and the prices. One purchase, your brand, your business.







Here is what makes Krikkit different: the entire build engine runs inside the visitor’s browser. Package installs, the dev server, the live preview and the production build all happen client-side. Your server only serves the Laravel app and stores project files.
If your hosting can run Laravel, it can run Krikkit.
Full documentation is available at doc.deep42.co. For product support, reach us on the Deep42 Support Hub.
ADDON: OpenRouter. One API key for Lab chat, OpenAI-compatible models, usage returned on the response ADDON: Cloudflare AI Gateway. Account ID plus a Workers AI token. Lab chat goes through that account's gateway ADDON: Flutterwave. Cards and mobile money, secret-hash webhooks, verified return ADDON: Paystack. Cards, bank transfer, and mobile money, signed webhooks, verified return NEW: Auth settings. Email verification, password rules, and hashing from the dashboard NEW: Clear settings. Clear caches from the dashboard without a shell NEW: Studio folders. Create, rename, open, and delete. Deleting a folder keeps the projects. Access can be gated by pack NEW: Bug reports from the dashboard NEW: Dashboard command palette in place of dashboard search IMPROVEMENT: OpenRouter and Cloudflare AI Gateway are marked as proxies IMPROVEMENT: GDPR cookie banner shows on the Flow landing IMPROVEMENT: Runs heatmap day columns share one grid IMPROVEMENT: Documentation for updating, prompt files, folders, onboarding, Auth, GDPR, License, and Clear FIX: resources/prompts markdown files are in the package again. The 2.2.0 and 2.2.1 zips omitted them, which showed in Lab as "Prompt file missing" FIX: Invoice PDF templates are back, same size as in 2.1: resources/views/vendor/invoices/templates/krikkit.blade.php and default.blade.php FIX: Installer steps are back: environment, migrations, permissions, requirements, and the installer layout FIX: Invoice language lines are back for ar, bg, cs, de, en, es, fr, it, nl, pl, and ro FIX: public/vendor/invoices/sample-logo.png is back FIX: English invoice labels use Issued by, Billed to, and Tax ID. The Krikkit PDF uses DejaVu Sans at 11px, with a seller and buyer table and a due band FIX: A Razorpay return fulfills the payment locally. Opening the link stores checkout.razorpay_link plus plan_public_id, plan_slug, and interval FIX: claimRazorpayReturn requires a plink_ id, fetches the link, and checks notes.user_public_id against the signed-in user when that note is set. Status must be paid FIX: If the link notes omit the plan, the session values fill them. Amount is amount_paid or amount. Currency is uppercased and defaults to INR FIX: The payment id is the last captured or authorized row. Otherwise it is the signed pay_ query parameter FIX: The callback signature is HMAC-SHA256 of link_id|reference_id|status|payment_id with the key secret, compared with hash_equals FIX: After a successful fulfill, billing.paid is set and those checkout session keys are cleared. paymentLink() is the only fetch FIX: Apache sets Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: credentialless on /lab, so the threaded WASI worker can use SharedArrayBuffer FIX: __worker__.js and labRuntime-*.js send Cache-Control: no-cache, must-revalidate FIX: WASI text reads always copy. A shared buffer from another realm fails instanceof SharedArrayBuffer and TextDecoder threw on it FIX: random_get no longer fails the syscall. If crypto.getRandomValues is missing it uses Math.random bytes, then tries once more. Lightningcss and oxide abort the dev server on EIO FIX: A product brief with no URL or known domain skips web research FIX: While the workspace is closed, discovery sends no tools and tool_choice is none. If the model still returns a research tool, those calls are dropped FIX: On tool_start and tool_end, arguments.content longer than 64 KB is removed from that event. The full body stays on done, so a proxy cannot split the SSE line FIX: json_encode uses JSON_INVALID_UTF8_SUBSTITUTE and JSON_THROW_ON_ERROR. U+2028 and U+2029 are escaped. If encoding throws, that event is not sent FIX: A JSX default export that parses and never returns is rejected as MissingReturn FIX: Lab and Preview scan the same file and report "returns nothing, so the preview stays blank". The error clears once the component returns FIX: Preview chrome is revision 49. Fatal guest errors now include "nothing was returned from render", "return statement is missing", "does not provide an export named", and "failed to resolve import" FIX: A single wrapper inside Routes (main, div, Header, Footer) is moved outside. Direct children are only Route or a fragment FIX: "is not a Route component" triggers the router heal. The repair target is the file that renders Routes, preferably src/App.jsx, not a Routes.jsx that was never created FIX: Host names stay host names: Routes, Route, Link, NavLink, Outlet, Navigate, MemoryRouter, BrowserRouter, HashRouter, Router, ScrollRestoration, StrictMode, Suspense, Fragment, Profiler. react-router-dom and lucide-react frames stay package frames even when the function is PascalCase FIX: ../../lib/utils is correct only inside src/components/ui. The same string from src/components/SurveyApp.jsx resolves outside src. Depth is rewritten on write and in a Vite pre plugin. If src/lib/utils.js is missing, the canonical file is written. "failed to resolve import … lib/utils" is a cn heal FIX: A matched React pair such as 19.3.0 and 19.3.0 is still rejected. The module cache can keep react-dom on 19.1.1 and break the preview. react and react-dom always use the Lab pin FIX: Install leaves an existing folder in place, so both packages are removed first. .vite stays until the new files exist. react-dom is not installed unless index.js and a client entry exist FIX: @tailwindcss/node is not a direct package.json dependency. It is installed at the same version as the installed @tailwindcss/vite, so esbuild publish does not fail with "Cannot find module" FIX: @import lines move to the top of the stylesheet. Remote imports (Google Fonts, url(, https:) come before package imports. An already-correct order stays byte-identical FIX: Cut-off CSS is rejected as TruncatedCss. Vite gets the krikkit-hoist-css-imports pre plugin. Guest sync runs stylesheets through the same normalize FIX: A follow-up no longer locks tool_choice to write_file. That skipped the thought and rewrote Header, Footer, Hero, and main. The system line is: the latest message is one task, one control, one file FIX: The first two follow-up looks are not forced to write. Tool events wait until a thought arrives, so "Reading" no longer paints first. A write_file with no body is not painted FIX: readFile, listDir, and search cards go to done when the call finishes, so the chip does not keep spinning. Thinking chrome stays while status is streaming, or done with a duration above 0, even if the thought text is empty FIX: A rejected write no longer skips the recap. If a path failed, a recap is still requested. If the text does not name the file, it is requested again. Fallback: "Could not update the file. That change is not in Preview yet." FIX: Closed and cut-off code fences are removed from the chat bubble. MODE=, ALLOWED_TOOLS=, FORBIDDEN=, and DONE_WHEN= lines are removed. A recap glued after the first sentence of ASK= stays FIX: A "path" / "content" file map glued onto a recap keeps the prose in front of it. An empty bubble is not drawn FIX: working-notes and working_notes count as thought. A private_ tag is dropped and the sentence stays. In thought text, a tool name is redacted instead of deleting the sentence. survey_datastore and revise_datastore are in that tool-name list FIX: A stub that nothing imports does not land on disk. A stub imported by a file that is landing is committed with it, or Vite reports "failed to resolve" FIX: An empty or rejected module becomes an empty default export that returns null when the body is under 200 characters, instead of "no default export" FIX: Product-stub scan includes src/sections. "Ready to get started?" plus "Book your appointment today" is not a finished section. The glow-only hero reject is gone. The reject text is to rewrite the file as the interface the user asked for FIX: .env, .env.local, .env.development, and .env.development.local are on the root writable list FIX: thought is the only private tag. A second note tag is not allowed. Direct children of Routes are only Route. cn from ui/ is ../../lib/utils; from components, sections, and pages it is ../lib/utils FIX: A marketing hero is no longer required. A job board is search, filters, cards, and a detail panel. The prompt does not invent a dashboard mock the brief did not ask for
ADDON: Knowledge. Public help center. Collections are headings, articles sit under them, readers can search ADDON: Tickets. Customers open tickets from their account. Staff assign, reply, and track them in the dashboard NEW: Lab CDN proxy. Compiler binaries load from the Krikkit origin via /lab-cdn when the browser rejects the CDN certificate FIX: The first Lab reply is kept when the model glues its planning line onto the sentence FIX: Hidden scratch stays hidden: thought blocks, working notes, and invented tags such as private_prose no longer appear in chat. The recap does FIX: Preview status is error, not live, while the guest app is crashed FIX: A section import marked resolved is actually saved, so Vite no longer dies with "does the file exist?" FIX: Hero and other section files are no longer rejected for looking like a marketing poster. The brief is what gets written FIX: A component that returns nothing is reported. React 19 otherwise paints a blank page and logs nothing FIX: React and react-dom stay on 19.1.1. The preview no longer 504s lucide-react while dependencies rebuild, and no longer crashes on a missing react-dom/index.js FIX: Routes only wraps Route. The error card points at the file that contains the router, not a component file that was never created FIX: Font @import lines are moved to the top of the stylesheet so Tailwind CSS applies FIX: cn() imports copied at the wrong folder depth are rewritten to src/lib/utils