Claude Code
curl -fsSL https://raw.githubusercontent.com/vibe-md/vibe.md/7cb0620fbd80f9829155d8866328b58cd18d5aa7/scripts/install.sh \
| bash -s -- --group google \
--agent claude-code --ref 7cb0620fbd80f9829155d8866328b58cd18d5aa7Unofficial. Add Google login, maps, Firebase, analytics, Search Console, Sheets and Gemini to your site, with restricted keys and budget alerts.
Nine skills that help your agent add Google services to your site or app: Log in with Google, maps, Firebase, Google Analytics, Google Search, Google Sheets and Gemini AI. Most of these need a Google Cloud project (the folder in Google's systems that holds your keys, settings and bill) and a key (a password-like string that lets your app use a Google service). The package walks your agent through each service so keys stay private, are locked to what they need, and paid services have limits.
Each Google service needs a project and usually a key. Done carelessly, a key ends up in public code or in the browser with no restrictions, and someone else can use it while you pay the bill. Google's consoles also change their menus often, so steps copied from an old tutorial no longer match what you see.
Google services has 9 skills. Open one to see when to use it and how to install it on its own.
google-analyticsAdds Google Analytics 4 (GA4) to a website with a simple cookie consent banner, so visits are counted only after a visitor agrees.Adds Google Analytics 4 (GA4) to a website with a simple cookie consent banner, so visits are counted only after a visitor agrees. Creates the GA4 property and web stream with the user, puts the measurement ID in an environment variable, loads Google's tag only after consent using Consent Mode, adds an accessible banner with equal Accept and Reject buttons and a way to change the choice later, and checks that visits show up in Realtime. Explains in plain words what consent laws generally ask for, without giving legal advice. Use when the user says "add Google Analytics", "add GA4", "how many people visit my site?", "I need a cookie banner for analytics", "Analytics shows no data", "תוסיף גוגל אנליטיקס לאתר", or "תוסיף באנר עוגיות". Not for Google Ads or ad tracking pixels, not for Search Console data (use google-search-console), and not for other analytics tools.
Adds Google Analytics 4 to your site with a simple cookie banner, so visits are counted only after a visitor agrees. Your agent helps you create the Analytics property, adds an accessible banner with equal Accept and Reject buttons, loads Google's tag only after Accept, and checks that visits show up in Google's live report.
Do not use this skill:
deploy-frontend-env puts it on the host.google-search-console.User: "Add Google Analytics to my Next.js site."
Agent: Finds no existing tag. Walks the user through creating the property
and web stream; the user shares the G- ID. Adds
NEXT_PUBLIC_GA_MEASUREMENT_ID, a small banner with Accept and Reject and a
footer link, and renders GoogleAnalytics only after Accept. Checks in the
browser that nothing loads before a choice or after Reject, and that Accept
sends a request. The user sees the visit in Realtime.
User: "תוסיף באנר עוגיות לאנליטיקס"
Agent: Answers in Hebrew. Finds GA4 already loaded on every page without consent. Explains why that is a problem in plain words, without legal advice, and with a yes moves the tag behind a consent banner. Verifies nothing loads before Accept.
User: "Analytics shows zero visitors."
Agent: Checks the ID variable is set on the host, that the stream's address matches the site, and whether the tag only loads after consent (then visitors who reject are not counted, which is expected). Opens the site, accepts, and has the user watch Realtime.
In many places, such as the EU and the UK, sites must ask before setting analytics cookies. Many setups load Google's tag on every page before anyone has agreed.
Nothing loads before a yes
Google's tag is set to denied by default and loads only after the visitor clicks Accept. On Reject, nothing loads.
A fair, accessible banner
One sentence on what is collected, a link to your privacy policy, and Accept and Reject buttons of equal size. Works with a keyboard and has a footer link to change the choice later.
Works with what you have
If your site already has a Google tag or a consent tool, your agent works with it instead of adding a second one.
Checks data arrives
Checks in the browser that nothing loads before a choice or after Reject, and that Accept sends a visit. You confirm it in the Realtime report.
Google Analytics needs no Google Cloud project or billing. You create the property in Google Analytics, and the ID it shows (starting with G-) is not a secret. Your agent puts it in an environment variable and adds the banner and tag after you say yes.
After the site is deployed, your agent checks again on the live site. It explains in plain words what consent rules generally ask for, and says plainly that this is not legal advice.
Command for Claude Code. To change the agent, use the picker in the installation section. To get every skill in Google services, install the whole package instead.
curl -fsSL https://raw.githubusercontent.com/vibe-md/vibe.md/7cb0620fbd80f9829155d8866328b58cd18d5aa7/scripts/install.sh \
| bash -s -- --skill google-analytics \
--agent claude-code --ref 7cb0620fbd80f9829155d8866328b58cd18d5aa7google-firebaseAdds Firebase to a web app safely, covering Firestore (the database), Cloud Storage (file uploads) and Firebase Hosting.Adds Firebase to a web app safely, covering Firestore (the database), Cloud Storage (file uploads) and Firebase Hosting. Writes security rules that start closed and give each user only their own data (never allow-all or a "test mode" that expires), tests them on the Firebase emulator before anything goes live, restricts the web API key, and deploys rules or the site only with the user's yes. Explains which parts need the pay-as-you-go plan, from the live pricing page. Use when the user says "add Firebase", "set up Firestore", "my Firestore rules are in test mode", "Firebase says my database is insecure", "upload images to Firebase Storage", "deploy to Firebase Hosting", "תחבר את האפליקציה ל-Firebase", or "תכתוב לי חוקי אבטחה ל-Firestore". Not for Google login with Firebase Auth (use google-sign-in), not for hosting on Vercel, Netlify, Cloudflare Pages or GitHub Pages (use deploy-frontend-*), and not for Supabase.
Adds Firebase to your web app: Firestore (the database), Cloud Storage (file uploads) and Firebase Hosting. Your agent writes security rules that start closed and give each user only their own data, tests them on your computer with the Firebase emulator, and puts rules or the site live only after you say yes.
allow read, write: if true; or a request.time < rule.Do not use this skill:
google-sign-in (it covers Firebase Auth).
Rules here assume users log in somehow.deploy-frontend-choose and deploy-frontend-launch.User: "Firebase emailed me that my Firestore rules are insecure."
Agent: Reads firestore.rules and finds a test-mode rule that allows
everything until a date. Explains that anyone with the project ID can read and
change all data now. Asks what the app stores; it is per-user to-do lists.
Writes owner-only rules, adds three emulator tests, runs them (the "other user"
and "logged out" tests are denied), then with a yes deploys only the rules, and
checks the console.
User: "תוסיף אפשרות להעלות תמונת פרופיל ל-Firebase Storage"
Agent: Answers in Hebrew. Reads the pricing page and explains Storage needs
the Blaze plan; checks there is a budget alert and asks before
the user upgrades. Writes Storage rules allowing each user to write only
users/<their id>/avatar, images under 5 MB, tests on the emulator, then
deploys the rules after a yes.
User: "Just set the rules to allow everything for now so it works."
Agent: Explains that would let anyone read and delete all the data, and offers the smallest safe rule that lets the feature work for logged-in users.
In a Firebase web app, the browser talks to the database directly and the settings in your code are public by design. The security rules are the only thing that decides who can read or change data. Rules that allow everything, or a "test mode" that allows everything until a date, are how Firebase data leaks.
Rules that start closed
Starts from "deny everything" and opens only what each kind of data needs, for example each user can read and change only their own notes. Never allow-all rules or date-based rules.
Tested before going live
Adds tests that the owner can read and write, and that another user and a logged-out visitor cannot. It does not go on until the "cannot" tests pass.
Checks the right project
Before putting rules live, checks which Firebase project is active and names it, so a test project and a live project are not mixed up.
Clear about the paid plan
Reads Firebase's current pricing page and explains which parts need the pay-as-you-go plan, such as Storage, after a budget alert exists.
Your agent reads any existing rules and flags allow-all or test-mode rules at once, then asks in plain words what your app stores and who should see it. It sets up the Firebase tools only for the parts you need, and you log in to Firebase yourself.
Rules go live only after the tests pass and you say yes. Firebase Hosting is for static sites. If your app needs server code, your agent explains the options instead of deploying.
Read what your agent is about to run before approving it. These can lose work:
Command for Claude Code. To change the agent, use the picker in the installation section. To get every skill in Google services, install the whole package instead.
curl -fsSL https://raw.githubusercontent.com/vibe-md/vibe.md/7cb0620fbd80f9829155d8866328b58cd18d5aa7/scripts/install.sh \
| bash -s -- --skill google-firebase \
--agent claude-code --ref 7cb0620fbd80f9829155d8866328b58cd18d5aa7google-geminiAdds Google's Gemini AI to a website or app with the key kept on the server.Adds Google's Gemini AI to a website or app with the key kept on the server. Gets a Gemini API key from Google AI Studio typed into .env by the user, restricts it to the Gemini API, adds a server route that the browser calls (never Google directly), and puts limits in place so a busy or abused feature cannot run up a bill, such as login or a per-visitor rate limit, a daily cap, input length and output token limits, and a budget alert. Reads the current models, prices, free-tier terms and rate limits live. Ends with one real request through the server. Use when the user says "add Gemini to my app", "add an AI chatbot with Google Gemini", "use the Gemini API", "where do I put my Gemini key?", "my Gemini key is in the frontend", "תוסיף את Gemini לאפליקציה", or "תחבר את האתר ל-AI של גוגל". Not for reviewing prompts or comparing models (use llm-prompt-review, llm-eval-builder, llm-model-migration-check), not for a security review of AI code (use security-agent-guard), and not for other AI providers.
Adds Google's Gemini AI to your site or app with the key kept on your server. Your browser calls your own app, never Google directly. Your agent adds limits so a busy or abused feature cannot run up a bill, and reads Gemini's current models, prices, free-tier terms and rate limits before choosing anything.
Do not use this skill:
llm-prompt-review, llm-eval-builder or llm-model-migration-check.security-agent-guard after building it.User: "Add a Gemini chatbot to my Next.js site."
Agent: Reads the models, pricing, rate limits and terms pages, and reports
them with the date. Explains the free tier's data terms; the user chooses the
paid tier, so the agent confirms a budget alert of 20 exists first. The user
creates the key, types GEMINI_API_KEY into .env.local, and restricts it to
the Generative Language API. With a yes, the agent adds @google/genai, a route
handler with login required, 10 requests a minute and 50 a day per user, a
2,000-character input cap and maxOutputTokens, and a streaming chat box.
Tests one message and one over-long one, and checks the network list shows only
the app's own route.
User: "המפתח של Gemini נמצא אצלי ב-VITE_GEMINI_API_KEY, זה בסדר?"
Agent: Answers in Hebrew. Explains that every VITE_ value is sent to all
visitors, so the key is public. Asks the user to replace it in AI Studio and
delete the old one once the new one works, and moves the call to a serverless
function with limits, after a yes.
User: "Which Gemini model is the cheapest?"
Agent: Opens the current pricing page and answers from it, with the address and date, instead of from memory.
A Gemini key lets anyone who has it send requests that you pay for. If it is in the browser code, anyone who opens your site can copy it. Without limits, one user, a bot or a bug can run up a bill.
Key on the server only
You type the key into your .env file with no public prefix. The browser sends only the user's text to your app's own route, which builds the request.
Limits you choose
Login or a per-visitor rate limit, a daily cap per user and for the whole app, a maximum message length, a maximum answer length, and a timeout.
Current facts, read live
Reads Google's current models, prices, rate limits and terms, tells you the address and date, and points out how data sent on the free tier may be used.
Fixes a leaked key first
If a Gemini key is already in browser code, a public variable or Git history, your agent says so and asks you to replace it, not just move it.
Before you create the key, your agent asks whether the project has billing linked, because then every request is charged at paid prices from the first one. The paid tier happens only after you say yes and a budget alert exists.
After you say yes, your agent adds the server route and the limits, then sends one test request and checks the network shows only your app's own route. It also checks the built site files do not contain the key, and that an over-long message and a burst of requests are refused.
Command for Claude Code. To change the agent, use the picker in the installation section. To get every skill in Google services, install the whole package instead.
curl -fsSL https://raw.githubusercontent.com/vibe-md/vibe.md/7cb0620fbd80f9829155d8866328b58cd18d5aa7/scripts/install.sh \
| bash -s -- --skill google-gemini \
--agent claude-code --ref 7cb0620fbd80f9829155d8866328b58cd18d5aa7google-keys-checkRead-only audit of the Google keys and credentials in a project.Read-only audit of the Google keys and credentials in a project. Finds Google API keys, OAuth client secrets and service account keys in the code, in files Git tracks, and in Git history; finds secrets that are sent to the browser through public variable prefixes or browser code; and checks, with the user or a logged-in gcloud, which keys have no website or API restriction so anyone could use them. Shows every finding masked (first and last 4 characters) or by name only, changes nothing, and ends with a ranked report and the next step for each finding. Use when the user says "check my Google keys", "is my Google API key safe?", "did I leak my Firebase key?", "audit my API keys", "I got an email that my Google key is exposed", "תבדוק את המפתחות של גוגל בפרויקט", or before putting a site that uses Google services online. Not for fixing the findings (the report hands off), not for non-Google secrets in general (use secret-guard), and not for a full security review (use pre-commit-security-review).
Checks the Google keys in your project without changing anything. Your agent looks for Google keys and secrets in your files and Git history, finds secrets that are sent to visitors' browsers, and checks which keys have no restrictions. It ends with a ranked list of what to fix and which skill fixes it.
Do not use this skill:
secret-guard.pre-commit-security-review.User: "Is my Google API key safe? My repo is public."
Agent: Finds AIza...k3Qe in src/config.ts and in 3 commits of history,
and NEXT_PUBLIC_GEMINI_API_KEY in .env.local (name only). The user reads back
the Credentials page: the key ending k3Qe has no restrictions. Reports two
"Fix now" items: the Gemini key is public and unrestricted, and it is in the
public history. Recommends replacing it and moving the call to the server with
google-gemini, then secret-guard for the history. Changes nothing.
User: "תבדוק את המפתחות של גוגל בפרויקט"
Agent: Answers in Hebrew. Finds only the Firebase web config, and through
gcloud sees the key is limited to the Firebase APIs but has no website
restriction. Reports it as "Fix soon", explains why, and points to
google-firebase.
User: "Just test the key you found and tell me if it works."
Agent: Explains that it will not call Google with a found key, because the call can cost money and uses the key without the owner's say. Offers to check the restrictions instead.
Most surprise Google bills start with a key that was pushed to GitHub, put in a public variable, or left with no restrictions. A key that is in your Git history is still exposed even if today's files no longer have it.
Searches files and history
Finds Google API keys, login secrets and service account keys in your files and in Git history, without printing them. Keys are shown only partly, such as AIza...k3Qe, or by file name.
Finds secrets sent to the browser
Flags secret-looking variables with a public prefix, browser code that uses server-only Google libraries, and secrets in an existing build folder.
Checks restrictions
With your read-back from Google's Credentials page, or read-only gcloud if you use it, finds keys that anyone could use because they have no restrictions.
A ranked report
Groups findings into Fix now, Fix soon and Fine, with where each one is, why it matters, and the next step. It also says what it could not check.
Your agent tells you what it will look for, searches in a way that never prints a full key, and asks whether your repository is public or shared. It never calls Google with a key it found, because that can cost money and uses the key without your say.
At the end it stops and asks which finding you want to fix first. Fixing is a separate step, in the skill the report names.
Command for Claude Code. To change the agent, use the picker in the installation section. To get every skill in Google services, install the whole package instead.
curl -fsSL https://raw.githubusercontent.com/vibe-md/vibe.md/7cb0620fbd80f9829155d8866328b58cd18d5aa7/scripts/install.sh \
| bash -s -- --skill google-keys-check \
--agent claude-code --ref 7cb0620fbd80f9829155d8866328b58cd18d5aa7google-mapsAdds Google Maps to a website or app, safely.Adds Google Maps to a website or app, safely. Shows a map or a store location, searches places, and autocompletes addresses in forms, using the Maps JavaScript API and Places API (New), or the free embed when a simple map is enough. Creates a separate key restricted to the user's own domains and to only the Maps APIs used, keeps it in an environment variable, explains costs from the live pricing page, checks there is a budget alert, and can lower daily quotas. Verifies the map loads with no key errors. Use when the user says "add a Google map", "show our location on a map", "address autocomplete", "search places", "RefererNotAllowedMapError", "the map says for development purposes only", "תוסיף מפה של גוגל לאתר", or "השלמה אוטומטית לכתובת". Not for Google Earth, mobile SDKs, or other map providers.
Adds a Google map, a place search or address autocomplete to your site. Your agent picks the smallest option that does the job, such as a simple embedded map for one location, and sets up a separate key that only works on your own website and only for the map services you use.
Do not use this skill:
google-keys-check.deploy-frontend-env puts it on the host.User: "Add a Google map with our bakery's location to the contact page."
Agent: Recommends the Maps Embed API, since one location is enough, and
checks its pricing live. Confirms a budget alert exists. The user turns on the
Maps Embed API and creates a key "website embed" restricted to
https://bakery-tlv.com/* and http://localhost:5173/* and to the Maps Embed
API only, and reads the restrictions back. The user adds
VITE_GOOGLE_MAPS_API_KEY to .env. With a yes, the agent adds the <iframe>
with a title, opens the page, and sees the map with no console errors.
User: "תוסיף השלמה אוטומטית לשדה הכתובת בטופס ההזמנה"
Agent: Answers in Hebrew. Explains that autocomplete is charged after a free amount, reads the current price live, and checks the budget. Has the user turn on Places API (New) and restrict the key. Adds the Place Autocomplete widget asking only for the formatted address, and tests it in the browser.
User: "The map works on my computer but the live site says RefererNotAllowedMapError."
Agent: Explains the key's websites list does not include the live address.
Has the user add https://my-site.com/* (and the www form if used), waits a
few minutes, and checks the live page again.
A Maps key has to be sent to the browser, so anyone can read it from the page. That is fine only when the key is restricted to your own site and to the map services you use. Otherwise someone else can use it and you pay.
The smallest option that works
Recommends a simple embedded map, an interactive map, address autocomplete or a place search, and reads the current prices for it from Google's pricing page.
A key locked to your site
You create a separate key restricted to your own domains and only the map services used. Your agent does not go on until both restrictions are confirmed.
Searches on the server
For searching places, the call goes through your own server with a second key that is not public, with a per-user limit.
An optional daily cap
Explains how to set a lower daily limit on Google's side, so a flood of traffic stops at that number instead of growing the bill.
Maps needs billing linked, even for free use, and a budget alert. If either is missing, your agent sends you to google-setup first. You turn on only the map services chosen, create and restrict the key, and put it in your .env file yourself.
Your agent adds the map or autocomplete after you say yes, then opens the page and checks that it shows and that the browser console has no map errors, first on your computer and then on the live site.
Command for Claude Code. To change the agent, use the picker in the installation section. To get every skill in Google services, install the whole package instead.
curl -fsSL https://raw.githubusercontent.com/vibe-md/vibe.md/7cb0620fbd80f9829155d8866328b58cd18d5aa7/scripts/install.sh \
| bash -s -- --skill google-maps \
--agent claude-code --ref 7cb0620fbd80f9829155d8866328b58cd18d5aa7google-search-consoleGets a website into Google Search with Google Search Console.Gets a website into Google Search with Google Search Console. Verifies that the user owns the site (a DNS record for the whole domain, or a file or meta tag for one address), makes sure the site has a sitemap and a robots.txt that does not block Google, submits the sitemap, and explains "not indexed" reports in plain words with the smallest fix for each, such as a stray noindex tag, a wrong canonical link or a page that redirects. Asks before DNS changes and code changes. Use when the user says "my site isn't on Google", "add my site to Google Search Console", "submit my sitemap", "verify my domain with Google", "Discovered - currently not indexed", "Crawled - currently not indexed", "האתר שלי לא מופיע בגוגל", or "תגיש את ה-sitemap לגוגל". Not for paid ads, not for writing page titles and content to rank better, and not for connecting a domain to a host (use deploy-frontend-domain).
Gets your live site into Google Search with Google Search Console, Google's free tool for site owners. Your agent checks your sitemap and robots.txt, helps you prove you own the site, has you submit the sitemap, and explains in plain words why a page is "not indexed" and the smallest fix.
Do not use this skill:
deploy-frontend-launch
first.deploy-frontend-domain. This skill only
adds a TXT record for verification, under the same DNS rules.User: "My site bakery-tlv.com isn't on Google."
Agent: Checks the live site: robots.txt is fine, but there is no sitemap and
the home page has a noindex tag left over from a template. With a yes, removes
it, adds app/sitemap.ts and app/robots.ts, and hands off to
deploy-frontend-update. Then helps the user add a Domain property, and, under
the DNS rules, a TXT record; checks it with dig until it appears. The user
verifies and submits the sitemap, and reads back "Success, 12 pages".
User: "האתר שלי לא מופיע בגוגל, הוא על vercel.app"
Agent: Answers in Hebrew. Explains a Domain property is not possible on a
shared vercel.app address, and uses a URL prefix property with the meta tag.
Adds the tag after a yes, deploys, checks the live HTML, and the user verifies.
User: "Search Console says 'Crawled - currently not indexed' for my blog posts."
Agent: Explains this is Google's choice, not a technical error. Uses URL Inspection on one post with the user to rule out noindex and canonical problems, then suggests what makes the posts more useful to readers.
Google finds most sites on its own, but slowly, and it does not say why a page is missing unless you ask. A noindex tag left over from a template, a missing sitemap or a wrong canonical link can keep pages out of Google.
Checks the basics first
Opens your live robots.txt, sitemap and home page, and looks for anything that blocks Google, such as a noindex tag or a sitemap that lists preview addresses.
Proves you own the site
Explains the two ways to verify: a DNS record for the whole domain, or a file or tag for one address. It checks the result itself where it can.
Explains "not indexed"
Goes through each reason in Google's page report, says what it means in plain words, and gives the usual fix.
Honest about timing
Explains that asking Google to index a page does not promise it will be added or how fast. Indexing usually takes days.
Your site must already be online at its final address. Your agent adds a missing sitemap or robots.txt after you say yes, and asks again before putting that change live.
For a DNS record, it follows the Deploy package's DNS rules: it looks at your current records first, only adds the new one, and never changes or removes existing records. You press Verify and submit the sitemap in Search Console, and read the result back.
Command for Claude Code. To change the agent, use the picker in the installation section. To get every skill in Google services, install the whole package instead.
curl -fsSL https://raw.githubusercontent.com/vibe-md/vibe.md/7cb0620fbd80f9829155d8866328b58cd18d5aa7/scripts/install.sh \
| bash -s -- --skill google-search-console \
--agent claude-code --ref 7cb0620fbd80f9829155d8866328b58cd18d5aa7google-setupGets a Google Cloud project ready before any Google service is added to a website or app.Gets a Google Cloud project ready before any Google service is added to a website or app. Creates or picks the project, explains in plain words what is free and what can cost money (reading current prices live), sets a budget with email alerts before any paid API is turned on, turns on only the APIs the app needs, and records the project ID. Asks before linking billing or anything that can cost money, and never asks for card details or keys in the chat. Use when the user says "set up Google Cloud", "I need a Google API key", "will Google charge me?", "set a budget alert on Google", "תגדיר לי פרויקט ב-Google Cloud", or when another google-* skill needs a project or budget first. Not for adding a specific feature (use google-sign-in, google-maps, google-gemini and the other google-* skills) and not for deploying the site (use deploy-frontend-launch).
Gets your Google Cloud project ready before any Google service is added. Your agent finds out which Google features you want, explains what is free and what can cost money from Google's current price pages, helps you create or pick a project, sets a budget with email alerts before anything paid, and turns on only the services your app needs.
Do not use this skill:
google-sign-in, google-maps,
google-firebase, google-analytics, google-search-console,
google-sheets or google-gemini once the project is ready.google-keys-check.deploy-frontend-launch.User: "I want to add Google Maps to my site. Will it cost me money?"
Agent: Opens the Maps pricing page and reports what it says today, with the
address and date: a billing account is required, and there is a free monthly
amount per type of request. Helps the user create the project "bakery-site",
asks before billing is linked, then walks them through a budget of 15 with
alerts at 50, 90 and 100 percent, and has them read the budget back. Turns on
the Maps JavaScript API after a yes, records the project ID in the README, and
hands off to google-maps.
User: "תגדיר לי פרויקט ב-Google Cloud בשביל התחברות עם גוגל"
Agent: Answers in Hebrew. Explains that "Log in with Google" does not need a
billing account, so it skips billing and the budget, and says it will set one
up later if they add a paid service. Helps create the project, notes the
project ID, and hands off to google-sign-in.
User: "Here is my card number, just set up billing for me."
Agent: Asks them not to share card details in the chat, and explains that they enter them only on Google's own billing page. Then explains the steps.
Every Google service lives inside a Google Cloud project. If billing is linked with no budget alert, the first sign of trouble can be the bill. Turning on more services than you need also gives a leaked key more to use.
Explains the cost picture
Says which services need no billing at all, such as Log in with Google, Search Console and Google Analytics, which need billing even to start, such as Maps, and which have a free tier with conditions, such as Gemini and Firebase.
Budget before anything paid
Asks you for a monthly amount you would be unhappy to go past, and walks you through a budget with alerts at about 50%, 90% and 100%. Then has you read it back.
Only the services you need
Lists each Google service your app needs by name and asks before turning on any that can charge money.
Writes the setup down
With your yes, adds a short note to your README with the project ID, the services turned on, where the budget is, and the names of the environment variables. Never a key.
Your agent reads the current price pages and tells you what they say and when it read them. You do the steps in the Google Cloud console, and your agent checks the result by asking you to read it back, or with read-only gcloud commands if you already use gcloud.
Billing is linked only if a service you want needs it, and only after you say yes. You enter card details on Google's own page. When the project is ready, your agent hands off to the skill for the service you want.
Command for Claude Code. To change the agent, use the picker in the installation section. To get every skill in Google services, install the whole package instead.
curl -fsSL https://raw.githubusercontent.com/vibe-md/vibe.md/7cb0620fbd80f9829155d8866328b58cd18d5aa7/scripts/install.sh \
| bash -s -- --skill google-setup \
--agent claude-code --ref 7cb0620fbd80f9829155d8866328b58cd18d5aa7google-sheetsUses a Google Sheet as a simple database or as the place a website form sends its entries, safely.Uses a Google Sheet as a simple database or as the place a website form sends its entries, safely. Sets up a service account (a robot Google account) with no project roles, shares only that one Sheet with it, keeps its key on the server in environment variables typed by the user, and adds a server route that validates input, limits requests, writes rows as plain text so formulas cannot be injected, and reads with the narrowest access. Explains when a Sheet stops being a good database. Ends by writing and reading a test row. Use when the user says "save my form to a Google Sheet", "use Google Sheets as a database", "read data from a Google Sheet on my site", "contact form to Google Sheets", "תשמור את הטופס בגוגל שיטס", or "תחבר את האתר לגוגל שיטס". Not for exporting files by hand, not for Google Forms itself, and not for a real database (use Firestore with google-firebase, or Supabase).
Uses a Google Sheet as a simple database, or as the place your site's form sends its entries. Your agent sets up a robot Google account (a service account) that can open only that one Sheet, keeps its key on your server, and adds a server route that checks input, limits requests, and saves entries as plain text.
Do not use this skill:
google-firebase) or another
real database.google-keys-check.deploy-frontend-env
puts them on the host.User: "Save my contact form to a Google Sheet. It's a Next.js site on Vercel."
Agent: Agrees on columns (name, email, message, date). Has the user turn on
the Sheets API, create "website-sheets" with no roles, share the Sheet with it
as Editor, and copy the email and private key into .env.local themselves.
Checks the names. With a yes, adds a route handler that validates fields, rate
limits, has a honeypot, and appends with RAW. Submits a "TEST" row; the user
sees it and deletes it. Hands off to deploy-frontend-env for Vercel.
User: "תציג באתר את התפריט מגוגל שיטס"
Agent: Answers in Hebrew. Since the site only reads, shares the Sheet as Viewer and uses the read-only scope. Reads it on the server with a one-minute cache, and checks the menu page shows the rows.
User: "Can't I just call the Sheets API from the browser with an API key?"
Agent: Explains that only works for Sheets anyone can read, and that writing from the browser would need the robot's key in the page, where anyone could take it and change or delete the Sheet. Recommends the server route.
A Google Sheet is an easy place for a small site to keep form entries or a list you edit by hand. But the key that lets your site use it is a sensitive secret, and putting it in the browser would let anyone change or delete the Sheet.
Least access that works
The robot account gets no roles on your project and can open only the one Sheet you share with it, as Viewer if your site only reads and as Editor if it writes.
Safe form entries
The server route checks every field, limits submissions per visitor, has a hidden field to stop simple bots, and saves entries as plain text so a formula typed into the form cannot run.
Fast, safe reading
Reads the Sheet on the server, keeps a copy for about a minute, and shows values as text, never as HTML.
Honest about limits
Explains when a Sheet stops being a good database, for example large or private per-user data, and suggests Firestore or another database instead.
Your app needs server code, because a static site cannot hide the key. You create the robot account and its key in the Google Cloud console, open the key file yourself, copy two values into your .env file, and then move or delete the file. Your agent never opens it.
After you say yes, your agent adds the server code and tests it with one entry marked TEST, which you check and delete. It also tries one bad entry and confirms it is rejected, then repeats the test on the live site.
Read what your agent is about to run before approving it. These can lose work:
Command for Claude Code. To change the agent, use the picker in the installation section. To get every skill in Google services, install the whole package instead.
curl -fsSL https://raw.githubusercontent.com/vibe-md/vibe.md/7cb0620fbd80f9829155d8866328b58cd18d5aa7/scripts/install.sh \
| bash -s -- --skill google-sheets \
--agent claude-code --ref 7cb0620fbd80f9829155d8866328b58cd18d5aa7google-sign-inAdds "Log in with Google" to a website or app, or fixes it when it breaks.Adds "Log in with Google" to a website or app, or fixes it when it breaks. Sets up the consent screen and the OAuth client, lists the exact redirect URLs for local and for the live site (the most common break), and wires it into Auth.js (NextAuth), Supabase Auth, Firebase Auth or Clerk with the client secret kept on the server. Ends with a real login test on local and live. Asks before code changes and before publishing the consent screen, and never asks for the client secret in the chat. Use when the user says "add Google login", "sign in with Google", "redirect_uri_mismatch", "Google login works locally but not on my site", "Access blocked, this app's request is invalid", "תוסיף התחברות עם גוגל", or "ההתחברות עם גוגל לא עובדת באתר". Not for email and password login, not for other providers, and not for reviewing who may access what after login (use security-access-regression).
Adds "Log in with Google" to your site or app, or fixes it when it breaks. Your agent sets up the screen Google shows when people log in and the login settings, writes the exact list of addresses for your computer and your live site, and connects it to Auth.js (NextAuth), Supabase Auth, Firebase Auth or Clerk. It ends with a real login test.
redirect_uri_mismatch, "Access blocked" or "This app isn't verified".Do not use this skill:
security-access-regression.deploy-frontend-env
puts them on the host.User: "Add Google login to my Next.js app. It's on Vercel at bakery-tlv.com."
Agent: Finds no auth library and suggests Auth.js; gets a yes. Writes the
table: origins http://localhost:3000 and https://bakery-tlv.com, redirect
URIs ending in /api/auth/callback/google for both. Walks the user through the
consent screen with openid, email and profile, and the Web application
client. The user types AUTH_GOOGLE_ID, AUTH_GOOGLE_SECRET and AUTH_SECRET
into .env.local; the agent checks the names. Adds the provider, route and
button after a yes. The user logs in locally, /api/auth/session shows a user.
Hands off to deploy-frontend-env for the same names on Vercel, then the user
logs in on the live site.
User: "ההתחברות עם גוגל עובדת אצלי במחשב אבל באתר אני מקבל redirect_uri_mismatch"
Agent: Answers in Hebrew. Asks for the redirect_uri shown in the error
details. It is https://www.my-site.com/api/auth/callback/google, but the client
only has the address without www. Has the user add it, waits a few minutes,
and retests on the live site.
User: "Here's my client secret, put it in the env file for me: GOCSPX-..."
Agent: Asks the user not to share it in the chat and to create a new secret
for the client, since this one is now in the conversation. Then shows them how
to type the new one into .env.local themselves.
After login, Google sends people back to an address in your app, and that address must match exactly what Google has on file, including http or https, www or not, and the port. When it does not, you get redirect_uri_mismatch, often only on the live site.
The exact address list
Writes a table of the addresses to copy into Google for your computer and your live site, for the login library your app uses.
The login screen, set up right
Walks you through the screen people see when they log in, asks only for name, email and profile, and explains the difference between Testing and In production.
Secret stays on the server
You type the client ID and secret into your .env file or your login provider's dashboard yourself. Your agent checks the names are there and keeps the secret in server code.
Fixes common errors
Explains redirect_uri_mismatch, "Access blocked", login that only works for some people, and Supabase or Firebase domain errors, with the fix for each.
Your agent finds the login library your app uses, or suggests one that fits and asks before adding it. It shows you each code change before making it, and makes it only after you say yes.
You do the login with Google yourself, first on your computer and then on the live site. Your agent checks the logged-in state from the app side. Making the login open to everyone (publishing the consent screen) happens only after you say yes.
Command for Claude Code. To change the agent, use the picker in the installation section. To get every skill in Google services, install the whole package instead.
curl -fsSL https://raw.githubusercontent.com/vibe-md/vibe.md/7cb0620fbd80f9829155d8866328b58cd18d5aa7/scripts/install.sh \
| bash -s -- --skill google-sign-in \
--agent claude-code --ref 7cb0620fbd80f9829155d8866328b58cd18d5aa7Installs every skill in Google services. To install a single skill, open it above and copy its own command.
One command
Open Terminal in your project folder, then run this command. No ZIP, moving files, or prompt needed.
curl -fsSL https://raw.githubusercontent.com/vibe-md/vibe.md/7cb0620fbd80f9829155d8866328b58cd18d5aa7/scripts/install.sh \
| bash -s -- --group google \
--agent claude-code --ref 7cb0620fbd80f9829155d8866328b58cd18d5aa7Works on macOS, Linux, and Windows through WSL or Git Bash. The installer checks destinations and stops if existing files conflict.
Cost first, budget before anything paid
Your agent reads Google's current price pages and tells you what it read and when. Before any paid service is turned on, it checks there is a budget alert. It explains that a budget only sends emails and does not stop spending, so it adds other limits too.
Keys stay out of the code and the chat
You copy keys from Google straight into your own .env file or your host's settings. Your agent never asks you to paste a key into the chat, checks variables by name only, and shows a found key only partly, like AIza...k3Qe.
Every key locked down
Each key is restricted to the Google services it needs, and to your own website when it has to be visible in the browser. Secret keys stay in server code.
Plain steps for Google's screens
Your agent tells you what to look for on Google's own pages, links Google's official guide, and then checks the result itself where it can.
Done means it works
Each skill ends with a real test, such as a login, a map on the page, a visit in Analytics, or a reply from Gemini. If something could not be checked, your agent says so.
Type these to your agent in plain language. Here's what to expect.
you › I want to add Google Maps to my site. Will it cost me money?
Expected workflow
you › Google login works on my computer but the live site says redirect_uri_mismatch.
Expected workflow
you › Is my Google API key safe? My repo is public.
Expected workflow
Every skill in the package follows one shared set of rules in the package's GOOGLE.md file. If a skill seems to say something different, those shared rules win. A second file, KEYS.md, describes the kinds of Google keys, where each may live, and how to restrict them.
Start with google-setup if you have never used Google Cloud. It creates or picks your project and sets a budget, and the other skills send you there when a project or budget is missing. Then use the skill for the service you want. Putting keys on your host, connecting a domain and going live are handled by skills from the Deploy package.
Your agent asks for a clear yes before four kinds of action: spending money, deleting or overwriting data, making something public, and changing your project (environment variables, packages, code or DNS records). A yes covers only the step it described.
Read what your agent is about to run before approving it. These can lose work: