neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
Build an installable progressive web app in minutes — no code required
Translation pending
Developer toolsTypeScript · JavaScriptGitHub @viraoneOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
A no-code, multi-tenant Progressive Web App builder (a Beezer-style product, branded TapAndLaunch).
This repo covers Phases 1–6 of a phased build — see
Scope before assuming something is here that isn't.Read the full README ↗A no-code, multi-tenant Progressive Web App builder (a Beezer-style product, branded TapAndLaunch). This repo covers Phases 1–6 of a phased build — see Scope before assuming something is here that isn't.
Operations and setup docs (services, settings, payments, email, push, deploying, runbooks) are in docs/.
@dnd-kit for the builder's drag-and-drop canvassrc/components/dashboard/charts/web-push for Web Push/VAPID (the one real crypto library dependency in
this repo — see the note in lib/notifications/push.ts on why, unlike
password hashing or session tokens, this wasn't worth hand-rolling); email
and SMS go straight to Resend's and Twilio's HTTP APIs via fetch, no SDK
for eitherlib/domains/vercel.ts,
plain fetch calls, no SDK) — the decision picked over Cloudflare for
SaaS was Vercel specifically because this app is assumed to deploy there;
see that file's own caveat on what hasn't been exercised against a real
accountNext.js 16 note: this scaffold uses a newer Next.js than most training data / tutorials reflect —
middleware.tsis renamed toproxy.ts,params/searchParamsare Promises everywhere, and there are new typed helpers (PageProps,LayoutProps,RouteContext). Checknode_modules/next/dist/docs/before assuming an API from memory.shadcn/ui note: this registry generation is built on Base UI, not Radix — polymorphic composition is
<Button render={<Link .../>} />, not<Button asChild><Link /></Button>.Supabase package pins:
@supabase/supabase-jsand@supabase/ssrare pinned to2.109.0/0.7.0(not^latest) because `@supabase/supabase-js=2.110.0
requires Node 22, and this was scaffolded against Node 20. Both pinned versions use the samegetAll/setAllcookie API this code is written against. If your deploy target is on Node 22+, upgrading both is anpm install @supabase/supabase-js@latest @supabase/ssr@latest` away — no code changes needed unless a later major changes that cookie API.
.env.local.example to .env.local, fill in the three Supabase
values from Project Settings → API, and generate MEMBER_SESSION_SECRET
with openssl rand -hex 32. Notification channels are each optional —
see the comments in .env.local.example for VAPID (push), Resend
(email), and Twilio (SMS); leave any of them blank to leave that channel
disabled (the compose UI marks it "not configured" instead of failing).app-assets Storage
bucket used for image/icon/logo uploads — see 0002_storage.sql):
supabase link --project-ref <your-project-ref>
supabase db push
The schema gives the API roles their table rights in 0009_api_grants.sql, and every new table needs row-level security turned on.npm install && npm run dev
(the first dev/build run also generates .next/types, which is where
the ambient PageProps/LayoutProps/RouteContext helpers this repo
uses come from — a bare tsc --noEmit on a fresh clone before that has
run will fail to resolve them; run npx next typegen once if you need
type-checking before your first dev/build.)http://localhost:3000, sign up, create an organization, create an
app, and open its builder.http://{app-slug}.localhost:3000 (subdomains of localhost work
in modern browsers, and with curl -H "Host: {app-slug}.localhost:3000" http://localhost:3000).VERCEL_API_TOKEN/VERCEL_PROJECT_ID (and
VERCEL_TEAM_ID if the project belongs to a team) once it is. Until
then, the builder's Settings → Domain tab reports "not configured"
rather than failing oddly.organization_id on every tenant-owned
table) + Postgres RLS, not schema- or database-per-tenant. See
supabase/migrations/0001_init.sql — RLS policies use three
SECURITY DEFINER helper functions (is_org_member, is_org_editor,
is_org_admin) instead of repeating EXISTS subqueries per policy.app_members) are not — a single Supabase
project's auth.users isn't a good fit for arbitrary end-users across many
tenants' apps. Members instead get their own session: a
scrypt-hashed password (lib/pwa/member-auth.ts, Node's built-in
crypto — no bcrypt/argon2 dependency) and an HMAC-signed session cookie
(lib/pwa/member-session.ts) scoped to one app, verified against the DB on
every request (lib/pwa/get-current-member.ts) rather than trusted from
the token alone, so removing a member invalidates their session
immediately rather than at cookie expiry.min_tier (blocks.min_tier — public / any member / an exact tier-name
match, set per-block in the builder's Inspector under "Visible to").
Simpler than nested block containers, and doesn't require the schema to
model block nesting at all.src/proxy.ts rewrites {slug}.$ROOT_DOMAIN/* to
/published-apps/{slug}/*. The render tree there (src/app/published-apps/[appSlug]/...)
reads published content with the Supabase service-role client
(lib/supabase/admin.ts), since anonymous visitors have no Supabase Auth
session for RLS to check — draft apps 404 there by construction.BlockRenderer is shared
between the builder's canvas and the published-app runtime, so what a
creator sees while editing is what ships. The one exception is the
contact-form block, split into its own Client Component
(ContactFormRuntime) so it can actually submit — everything else stays a
plain server-rendered view.active_org_id (src/lib/org.ts)
tracks which org a multi-org user is currently viewing. Set on org
creation and by the switcher; falls back to the user's first membership if
unset or stale (e.g. pointing at an org they've since left).The gas_directory block turns any app into a "cheapest gas near me" PWA
(the first tenant using it is GasPal, gaspal.tapandlaunch.com).
GasDirectoryRuntime asks the
browser for the viewer's GPS position and searches around that; the
block's configured coordinates are only a fallback for when permission
is denied. Distances are haversine from the viewer.fuelOptions field of places:searchNearby (lib/gas/google.ts),
which returns each station's current price per grade with a timestamp.
This is the one paid dependency: the Enterprise + Atmosphere SKU, 1,000
calls/month free. GOOGLE_MAPS_API_KEY is server-only (never
NEXT_PUBLIC_), restricted to the Places API (New) in Google Cloud.gas_stations and the map is split into ~1 mi cells
(gas_fetch_cells, 60-minute TTL) — a second viewer in the same cell
within the hour is served from the DB, not Google. A daily ledger
(gas_fetch_budget, 200 calls/day) hard-stops further Google calls;
past it, or with no key configured, lib/gas/overpass.ts falls back to
OpenStreetMap for station locations (no prices)./gas/prices and /gas/stations with price_source = 'user'; a
user price wins over Google's until Google reports something newer.0013_gas_stations.sql.The food_directory block is a real-time "what's open near me" restaurant
directory (first tenant: LiveBites).
regularOpeningHours and utcOffsetMinutes;
lib/food/hours.ts evaluates them in the restaurant's own time zone to
produce Open (with closing time), Closing soon (≤ 30 min, with a
countdown) or Closed (with the next opening, "11 AM" / "Wed 11 AM"). The
published app re-evaluates every 30 s, so countdowns tick with zero
network traffic. Covered by hours.test.ts (after-midnight closes,
week wrap, 24/7, unknown hours).lib/food/cuisines.ts, each
a set of Google types plus name keywords). Searches are lazy: an area
costs one Nearby Search (the general sweep) and each cuisine's own
search runs the first time a viewer taps its pill (?cuisine= on
/food/nearby). Freshness is per (cell, group) in food_fetch_cells
and trusted for a week; a daily budget (food_fetch_budget, 200
calls) caps spend. Enterprise SKU, 1,000 free calls/month,
GOOGLE_MAPS_API_KEY server-only./food/wait and food_wait_reports remain but are unused.0014_food_places.sql, 0015_food_fetch_groups.sql.Phase 6 adds custom domains (Vercel Domains API) on top of Phase 5's commerce/events. Deliberately not in this phase (all schema-compatible to add later, none of it blocked by what's here):
lib/domains/vercel.ts. Implemented against Vercel's documented REST API
shape (add domain → DNS records returned if unverified → re-verify →
remove), but there were no credentials available to actually test the
flow end-to-end. Double-check response shapes against Vercel's current
API reference before relying on this in production.lib/domains/vercel.ts), not a small swap.organizations.branding is editable
(/dashboard/settings) and the logo shows in the dashboard header, but
primary_color/footer_text aren't applied anywhere yet; there's no
separate reseller-facing surface to apply them to./dashboard/apps/[appId]/members.min_tier
(or a notification's tier target) either matches a member's tier
exactly or it's "*" (any member) or unset (public/everyone). There's no
"premium includes everything basic includes" inheritance, and no
tier-management UI beyond typing a tier name into a block's Inspector, the
notification composer's audience picker, or a member's row in
.src/types/database.ts is hand-written to match the migration (there's no
linked Supabase project yet to generate from). Once one is linked:
supabase gen types typescript --linked > src/types/database.ts
Then re-apply the hand-written jsonb domain types (BlockConfig,
ThemeConfig, ManifestConfig, etc.) that the generator only knows as Json.
app-assets
(0002_storage.sql), objects path-prefixed {organization_id}/...; RLS on
storage.objects gates writes to that org's editors, reads are public
(everything stored here ends up visible on a published app or as a
logo/icon anyway).--chart-1..5 in globals.css) are
the dataviz skill's validated reference palette, not shadcn's default
grayscale placeholders — swap these if/when there's an actual brand
palette to validate instead./api/apps/[appId]/notifications/send
resolves recipients (lib/notifications/recipients.ts — "all members" or
an exact tier match, same concept blocks.min_tier uses) and dispatches
synchronously within the request (Promise.allSettled, not a background
job) to whichever of push/email/SMS was selected. Fine at scaffold-scale
recipient counts; a slow provider call at real scale would hold the
request open for the whole batch — see Scope.lib/org.ts's isAppEditor does that check explicitly instead —
still built from RLS-scoped reads (a non-member gets false the same way
they'd get an empty/null row elsewhere), just not a policy itself.push_subscriptions row itself
rather than leaving it to fail forever on every future send.product_list/event_calendar blocks always show all of it,
with no per-block product/event picker. Simpler than building a
multi-select UI, and it's the same simplification min_tier gating
already made for blocks in general (whole-block, not partial content).ProductBuyRuntime creates one
order with one line item per "Buy" click — there's no multi-item basket
to check out at once. orders/order_items are still modeled as
order-with-line-items (not a flattened single-product row) so a real cart
can be layered on later without a schema change, just a different write
path.orders.status starts 'pending') a merchant follows up on manually —
Stripe integration is Phase 7's job. Naming avoids "paid"/"payment"
anywhere in the schema or code for this reason.{slug}.$ROOT_DOMAIN subdomain — both keep
serving the same app. That subdomain also still works as a stable
preview/fallback link, which is why this isn't framed as a limitation.
One consequence worth knowing: they're different browser origins, so an
app_members session started on one won't carry over to the other.proxy.ts touches the
database: resolveAppSlugForHost (lib/tenant.ts) tries the DB-free
subdomain check first and only falls back to a custom_domain query for
hosts that don't match {slug}.$ROOT_DOMAIN — so ordinary subdomain
traffic never pays for a query it doesn't need, and a DB hiccup on that
fallback degrades to "no tenant" (falls through to the marketing/
dashboard routes) rather than a 500.resolveAppSlugForHost only
resolves a custom_domain whose custom_domain_status = 'verified' and
whose app status = 'published' — an app mid-DNS-verification, or a
since-unpublished one, can't become reachable just because DNS already
points at it.isAppEditor (lib/org.ts) first, rather
than letting the side effect happen and only the subsequent DB write
fail — see the comment in api/apps/[appId]/domain/route.ts for why
that ordering specifically matters here (a non-editor could otherwise
trigger a real Vercel API call, quota and all, with no lasting DB effect
to show for it)./dashboard/apps/[appId]/membersapp_members.tier is set by hand from the
dashboard; there's no checkout flow that assigns it (that's Phase 7's
billing work, once it exists).product_list blocks on different pages.products/orders/order_items), not synced from a connected Shopify
store. Layering Shopify in as an additional import source into the same
products table, rather than replacing it, is the natural way to add
that later without reworking the block.app/published-apps/[appSlug]/sw.js/route.ts, and is unrelated to push).