Top 10 Things to Think About When You're Vibe Coding an App for Your Fire/EMS Department

A laptop showing an AI coding session beside a fire department member roster app, with a phone running the mobile version, in front of a red-lit fire department badge

I am going to say this up front: I am vibe coding too, and I love it.

A lot of what you see on this website, including the free tools for fire and EMS departments, was built by me describing what I wanted to an AI coding assistant and working through it together. Things that would have taken a development team weeks now take me an evening. I have built dashboards, report generators and calculators that I never could have justified paying for a few years ago. It is genuinely amazing what one person with a clear idea can build right now.

And I am seeing it everywhere in the fire service. A lieutenant builds an apparatus checklist app. A volunteer who works in IT builds a duty crew sign-up tool. A training officer builds a certification tracker. Someone shows it at the company meeting, everyone loves it, and by the next week the whole department is using it.

That is the part that should make you pause.

A working app and a safe app are not the same thing.

The AI is very good at making something that works. It is not nearly as good at making something that is safe, accessible, maintainable and appropriate for a public safety organization, unless you ask it to be and you know what to check. The demo working is not the finish line. For a fire or EMS department, it is closer to the starting line.

Here is the gap in one table.

What the AI gives you by defaultWhat your department actually needs
Code nobody else has readA second set of eyes on every change
Changes that go live the moment you pushA pull request, automated checks and a preview first
A login screenSingle sign-on, MFA and a clean way to remove access
Everyone who logs in sees everythingRoles and row level security
Whatever data you asked it to storeOnly the data you truly need, handled under HIPAA and state law
A layout that looks fine on your laptopWCAG 2.1 AA and a phone-first design
Keys pasted wherever they workedSecrets in environment variables, never in the code

Here are the ten things I think about, and that I would want any department to think about, before a vibe-coded app becomes part of how you operate.

Is Anything Reviewing the Code Besides the AI That Wrote It?

When you vibe code, the same tool that writes the code is often the only thing that ever looks at it. That is like having the person who packed the hose bed also be the only person who ever checks it.

Put a second set of eyes on every change, even if those eyes are automated. Tools like CodeRabbit review each change you make and leave comments on bugs, sloppy logic and risky patterns. Tools like Aikido scan your code and its dependencies for security problems, leaked secrets and known vulnerabilities.

From experience: I run automated code review and security scanning on my own projects, and they catch things I would have missed every single week. Not occasionally. Every week.

None of these tools replace a human who understands the app. But they turn "nobody looked at it" into "something looked at it and flagged the obvious problems," and that is a huge step up.

One more thing: installing a review tool is not the same as having it run. Whatever you use, whether it is CodeRabbit, Aikido, GitHub Copilot code review, Snyk or something else, confirm that it is actually connected to the repository, that it runs on every pull request, and that both the code review and the security scanning are turned on. I have seen tools that were "set up" months ago and had not looked at a single change since.

10-minute test: Open your last five pull requests. Is there a review comment and a security check result on every one of them? If not, your reviewer is not doing its job, or nobody turned it on.
Try this prompt: "Review this entire codebase like a skeptical senior engineer and a security auditor. List every bug, security risk and shortcut you took, ranked by severity, before we add any new features."

Are You Pushing Straight From Your AI Tool Into Production?

This is the one I see most often. The AI writes the change, the change gets pushed, and a few seconds later it is live on Vercel or wherever the app is hosted. No branch. No pull request. No check. Your members are now testing your code for you.

Put something in between: a branch, a pull request, automated checks, a preview and a human approval, then merge.

It takes a few extra minutes per change. It also means a broken change gets caught on a preview link instead of at 2 a.m. when a crew is trying to use the app.

Watch out: "It worked when I tried it" is not a test. The AI will happily tell you a change is done and working. Make the pipeline prove it before your members find out it is not.

What Is Actually Set Up in Your GitHub Repository?

If your code lives in GitHub, that repository is now part of your department's infrastructure. Treat it that way.

ChecklistGitHub Repo Setup

  • Owned by a department account or organization, not a member's personal account
  • Two-factor authentication required for everyone with access
  • Branch protection on the main branch
  • Pull request reviews required before merging
  • Dependabot turned on for outdated and vulnerable packages
  • Secret scanning and push protection turned on
  • Code scanning such as GitHub CodeQL on every change
  • A CI workflow that runs the build, linting and tests
  • Private, unless you have deliberately decided otherwise
  • At least two people with admin access

Most of this is free or close to it, and all of it can be set up in an afternoon.

Try this prompt: "Set this project up so nothing can reach production without a pull request. Add a GitHub Actions workflow that runs the build, lint and tests on every pull request, turn on Dependabot, and give me a step-by-step list of the branch protection and security settings I need to turn on in GitHub."

Then go verify each setting yourself. Do not take the AI's word that it is done.

