WallpaperMachine
The wallpapers you love. A new home on your Mac.
El mapa de lo que pasa hoy en Rosario, con un chat que te dice qué hacer.
Translation pending
LifestyleTypeScript · JavaScriptGitHub @leonvalidoOnlineOwner 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
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Repo: https://github.com/leonvalido/shippear-hay-plan · Live: https://hayplan.vercel.app
Hackathon boilerplate for Shippear #3 (Rosario, 24 Oct 2026). Next.js 16 (App Router) · TypeScript · Tailwind v4 · shadcn/ui · Anthropic SDK (streaming) · SQLite built into Node.
One command to run:
npm install && npm run dev
Open http://localhost:3000. Without an API key it runs in mock mode (streamed canned answer) so the whole UI works offline. Add a key to go live.
| Path | What it is |
|---|---|
src/app/page.tsx | Landing: headline, one CTA, three "how it works" cards. Replace copy only. |
src/app/app/page.tsx + src/components/generate-form.tsx | The form → AI → result → saved flow. Change the fields, keep the shape. |
src/app/api/generate/route.ts | POST, validates with zod, streams text/plain from Claude. Header x-ai-mode: mock|live. |
src/app/api/items/route.ts | GET / POST / DELETE on a generic items table (JSON data column, no migrations). |
src/lib/ai.ts | streamText() (stream), completeJSON() (schema-validated object via zod), describeError(). Mock fallback built in. |
src/lib/prompts.ts | All prompts in one file. System prompt, buildPrompt(), mock answer. |
src/lib/db.ts | getStore() → node:sqlite at data/app.db, falls back to in-memory if Node < 22.13. |
src/hooks/use-stream.ts | Client hook: run(body) → text, status (idle/loading/streaming/done/error), abort(), reset(). |
src/components/ai-result.tsx | Reusable result card: skeleton → streaming cursor → done / error with retry. |
src/components/ui/* | shadcn/ui: button, card, input, textarea, label, badge, skeleton, alert. npx shadcn@latest add dialog works (components.json is set). |
scripts/check-api.mjs | npm run check → one tiny API call, prints latency or the exact error. |
IDEAS.md / PLAN.md | Idea bank + hour-by-hour plan, roles, pitch template, packing list. |
Dependencies are deliberately minimal (61 packages, ~17 s install on decent WiFi): no ESLint, no icon library, no ORM, no auth. Add only what the demo needs.
cp .env.example .env.local
| Var | Default | Notes |
|---|---|---|
ANTHROPIC_API_KEY | (empty → mock mode) | From console.anthropic.com |
ANTHROPIC_MODEL | claude-opus-5-5 | claude-sonnet-5-5 or claude-haiku-5-5 are faster for a demo |
ANTHROPIC_EFFORT | low | low is fastest; raise to medium if answers are shallow |
MOCK_AI | unset | 1 forces mock mode even with a key (WiFi dies mid-demo → flip this, restart) |
npm install (if WiFi is bad, copy node_modules via AirDrop/USB from the laptop that installed it last night).cp .env.example .env.local, paste the key, npm run check. Green line = live. If red, fix it now or decide to demo in mock mode.npm run dev, open /app, submit the form once. Confirm streaming + "db: sqlite" badge. Everyone must see this working before touching code.PLAN.md and the demo flow in 3 bullets. Nobody codes until this is written.layout.tsx (nav), page.tsx (headline), metadata.title.streamText; structured card → use completeJSON with a zod schema). Write the zod schema first.src/lib/prompts.ts: system prompt with the domain rules + 1 worked example; buildPrompt() from your fields. Test it in /app before touching UI.data/seed.json and load it in getStore() on first run.PLAN.md), create branches only if 3+ people; otherwise one branch, small commits, git pull --rebase often.Change the form → result flow. Edit the two state fields in generate-form.tsx,
the zod Body in api/generate/route.ts, and buildPrompt() in prompts.ts. That's it.
Return a structured object instead of text.
// in a route handler
import { z } from "zod";
import { completeJSON } from "@/lib/ai";
const Result = z.object({ viable: z.boolean(), reason: z.string(), cost: z.number() });
const out = await completeJSON({
prompt: buildPrompt(body),
schema: Result,
mock: { viable: true, reason: "Ejemplo en modo mock", cost: 1200000 },
});
return Response.json(out);
Save something.
const store = await getStore();
store.insert(newItem("order", { product: "yerba", qty: 2 }));
store.list("order", 10);
Add a shadcn component. npx shadcn@latest add dialog (needs WiFi; the 8 included cover most demos).
Streaming looks stuck. status === "loading" means waiting for the first byte;
with claude-opus-5-5 that can be 2–5 s. Switch to claude-sonnet-5-5 in .env.local for a snappier demo.
WiFi dies during the pitch. MOCK_AI=1 in .env.local, restart dev server, same UI.
Better: before the pitch, run the real flow once and keep that tab open.
| Script | Does |
|---|---|
npm run dev | Dev server (Turbopack) |
npm run build | Production build (also typechecks) |
npm run start | Serve the build |
npm run typecheck | tsc --noEmit |
npm run check | Ping the Anthropic API with the configured model |
output_config.effort (no budget_tokens, no temperature), the current API shape for Claude 5-family models.node:sqlite is built into Node ≥ 22.13 / 24. Nothing to compile, no cloud. The DB file is data/app.db (git-ignored). On older Node the store silently falls back to memory and the badge says db: memory.text/plain; the client reads it with fetch + ReadableStream. No SSE parsing, no extra library.