Security — You’re Responsible for Keeping Your Users Safe




You’re a developer. You know what a SQL injection is. You know not to store passwords in plaintext. But there’s a gap between “knowing security basics” and “running a secure product that real people trust with their data.”

When someone signs up for your product and enters their email, password, and potentially payment information, they’re trusting you. If you violate that trust — through negligence, shortcuts, or ignorance — there may be no recovery. A security breach for a solo product isn’t just a PR problem. It can be a legal liability, a financial catastrophe, and the end of your business.

## The Minimum Security You Cannot Skip

There’s a lot of security best practice. For a solo founder shipping a product, here’s the non-negotiable minimum:

**Passwords: Never store them. Ever.**
Use bcrypt, scrypt, or Argon2 for password hashing. Never store plaintext passwords. Never store unsalted hashes. Never roll your own authentication if you can avoid it. Use established auth libraries or services like Auth0, Clerk, Supabase Auth, or Firebase Auth.

If your database gets hacked (assume it will eventually), properly hashed passwords protect your users. Plaintext passwords expose them everywhere — because people reuse passwords across services.

**HTTPS everywhere.**
Every page, every API endpoint, every resource. No exceptions. It’s free with Let’s Encrypt and most hosting providers include it automatically. There is zero excuse for serving anything over HTTP in 2025+.

**Keep secrets out of code.**
API keys, database credentials, encryption keys — none of these belong in your Git repository. Not even in a “private” repo. Use environment variables or a secrets manager. And check your Git history — if you ever committed a secret and then removed it, it’s still in the history. You need to rotate that credential and scrub the history.

This isn’t hypothetical. Bots actively scan GitHub for accidentally committed API keys and exploit them within minutes. Developers have woken up to five-figure AWS bills because a committed key was used to spin up cryptocurrency miners.

**Input validation and sanitization.**
Every input from a user — form fields, URL parameters, file uploads, API requests — is a potential attack vector. Validate on the server side (client-side validation is a UX feature, not a security feature). Use parameterized queries for database operations. Sanitize any user content that gets rendered as HTML to prevent XSS.

## Data Protection Beyond Passwords

User data goes beyond passwords. Email addresses, names, payment information, usage patterns, uploaded content — all of this is your responsibility.

**Principle of least data:** Only collect what you actually need. Every piece of data you store is data you must protect. If you don’t need someone’s phone number, don’t ask for it. Fewer fields = less liability.

**Encryption at rest:** Encrypt sensitive data in your database. Most modern database services offer encryption at rest as a configuration option. Turn it on.

**Encryption in transit:** HTTPS covers client-to-server. But also encrypt sensitive data in internal communications — between your server and your database, between microservices, in API calls to third parties.

**Access control:** In a solo operation, you’re the only one with access. Keep it that way. Use 2FA on every service — hosting, database, domain registrar, email, payment processor. One compromised account can cascade into a full breach.

**Backups:** Regular, automated, encrypted backups stored separately from your production system. Test that you can actually restore from a backup. A backup you can’t restore isn’t a backup — it’s a false sense of security.

## When (Not If) Something Goes Wrong

Security incidents happen to everyone. The question isn’t whether you’ll face one, but how you’ll respond.

**Have a breach response plan.** Even a simple checklist:
1. Identify what was compromised and when
2. Stop the breach (revoke compromised credentials, patch the vulnerability, take affected systems offline if needed)
3. Assess the impact (which users affected, what data exposed)
4. Notify affected users honestly and promptly (required by law in many jurisdictions — GDPR requires 72-hour notification)
5. Notify relevant authorities if required
6. Document what happened and why
7. Fix the root cause
8. Communicate what you’ve done to prevent recurrence

Transparency during a breach builds more trust than the breach destroys — if handled well. Cover-ups or delayed notifications are what truly kill customer relationships and invite regulatory action.

## Security Isn’t a Checklist — It’s a Habit

The most dangerous time for security is when things are going well. You’re shipping fast, adding features, growing. Security checks feel like speed bumps. “I’ll come back and fix that later.” You won’t.

Build security into your workflow:
– **Code review with security eyes.** Before shipping, scan for hardcoded secrets, unvalidated inputs, and insecure endpoints. Even SonarQube’s free tier or GitHub’s built-in code scanning helps.
– **Dependency updates.** Keep your libraries updated. Known vulnerabilities in outdated packages are the easiest attack vector. Use `npm audit`, `pip audit`, or Dependabot.
– **Regular access audit.** Once a month, review who/what has access to your systems. Revoke tokens and permissions you no longer need.

## 🔨 Your Action Item: The 60-Minute Security Audit

Do this today:

1. **Search your repository for secrets.** Run `git log –all` and search for API keys, passwords, or connection strings. Use a tool like truffleHog or gitleaks. If you find any, rotate those credentials immediately.
2. **Enable 2FA** on every service you use: GitHub, hosting provider, domain registrar, email, payment processor.
3. **Verify HTTPS** is enabled on all your endpoints and your landing page.
4. **Check your password storage.** Are you using bcrypt/scrypt/Argon2? If using a third-party auth service, confirm they handle this properly.
5. **Run `npm audit` or equivalent** for your language/framework. Fix critical vulnerabilities.
6. **Set up automated backups** if you haven’t. Test restoration once.

**CTA Tip:** Security is like insurance — you don’t appreciate it until you need it, and by then it’s too late to get it. Spend one hour this week on the audit above. Then schedule a 30-minute monthly security review on your calendar. Protect passwords, protect customer data, never expose credentials in public repositories. Your users chose to trust you. Honor that.

*Next up: Beyond security lies privacy — a broader responsibility about how you handle, share, and respect user information. Let’s dig into what privacy actually means for your product.*


← Back to Blog