Does Your Department Have Security Requirements?

Before you build, find out what rules already apply to you. Many departments do not have their own IT policy, but their city, county or district does. Your cyber insurance carrier may have requirements. Your state may have rules for government systems. If your app touches anything connected to law enforcement data, CJIS requirements may come into play.

Ask the questions early:

  • Does our jurisdiction have an IT security policy, and does it cover apps built by members?
  • Does new software need approval from IT, the chief, the board or procurement?
  • Are there approved hosting providers or required data locations?
  • Does our cyber insurance policy require anything specific?
  • Who needs to be told if something goes wrong?

It is far easier to build to the rules from the start than to discover them after the app is in daily use and someone from the county IT office asks where the data lives.

Are You Storing Health Information or Personal Information?

This is where a fun side project can become a real liability.

Type of dataExamplesWhat to think about
Protected health information (PHI)Patient names tied to incidents, conditions, treatments, transportsHIPAA, Business Associate Agreements with every vendor that touches it
Personally identifiable information (PII)Member addresses, phone numbers, birth dates, license numbers, emergency contactsState privacy and breach notification laws
Member medical and personnel recordsPhysicals, medical clearances, fit tests, disciplineNeed-to-know access, retention rules, HR policy
Operational dataRosters, apparatus checks, training hoursLower risk, but still department records

If you bill for EMS or transmit health information electronically, HIPAA very likely applies to your department. That means every service that stores or processes that data, including your database, your host and possibly your AI tools, may need to sign a Business Associate Agreement with you. Many providers only offer one on specific paid plans, and plenty do not offer one at all.

Watch out: Never paste real patient or member data into an AI chat to "help debug it." Use fake test data while you build, and never put real patient information into a vibe-coded app unless the entire stack has been reviewed for HIPAA and the right agreements are signed.

The safest data is the data you never collected.

Try this prompt: "List every piece of personal or health information this app collects or stores, where it is stored, who can read it and how long we keep it. Flag anything we do not actually need."

How Are People Logging In?

Ask yourself what is actually protecting the app. I have seen department tools with a single shared password written on the station whiteboard. I have seen apps with no login at all, protected only by the hope that nobody finds the link.

Neither of those is acceptable for anything holding real information.

If your department already uses Microsoft 365 or Google Workspace, use single sign-on so members log in with their department accounts. That gives you multifactor authentication, one place to manage passwords and, most importantly, a clean way to remove access. When someone leaves the department, you disable one account and they lose access to everything.

Watch out: Plan for offboarding before your first difficult departure. If a member who left on bad terms can still log in, the problem is not the member. It is the app.

Avoid shared logins, and require multifactor authentication for anyone with administrative access.

Once They Are Logged In, What Can They See?

Logging in answers "who are you." Authorization answers "what are you allowed to do." Vibe-coded apps are often very good at the first and quietly broken on the second.

A probationary member should not be able to see every member's medical clearance. A member of one company should not be able to edit another company's roster. A regular member should not be able to make themselves an administrator by changing a value in their browser.

  • Define your roles before you build: member, officer, administrator and so on
  • Enforce permissions on the server or in the database, not just by hiding buttons on the screen
  • Turn on row level security if you are using Supabase or another Postgres database, and write policies that limit each user to the rows they should see. Without it, the public key built into your app may let anyone read your entire database.
10-minute test: Create a regular member account with no special permissions. Log in as that person and try to open another member's record, edit a roster you should not touch, and reach the admin pages by typing their addresses directly. If any of it works, you have found your most important bug.

Lock Down Your Files, Too

Row level security protects the rows in your database. It does not automatically protect the files your app stores: member photos, scanned driver's licenses, medical clearance forms, certification cards, incident photos, signed policies. Those usually live in a storage bucket, either Supabase Storage or an Amazon S3 bucket on AWS, and buckets have their own rules.

Decide what each bucket is for before you put anything in it:

BucketWhat belongs thereHow it should be set up
PublicWebsite images, event flyers, public documents you would hand to anyonePublic read is fine. Nothing private, ever.
PrivateMember documents, licenses, medical forms, incident photos, anything internal to your organizationNo public access. Files served through short-lived signed links, only to users whose role allows it.

A few rules that hold no matter which service you use:

  • Default to private. Make a bucket public only when every file in it is meant for the whole world.
  • Write storage policies. In Supabase, storage access is controlled with policies much like row level security. On AWS, keep S3 Block Public Access turned on for anything private.
  • Use signed links that expire. A link to a private file should stop working after a few minutes, not live forever in someone's text messages.
  • Do not rely on hard-to-guess file names. A long random file name is not security. If the bucket is public, assume the file can be found.
