World Vibe Web
The distributed app store for vibe-coded projects. Browse, discover, and install open-source apps from across GitHub.
Réservez un cadeau de la liste
Translation pending
CommerceJavaScript · CSSGitHub @NoZiLOnlineOwner 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 tiny web app: guests browse a list pulled live from a Google Sheet and tap
"I'll bring this" to claim an item. Claims write straight back to the sheet.
Personalized links/QR codes (generated from /admin) mean a guest's name is
attached automatically — no login, no typing required on their end.Read the full README ↗A tiny web app: guests browse a list pulled live from a Google Sheet and tap
"I'll bring this" to claim an item. Claims write straight back to the sheet.
Personalized links/QR codes (generated from /admin) mean a guest's name is
attached automatically — no login, no typing required on their end.
This is the first proof of concept for a general-purpose gift registry (this repo). It's scoped to a single occasion — a baby registry — on purpose, so the idea can be validated end to end with the simplest possible backend (a Google Sheet, no database). If it works well for the baby list, the plan is to reuse the same pattern for other occasions (Christmas, weddings, ...) rather than generalizing up front.
Lien cell reading "ICI" is followed to the URL behind
it. See step 1 for the details./) shows every item. Ones already claimed stay in place,
greyed out, with a Réservé badge instead of the claim button — so guests
see the whole list and what's already covered. Who claimed what is never
sent to the browser; only the family sees names, in the sheet.Catégorie column
or from a section heading the sheet already has. See
Categories and prices.Image column and whatever address it holds is what
the card shows; leave the cell empty, or the column out entirely, and the app
pulls the preview image off the item's own Lien, the way a chat app
previews a pasted URL. Items with neither keep a discreet 🎁 placeholder. See
Photos and link previews.localStorage so a returning guest isn't made to scroll past it again. The
wording lives in app/HowTo.js, not in the sheet — it describes the app's
own buttons, which the sheet has no say over./admin (password protected) generates a personal link + QR code per
guest — e.g. https://your-app.vercel.app/?g=Grandma%20Linda. Opening that
link pre-fills their name, so claiming is a single tap.localStorage), so the
plain link works like a personalized one on the next visit. A ?g= link is
an explicit choice, so it wins over the remembered name and replaces it.
Saving a new name also rewrites ?g= in the address bar, so a refresh
doesn't bring back the name that was just replaced.Lien simply don't show one.The app reads the sheet you already keep, rather than asking you to keep a second one in its shape. Point it at your tab and it works out the layout from the headings.
Create a Google Sheet, or use the tab of your own planning workbook that already holds the list.
It has to be a Google Sheet, not an Excel file sitting in Drive. An
uploaded .xlsx looks the same in the browser but the Sheets API can't
open it: open it and use File → Save as Google Sheets, then use the
ID of the copy that creates.
Somewhere in the tab, have a row that names the columns. It doesn't have to be row 1 — a title and an intro above it are fine, and are used (see below). These headings are understood, in any order, in French or English:
| Heading | Holds | Required |
|---|---|---|
Quoi? / Item | what the gift is | yes |
Où? / Store | where to get it | no |
Lien / Link | the product page | no |
Prix / Price | the price | no |
Catégorie / Category | which section it belongs in | no |
Réservé par / ReservedBy | who's bringing it | yes |
Réservé le / ReservedAt | when they claimed it | no |
Image / Photo | a picture of the gift | no |
Notes | anything else worth saying | no |
Only two are required: the item column, and Réservé par — that's where
a guest's name gets written. Accents, casing and a trailing space don't
matter, and columns the app doesn't recognize are left alone.
Add one row per gift under that. Only the item column has to be filled
in. Leave Réservé par empty — an item counts as taken as soon as there
is a name in it, whether the app put it there or you did.
Optional, and worth doing:
12 €, à partir de 20) is shown exactly as written.baby-registry). No special roles needed..json file — keep it private, don't commit it
anywhere.client_email and
private_key.client_email address from the JSON file, giving it Editor access.Copy .env.example to .env.local for local testing, and fill in:
GOOGLE_SERVICE_ACCOUNT_EMAIL — the client_email from the JSON keyGOOGLE_PRIVATE_KEY — the private_key from the JSON key (keep the
quotes and \n sequences as-is)GOOGLE_SHEET_ID — the ID from the sheet's URLGOOGLE_SHEET_TAB — the name of the tab holding the gift list. Optional
only when the spreadsheet has a single tab; required as soon as it has
more, so a planning workbook can't publish its budget tab by accidentADMIN_PASSWORD — whatever password you and your partner want to use to
open /adminNEXT_PUBLIC_BASE_URL — fill this in once you know your deployed URL
(step 4)npm install
npm run dev
Visit http://localhost:3000 for the guest list, and
http://localhost:3000/admin to generate a test link.
npx vercel directly from this
folder without GitHub)..env.local.https://baby-registry-xyz.vercel.app), set NEXT_PUBLIC_BASE_URL to
that value in Vercel's env vars and redeploy so /admin builds correct
links.Go to /admin, enter the password, type a guest's name, and you'll get a
shareable link plus a QR code image (long-press or right-click to save it).
Send the link by text/email, or print the QR code for a shower.
Both are free text, and both are optional — fill in as much or as little as you like. Neither has to sit in a particular column; the app finds them by their heading (step 1).
Category is whatever wording you want: Chambre, Repas, Vêtements.
It can come from a Catégorie / Category column, or from a merged section
heading above a run of rows — whichever suits the sheet. Every distinct value
becomes its own collapsible section on the public page, and guests get a row
of category chips to filter with. Sections appear in the order their category
first shows up in the sheet, so you set the running order by arranging rows.
Items with no category collect in a "Sans catégorie" section at the bottom. If
nothing has a category at all, the page stays a plain flat list.
Price is used two ways: to show a price on the item, and to power the min/max filter. It's read leniently, so you don't have to think about formatting:
25,50 and 25.50 both mean 25.50.39,90 €, $1,299.00,
1 299,00 EUR all parse.$45.00 stays $45.00 — the app won't convert or re-format
your currency. A bare number like 25 has no currency of its own, so it's
shown as 25 €.offert, à voir) is shown on the item just
as you wrote it, but counts as "no price" for the filter — see below.Two things worth knowing about how the filters behave:
Repas or
Vêtements), it doesn't narrow it. No chips selected means no category
filter.Every card carries a thumbnail, and the app looks for one in two places, in this order.
1. An Image column, if your sheet has one. Put the address of a picture
in the cell — right click an image in your browser and "Copy image address" —
and that's what the card shows. Like Lien, it can be a bare address or a
short word with the link attached to it, whichever keeps your sheet readable.
This always wins: it's your choice, it costs no extra request, and it's the way to fix an item whose shop advertises a bad picture (a logo, a banner, the wrong colourway).
A Google Drive share link works too. Drive hands you a link to its viewer page rather than to the file, so the app rewrites it to Drive's thumbnail address for you — just make sure the file itself is shared with "anyone with the link", or nobody but you will see it.
2. The item's Lien. With no Image column, or an empty cell in it, the
app fetches the shop's page and reads the preview picture it publishes for
exactly this purpose (its og:image) — the same picture you get when you paste
that link into a chat app. This happens per card as it scrolls into view, and
the answer is cached, so a page of thirty items doesn't turn into thirty
requests on every visit.
Only links already in your sheet are ever fetched: the page asks for a preview by row number, not by URL, so the endpoint can't be aimed at anything you didn't put there yourself.
Not every shop plays along — some publish no preview image, some block
non-browser visitors, some serve pictures that refuse to be shown on another
site. Any of those leaves the card with its 🎁 placeholder, which is the cue
to fill in an Image cell by hand for that row.
/admin
password is a deterrent, not bank-grade security. Don't reuse a sensitive
password for it.ICICatégorie column per row, or put a
heading like Textiles or Jeux et éveil on its own row, merged across
the table's columns — every row under it belongs to that section until
the next heading. The merge is what marks a row as a heading rather
than a gift nobody filled a price in for. A Catégorie cell wins over
the heading a row sits under.Image column lets you choose the thumbnail on each
card, as a bare address or behind a word, exactly like Lien. Skip the
column entirely and the cards still get pictures — the app falls back to
the preview image the linked shop publishes. See
Photos and link previews.Copy the Sheet ID out of the URL:
https://docs.google.com/spreadsheets/d/THIS_PART/edit