10-minute test: Log in, open a private file such as a member document, and copy its address. Paste that address into a private browser window where you are not logged in. If the file opens, so can anyone else's.
Try this prompt: "List every storage bucket this app uses, whether each one is public or private, and what kind of files go in each. Make anything with member, medical or internal files private, serve those files through short-lived signed URLs checked against the user's role, and write the storage policies to enforce it."
Try this prompt: "Audit every database table and API route for authorization. For each one, tell me which roles can read and write it, whether row level security is enabled, and write the policies that are missing."

Are You Thinking About ADA Compliance and WCAG?

If your department is part of a city or county, or is a special district, the Department of Justice's ADA Title II rule applies to the web content and mobile apps you provide. That includes apps you build yourself, and it includes internal tools your members are expected to use, not just public-facing websites. The technical standard is WCAG 2.1 Level AA.

Your organizationCompliance deadline
State or local government serving 50,000 or more peopleApril 26, 2027
State or local government serving fewer than 50,000 peopleApril 26, 2028
Any special district, including fire districts, regardless of sizeApril 26, 2028

That 2028 date sounds far away. It is not, especially if you are building new tools right now. It is much easier to build an accessible app from the start than to fix one later.

10-minute test: Put your mouse in a drawer. Try to use every screen of your app with only the Tab, Enter and arrow keys. If you get stuck, cannot see where you are, or cannot reach a button, neither can a member who relies on a keyboard or a screen reader.

Free tools like WAVE and Lighthouse will catch a lot of the basics. But be clear about what that self-testing is and is not. It is a good start. It is not proof of compliance.

If your city, county, district or procurement office requires documentation, you may be asked for a formal accessibility audit by a qualified third party and a VPAT, the Voluntary Product Accessibility Template that documents how a product conforms to WCAG. A completed VPAT is often called an Accessibility Conformance Report. A real review means people testing every screen with screen readers and keyboards, writing up the failures, and verifying the fixes.

Watch out: A professional accessibility audit and VPAT can cost more than the entire app cost you to build, sometimes much more, depending on how many screens and workflows you have, whether fixes need to be retested and what your organization requires. Find out what is required before you build, and budget for it, so a free weekend project does not turn into a surprise bill.

I wrote a more detailed breakdown of the rule in ADA Title II Web Accessibility: What It Means for Your Government Website.

Try this prompt: "Audit this app against WCAG 2.1 AA. Check keyboard navigation, visible focus, color contrast, form labels, alt text and screen reader announcements, then fix what you find and list anything you could not fix."

Does It Work on a Phone, in the Field, With Gloves On?

Your members are not going to use your app at a desk. They are going to use it on the apparatus floor, in the cab, at the scene, in bright sunlight, at night, with a cracked screen or a weak signal.

Test it the way it will actually be used:

  • Does it work on a small phone, not just a laptop with the window resized?
  • Is it still usable with large text turned on in the phone's settings?
  • Can you read it in bright sunlight and in a dark cab?
  • What happens on a weak or spotty connection?
  • Are the buttons big enough to hit quickly with a gloved finger?

Mobile and accessibility go hand in hand. Most of the things that make an app easier for a person with a disability also make it easier for a firefighter in turnout gear trying to use it in a hurry.

Where Are Your API Keys and Secrets?

AI-built apps often connect to other services: a database, an email provider, a text messaging service, an AI model. Each of those connections uses a key or password. If that key ends up in your code, in your GitHub repository or in the code sent to the browser, anyone who finds it can use it, often on your department's bill.

  • Keep secrets in your host's environment variable settings, never in the code
  • Make sure server-side secrets are never exposed to the browser
  • Set spending limits on any paid service, especially AI and text messaging
  • Rotate a key immediately if it is ever exposed, even if you deleted the commit
Watch out: Deleting a key from your code does not delete it from your git history. Once a key has been pushed, assume it has been seen and replace it.
Try this prompt: "Search this repository and its full git history for API keys, passwords and tokens. Move every secret to environment variables and confirm none of them are exposed to the browser."

Bonus Round: Nine More Worth Your Time

Ten was not quite enough.

Run Cloudflare's Free Security Audit

Cloudflare recently open-sourced a security audit skill for AI coding agents. You add it to a coding agent like Claude Code, and it turns the agent into a security auditor: it maps how your app is put together and where the trust boundaries are, works through a multi-phase audit, and has separate agents independently verify each finding before it lands in the report. Cloudflare built it for its own code, where it surfaced thousands of issues.

It is free, and it is a good second opinion on top of your regular review tools. Follow the install instructions in the repository, then run it before launch and again after any big change.

Try this prompt: "Security audit this codebase. Map the architecture and trust boundaries first, then report every verified finding with its severity, the file and line, and how to fix it."

Get a Human Penetration Test for Sensitive Data

Automated tools are good at finding known patterns. They are much weaker at the creative, business-logic attacks a real person will try, like chaining two small mistakes together to see another member's records.

If your app stores highly sensitive information, such as patient data, medical clearances, background checks, Social Security numbers or anything your jurisdiction classifies as confidential, hire a qualified human penetration tester before launch. Expect it to cost real money, typically thousands of dollars depending on scope. For an app holding that kind of information, it is worth it, and your IT office or insurance carrier may require it anyway.

Who Owns the Accounts?

The GitHub organization, the hosting account, the database, the domain and the billing should all belong to the department, with more than one authorized person able to get in. If the member who built it moves away, retires or leaves unhappy, the department should not lose the app or its data.

What Happens When It Breaks?

Add error monitoring so you know about problems before your members tell you, and write down who to call. Be honest about how critical the app is. A vibe-coded tool is fine for a duty sign-up sheet. I would think very hard before letting one sit anywhere near dispatch, patient care or anything a crew depends on during an emergency.

Are You Backing Up the Data, and Can You Get It Out?

Confirm that your database has backups and that you have actually tested restoring one. Make sure you can export your data in a usable format if you ever need to move it.

Have You Thought About Public Records and Retention?

If you are a government agency, the data your app collects may be a public record, and your state's retention rules may apply. Talk to whoever handles records requests for your jurisdiction before you start collecting information.

Can You Tell Who Changed What?

For training records, certifications, apparatus checks or member status, keep an audit trail of who made each change and when. It will matter the first time a record is questioned.

Are Your Public Forms Protected?

If any part of your app is open to the public, like a recruitment interest form or an event registration, add spam protection and rate limiting. Bots find open forms fast.

Who Maintains It Next Year?

Building it is the fun part. Keeping packages updated, fixing what breaks and answering questions is the part that lasts. Document how the app works, where everything lives and how to deploy it, so the next person is not starting from scratch.

The Prompt Pack

Here are the prompts from this article in one place. Copy each one into your AI coding tool and work through them in order before launch. Then do it again before any major update. Each one is a starting point, not a guarantee, so read what comes back and verify it yourself.

Try this prompt: "Review this entire codebase like a skeptical senior engineer and a security auditor. List every bug, security risk and shortcut you took, ranked by severity, before we add any new features."
Try this prompt: "Set this project up so nothing can reach production without a pull request. Add a GitHub Actions workflow that runs the build, lint and tests on every pull request, turn on Dependabot, and give me a step-by-step list of the branch protection and security settings I need to turn on in GitHub."
Try this prompt: "List every piece of personal or health information this app collects or stores, where it is stored, who can read it and how long we keep it. Flag anything we do not actually need."
Try this prompt: "Audit every database table and API route for authorization. For each one, tell me which roles can read and write it, whether row level security is enabled, and write the policies that are missing."
Try this prompt: "List every storage bucket this app uses, whether each one is public or private, and what kind of files go in each. Make anything with member, medical or internal files private, serve those files through short-lived signed URLs checked against the user's role, and write the storage policies to enforce it."
Try this prompt: "Audit this app against WCAG 2.1 AA. Check keyboard navigation, visible focus, color contrast, form labels, alt text and screen reader announcements, then fix what you find and list anything you could not fix."
Try this prompt: "Search this repository and its full git history for API keys, passwords and tokens. Move every secret to environment variables and confirm none of them are exposed to the browser."
Try this prompt: "Security audit this codebase. Map the architecture and trust boundaries first, then report every verified finding with its severity, the file and line, and how to fix it."

ChecklistBefore Your App Goes Live

  • Every change is reviewed by a tool, a person or both
  • Your review and security tools are actually running on every pull request
  • Nothing reaches production without a pull request and passing checks
  • The GitHub repo is department-owned, private and protected
  • You know your jurisdiction's IT and security requirements
  • You collect only the data you need, and no real PHI without a HIPAA review
  • Members log in with single sign-on and MFA
  • Roles are defined and enforced, with row level security on
  • Private files live in private buckets, served through expiring links
  • You passed the regular-member test
  • You passed the keyboard-only test and a WCAG 2.1 AA audit
  • You know whether a formal audit and VPAT are required, and budgeted for it
  • It works on a small phone, in sunlight, with gloves
  • No secrets in the code or the browser, and spending limits are set
  • You ran Cloudflare's security audit, and a human pen test if the data is sensitive
  • At least two people can get into every account
  • Backups exist and a restore has been tested
  • Someone owns maintenance for the next year

Keep Building, but Build Like It Matters

I am not trying to talk anyone out of this. The ability to build your own tools is one of the most exciting things to happen to the fire service in a long time. Departments that could never afford custom software can now build exactly what they need.

But a fire or EMS department is not a startup that can move fast and break things. You hold sensitive information about your members and your community. You have legal obligations. And people trust that the tools you use work.

So vibe code. Build the thing. Just put the guardrails around it before it becomes something your department depends on. Your future self, your IT office and your members will thank you.