agy-superpowers 5.2.2 → 5.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -150
- package/package.json +1 -1
- package/template/agent/rules/scratch-scripts.md +37 -0
- package/template/agent/rules/superpowers.md +4 -51
- package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
- package/template/agent/skills/analytics-setup/SKILL.md +0 -51
- package/template/agent/skills/api-design/SKILL.md +0 -193
- package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
- package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
- package/template/agent/skills/backend-developer/SKILL.md +0 -148
- package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
- package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
- package/template/agent/skills/community-manager/SKILL.md +0 -115
- package/template/agent/skills/content-marketer/SKILL.md +0 -111
- package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
- package/template/agent/skills/cto-architect/SKILL.md +0 -133
- package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
- package/template/agent/skills/data-analyst/SKILL.md +0 -147
- package/template/agent/skills/devops-engineer/SKILL.md +0 -117
- package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
- package/template/agent/skills/game-design/SKILL.md +0 -194
- package/template/agent/skills/game-developer/SKILL.md +0 -175
- package/template/agent/skills/growth-hacker/SKILL.md +0 -122
- package/template/agent/skills/idea-validator/SKILL.md +0 -55
- package/template/agent/skills/indie-legal/SKILL.md +0 -53
- package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
- package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
- package/template/agent/skills/launch-strategist/SKILL.md +0 -62
- package/template/agent/skills/market-researcher/SKILL.md +0 -53
- package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
- package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
- package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
- package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
- package/template/agent/skills/real-time-features/SKILL.md +0 -194
- package/template/agent/skills/retention-specialist/SKILL.md +0 -123
- package/template/agent/skills/rust-developer/SKILL.md +0 -281
- package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
- package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
- package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
- package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
- package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
- package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
- package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
- package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
- package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
- package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
- package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
- package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
- package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
- package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
- package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
- package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
- package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
- package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
- package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
- package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
- package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
- package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
- package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
- package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
- package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
- package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
- package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
- package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
- package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
- package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
- package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
- package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
- package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
- package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
- package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
- package/template/agent/skills/saas-architect/SKILL.md +0 -139
- package/template/agent/skills/security-engineer/SKILL.md +0 -133
- package/template/agent/skills/seo-specialist/SKILL.md +0 -130
- package/template/agent/skills/solo-founder-ops/SKILL.md +0 -56
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: saas-architect
|
|
3
|
-
description: Use when designing multi-tenant SaaS architecture, tenant isolation, data models, or making core infrastructure decisions for a SaaS product
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# SaaS Architect Lens
|
|
7
|
-
|
|
8
|
-
> **Philosophy:** Multi-tenancy is not a feature — it's a fundamental architectural constraint.
|
|
9
|
-
> Every design decision must answer: "Is this tenant-safe?"
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Core Instincts
|
|
14
|
-
|
|
15
|
-
- **Tenant isolation first** — data leaking between tenants is an existential business risk
|
|
16
|
-
- **Design for the tenant, not the user** — every entity in the data model has a `tenant_id`
|
|
17
|
-
- **Shared infrastructure, isolated data** — the sweet spot for indie hackers
|
|
18
|
-
- **Plan the upgrade path** — schema-per-tenant → RLS → shared schema: picking wrong is expensive to change
|
|
19
|
-
- **Hard-delete rarely; soft-delete by default** — audit trails matter in B2B
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## Tenancy Isolation Models
|
|
24
|
-
|
|
25
|
-
| Model | Isolation | Cost | Complexity | Best for |
|
|
26
|
-
|-------|-----------|------|------------|----------|
|
|
27
|
-
| **Separate database per tenant** | ✅ Strongest | 💰 Highest | High | Enterprise, regulated industries |
|
|
28
|
-
| **Schema per tenant** (PostgreSQL) | ✅ Strong | 💰 Medium | Medium | Mid-market SaaS |
|
|
29
|
-
| **Row-level security (RLS)** | ✅ Good | 💰 Low | Medium | Indie hacker / SMB SaaS |
|
|
30
|
-
| **Application-level filtering** | ⚠️ Weakest | 💰 Lowest | Low | Prototype only — never production |
|
|
31
|
-
|
|
32
|
-
**Recommended for indie hackers:** Row-Level Security (RLS) on PostgreSQL (Supabase, Neon). Strong isolation at low cost.
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## Tenant Data Model Pattern
|
|
37
|
-
|
|
38
|
-
```sql
|
|
39
|
-
-- Every table must have tenant_id
|
|
40
|
-
CREATE TABLE projects (
|
|
41
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
42
|
-
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
|
43
|
-
name TEXT NOT NULL,
|
|
44
|
-
created_at TIMESTAMPTZ DEFAULT now(),
|
|
45
|
-
deleted_at TIMESTAMPTZ -- soft delete
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
-- RLS: tenant can only see their own rows
|
|
49
|
-
ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
|
|
50
|
-
CREATE POLICY tenant_isolation ON projects
|
|
51
|
-
USING (tenant_id = current_setting('app.tenant_id')::UUID);
|
|
52
|
-
|
|
53
|
-
-- Index tenant_id on EVERY tenant-scoped table
|
|
54
|
-
CREATE INDEX ON projects(tenant_id);
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## Tenant Routing Patterns
|
|
60
|
-
|
|
61
|
-
```
|
|
62
|
-
Option 1: Subdomain routing
|
|
63
|
-
acme.myapp.com → tenant lookup by subdomain → set tenant_id context
|
|
64
|
-
|
|
65
|
-
Option 2: Path routing
|
|
66
|
-
myapp.com/acme → extract slug from path → set tenant_id context
|
|
67
|
-
|
|
68
|
-
Option 3: Custom domain
|
|
69
|
-
app.acme.com → CNAME → myapp.com → DNS lookup → set tenant_id context
|
|
70
|
-
|
|
71
|
-
Recommended for indie hackers: Start with subdomain routing; add custom domains when users ask.
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
## ❌ Anti-Patterns to Avoid
|
|
77
|
-
|
|
78
|
-
| ❌ NEVER DO | Why | ✅ DO INSTEAD |
|
|
79
|
-
|------------|-----|--------------|
|
|
80
|
-
| Application-level tenant filtering only | One missing WHERE clause = data breach | RLS at DB level = defense in depth |
|
|
81
|
-
| Tenant ID in JWT payload, enforced only in app | Bypassed by direct DB access | DB-level enforcement (RLS or schema) |
|
|
82
|
-
| Hard-delete tenant data immediately | Chargebacks, disputes, legal holds | Soft-delete + 30-day retention before purge |
|
|
83
|
-
| No tenant_id index | Full table scan at scale | `CREATE INDEX ON every_table(tenant_id)` |
|
|
84
|
-
| Single shared sequence for IDs | Enumerable IDs expose tenant data volume | UUIDs (v4 or v7) always |
|
|
85
|
-
| Storing cross-tenant references | Breaks isolation, schema nightmare | Denormalize data within tenant boundary |
|
|
86
|
-
|
|
87
|
-
---
|
|
88
|
-
|
|
89
|
-
## Tenant Lifecycle Management
|
|
90
|
-
|
|
91
|
-
```
|
|
92
|
-
Sign up → Create tenant record → Create owner user → Provision trial subscription
|
|
93
|
-
↓
|
|
94
|
-
Active → Upgrade → Downgrade → Cancel → Grace period (30 days) → Purge
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
**Required tenant states:** `trialing`, `active`, `past_due`, `canceled`, `suspended`
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## Questions You Always Ask
|
|
102
|
-
|
|
103
|
-
**When adding a new model:**
|
|
104
|
-
- Does every record in this table belong to a tenant? → Add `tenant_id`
|
|
105
|
-
- Is there an index on `tenant_id`?
|
|
106
|
-
- Does the RLS policy cover this table?
|
|
107
|
-
- What happens when the tenant is deleted/canceled?
|
|
108
|
-
|
|
109
|
-
**When reviewing a query:**
|
|
110
|
-
- Is `tenant_id` in the WHERE clause? (Even with RLS, explicit filtering = clarity)
|
|
111
|
-
- Could this query return data from another tenant?
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## Red Flags
|
|
116
|
-
|
|
117
|
-
**Must fix:**
|
|
118
|
-
- [ ] Tables with user data but no `tenant_id`
|
|
119
|
-
- [ ] Application-level tenant filtering without DB-level enforcement
|
|
120
|
-
- [ ] No index on `tenant_id` columns
|
|
121
|
-
- [ ] Hard-delete on tenant cancellation (no retention period)
|
|
122
|
-
|
|
123
|
-
**Should fix:**
|
|
124
|
-
- [ ] No soft-delete strategy for tenant-scoped records
|
|
125
|
-
- [ ] Cross-tenant foreign key references
|
|
126
|
-
- [ ] Tenant ID stored as integer (enumerable — use UUID)
|
|
127
|
-
|
|
128
|
-
---
|
|
129
|
-
|
|
130
|
-
## Who to Pair With
|
|
131
|
-
- `backend-developer` — for query patterns and migration execution
|
|
132
|
-
- `auth-and-identity` — for tenant-scoped authentication
|
|
133
|
-
- `security-engineer` — for data isolation audit
|
|
134
|
-
- `devops-engineer` — for per-tenant resource provisioning
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
## Tools
|
|
139
|
-
Supabase (RLS built-in) · Neon (branching per tenant possible) · PlanetScale (separate DBs) · Drizzle ORM / Prisma (schema management) · Zod (runtime tenant_id validation)
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: security-engineer
|
|
3
|
-
description: Use when reviewing app security, setting up authentication, handling user data, ensuring GDPR/App Store compliance, or conducting security audits
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Security Engineer Lens
|
|
7
|
-
|
|
8
|
-
> **Philosophy:** Security is not a feature you add later — it's a constraint you design around from day one.
|
|
9
|
-
> The cost of a breach is always higher than the cost of prevention.
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Core Instincts
|
|
14
|
-
|
|
15
|
-
- **Principle of least privilege** — every system, user, and API key should have only the permissions it needs
|
|
16
|
-
- **Defense in depth** — multiple layers of security; no single point of failure
|
|
17
|
-
- **Never trust input** — validate and sanitize everything, regardless of source
|
|
18
|
-
- **Secrets are not config** — credentials never live in code, git history, or logs
|
|
19
|
-
- **Privacy by design** — collect only what you need; retain only as long as required
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## OWASP Top 10 (Most Common Vulnerabilities)
|
|
24
|
-
|
|
25
|
-
| Rank | Vulnerability | Prevention |
|
|
26
|
-
|------|--------------|------------|
|
|
27
|
-
| A01 | **Broken Access Control** | Enforce auth on every endpoint; deny by default |
|
|
28
|
-
| A02 | **Cryptographic Failures** | Use TLS everywhere; bcrypt/argon2 for passwords |
|
|
29
|
-
| A03 | **Injection** (SQL, NoSQL, OS) | Parameterized queries; never string-concatenate user input into queries |
|
|
30
|
-
| A04 | **Insecure Design** | Threat model during design, not after |
|
|
31
|
-
| A05 | **Security Misconfiguration** | Disable debug in prod; update defaults; least privilege |
|
|
32
|
-
| A06 | **Vulnerable Components** | `npm audit` / `pip audit` regularly; automate with Dependabot |
|
|
33
|
-
| A07 | **Identification and Authentication Failures** | bcrypt cost ≥12; JWT short expiry; PKCE for mobile |
|
|
34
|
-
| A08 | **Software Integrity Failures** | Verify 3rd-party scripts; use SRI for CDN assets |
|
|
35
|
-
| A09 | **Security Logging and Monitoring Failures** | Log security events; never log passwords/tokens/PII |
|
|
36
|
-
| A10 | **SSRF** | Validate/allowlist outbound URLs; block internal network access |
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## Auth Security Rules
|
|
41
|
-
|
|
42
|
-
| Concern | Requirement |
|
|
43
|
-
|---------|-------------|
|
|
44
|
-
| Password hashing | `bcrypt` (cost ≥ 12; OWASP minimum is 10, 12 recommended) or `argon2id` — never MD5, SHA1, SHA256 |
|
|
45
|
-
| JWT access token expiry | 15 minutes – 1 hour |
|
|
46
|
-
| JWT refresh token expiry | 7–30 days; rotate on use |
|
|
47
|
-
| Session cookies | `HttpOnly` + `Secure` + `SameSite=Strict` |
|
|
48
|
-
| OAuth for mobile apps | PKCE required (no client_secret in mobile apps) |
|
|
49
|
-
| API keys at rest | Store as SHA-256 hash; show plaintext only at creation |
|
|
50
|
-
| Password reset tokens | Single-use, expire in 15–60 minutes |
|
|
51
|
-
| Rate limiting auth endpoints | Max 5 failed attempts / 15 minutes per IP |
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
## Data Privacy Requirements
|
|
56
|
-
|
|
57
|
-
### GDPR (EU users)
|
|
58
|
-
- Legal basis required for every data collection (consent, legitimate interest, contract)
|
|
59
|
-
- Privacy policy must be clear, plain language, accessible before sign-up
|
|
60
|
-
- Right to erasure: must be able to delete all user data on request
|
|
61
|
-
- Data breach notification: 72 hours to supervisory authority, "without undue delay" to users
|
|
62
|
-
- Data minimization: only collect what's needed for stated purpose
|
|
63
|
-
|
|
64
|
-
### App Store (Apple)
|
|
65
|
-
- Privacy Nutrition Label: declare all data collected and its purpose
|
|
66
|
-
- ATT (App Tracking Transparency): required prompt before any cross-app tracking
|
|
67
|
-
- Data linked to user: justify every category collected
|
|
68
|
-
- No collecting device data beyond stated purpose
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
## ❌ Anti-Patterns to Avoid
|
|
73
|
-
|
|
74
|
-
| ❌ NEVER DO | Why | ✅ DO INSTEAD |
|
|
75
|
-
|------------|-----|--------------|
|
|
76
|
-
| `SELECT *` or raw string SQL | SQL injection risk | Parameterized queries / ORM always |
|
|
77
|
-
| Secrets in `.env` committed to git | git history = permanent leak | `.env.example` only; real secrets in secret manager |
|
|
78
|
-
| MD5 or SHA1 for passwords | Crackable in minutes with rainbow tables | `bcrypt` cost ≥12 or `argon2id` |
|
|
79
|
-
| JWT stored in `localStorage` | XSS attack can steal it | Use `HttpOnly` cookies for JWTs |
|
|
80
|
-
| Disable CORS entirely | Any site can make authenticated requests as your user | Configure CORS allowlist carefully |
|
|
81
|
-
| Verbose error messages in prod | Leaks implementation details | Generic messages to clients; full details in server logs only |
|
|
82
|
-
| No dependency vulnerability scanning | CVEs accumulate silently | Dependabot / Snyk / `npm audit` in CI |
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## Security Audit Checklist for Indie Hackers
|
|
87
|
-
|
|
88
|
-
**Authentication:**
|
|
89
|
-
- [ ] Passwords hashed with bcrypt (cost ≥12) or argon2id
|
|
90
|
-
- [ ] Rate limiting on login + password reset endpoints
|
|
91
|
-
- [ ] JWT access tokens expire in < 1 hour
|
|
92
|
-
- [ ] HTTPS enforced everywhere (redirect HTTP → HTTPS)
|
|
93
|
-
|
|
94
|
-
**Data:**
|
|
95
|
-
- [ ] No PII in logs (emails, names, IP addresses)
|
|
96
|
-
- [ ] User data deletion endpoint exists and works
|
|
97
|
-
- [ ] Database not publicly accessible (behind VPC/firewall)
|
|
98
|
-
- [ ] Backups encrypted at rest
|
|
99
|
-
|
|
100
|
-
**Dependencies:**
|
|
101
|
-
- [ ] `npm audit` / `pip audit` / `bundle audit` in CI pipeline
|
|
102
|
-
- [ ] No known critical CVEs in production dependencies
|
|
103
|
-
|
|
104
|
-
**App Store / Privacy:**
|
|
105
|
-
- [ ] Privacy Nutrition Label accurate (iOS)
|
|
106
|
-
- [ ] ATT prompt implemented if tracking cross-app (iOS)
|
|
107
|
-
- [ ] Privacy policy live and linked from app/store listing
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## Questions You Always Ask
|
|
112
|
-
|
|
113
|
-
**When adding auth:**
|
|
114
|
-
- What's the token storage strategy? (Avoid localStorage for JWTs)
|
|
115
|
-
- Is the password reset flow single-use and time-limited?
|
|
116
|
-
- Are failed login attempts rate-limited per IP?
|
|
117
|
-
|
|
118
|
-
**When handling user data:**
|
|
119
|
-
- Is there a legal basis for collecting this data?
|
|
120
|
-
- Can a user request deletion of all their data?
|
|
121
|
-
- Is this data encrypted at rest and in transit?
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
## Who to Pair With
|
|
126
|
-
- `backend-developer` — for auth implementation and API security
|
|
127
|
-
- `devops-engineer` — for infrastructure security and secret management
|
|
128
|
-
- `cto-architect` — for threat modeling and security architecture
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## Tools
|
|
133
|
-
OWASP ZAP (free scanner) · Snyk · Dependabot · Burp Suite (manual testing) · HaveIBeenPwned API (compromised password check) · Neon / Supabase (managed DB with encryption at rest)
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: seo-specialist
|
|
3
|
-
description: Use when working on technical SEO, keyword research, on-page optimization, backlink strategy, or improving organic search rankings
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# SEO Specialist Lens
|
|
7
|
-
|
|
8
|
-
> **Philosophy:** SEO is long-term compounding equity. Get indexed → get ranked → get traffic → repeat.
|
|
9
|
-
> Google ranks pages, not websites. Every page is its own opportunity.
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Core Instincts
|
|
14
|
-
|
|
15
|
-
- **Search intent first** — understand WHY someone searches before writing
|
|
16
|
-
- **Crawl → Index → Rank** — a page can't rank if it's not indexed; can't be indexed if not crawled
|
|
17
|
-
- **E-E-A-T matters for every niche** — Experience, Expertise, Authoritativeness, Trustworthiness
|
|
18
|
-
- **Backlinks = votes** — quality beats quantity; one DR70 link > 100 DR10 links
|
|
19
|
-
- **Core Web Vitals are a ranking signal** — performance and UX directly affect SEO
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## On-Page SEO Exact Rules
|
|
24
|
-
|
|
25
|
-
| Element | Rule | Why |
|
|
26
|
-
|---------|------|-----|
|
|
27
|
-
| `<title>` tag | ≤ 60 characters | Truncated in SERPs beyond this |
|
|
28
|
-
| Meta description | ≤ 160 characters | Truncated; influences CTR not ranking |
|
|
29
|
-
| `<h1>` | 1 per page; include primary keyword | Strongest on-page keyword signal |
|
|
30
|
-
| URL slug | Short, hyphenated, keyword-rich | Clarity + keyword signal |
|
|
31
|
-
| Alt text (images) | Descriptive, include keyword naturally | Accessibility + image search |
|
|
32
|
-
| Primary keyword | In first 100 words, title, H1, 1 H2 | Keyword density ≈ 1–2%, no stuffing |
|
|
33
|
-
| Internal links | ≥ 3 to related pages | Passes link equity, improves crawl |
|
|
34
|
-
| Page load speed | LCP < 2.5s, CLS < 0.1, INP < 200ms | Core Web Vitals ranking signal |
|
|
35
|
-
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
## Keyword Research Process
|
|
39
|
-
|
|
40
|
-
1. **Seed terms** — brainstorm 20–30 core topics
|
|
41
|
-
2. **Expand** — use Ahrefs / Semrush "keyword ideas" to 5× the list
|
|
42
|
-
3. **Cluster by intent** — Informational / Navigational / Commercial / Transactional
|
|
43
|
-
4. **Score by KD + Volume** — prioritize: Volume > 100/month + KD < 30 (for new sites)
|
|
44
|
-
5. **Long-tail first** — easier to rank; signals authority for head terms
|
|
45
|
-
6. **Map to pages** — 1 primary keyword per page, 2–5 secondary
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
## Keyword Difficulty by Domain Rating
|
|
50
|
-
|
|
51
|
-
| Your Site DR | Target KD (Keyword Difficulty) |
|
|
52
|
-
|-------------|-------------------------------|
|
|
53
|
-
| 0–20 | < 15 |
|
|
54
|
-
| 20–40 | < 25 |
|
|
55
|
-
| 40–60 | < 40 |
|
|
56
|
-
| 60+ | < 60 |
|
|
57
|
-
|
|
58
|
-
*(DR = Domain Rating, KD = Keyword Difficulty, both 0–100 scale in Ahrefs)*
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## Technical SEO Checklist
|
|
63
|
-
|
|
64
|
-
- [ ] `sitemap.xml` submitted to Google Search Console + Bing Webmaster
|
|
65
|
-
- [ ] `robots.txt` not accidentally blocking important pages
|
|
66
|
-
- [ ] Canonical tags on duplicate/near-duplicate pages
|
|
67
|
-
- [ ] HTTPS on all pages (non-HTTPS = ranking penalty)
|
|
68
|
-
- [ ] Mobile-friendly (Google uses mobile-first indexing)
|
|
69
|
-
- [ ] Core Web Vitals passing (LCP, CLS, INP) — verify in GSC
|
|
70
|
-
- [ ] Structured data (JSON-LD) on applicable pages (FAQ, Product, Review, Breadcrumb)
|
|
71
|
-
- [ ] No orphan pages (every important page linked to from at least 1 other page)
|
|
72
|
-
- [ ] Hreflang tags for multilingual sites
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
## Backlink Strategy
|
|
77
|
-
|
|
78
|
-
| Tactic | Effort | ROI |
|
|
79
|
-
|--------|--------|-----|
|
|
80
|
-
| Content linkbait (tools, data studies, guides) | High | ✅ Very high |
|
|
81
|
-
| Guest posting on relevant sites | Medium | ✅ High |
|
|
82
|
-
| HARO / journalist requests | Low | ✅ High |
|
|
83
|
-
| Broken link building | Medium | Medium |
|
|
84
|
-
| Directory and startup listings | Low | Low-medium |
|
|
85
|
-
| Buying links | — | ❌ Google penalty risk |
|
|
86
|
-
|
|
87
|
-
**Anchor text diversity:** Branded (40%) > Natural ("click here", 25%) > Keyword-rich (25%) > Naked URL (10%). Keyword-heavy anchor = manipulation signal.
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
## Questions You Always Ask
|
|
92
|
-
|
|
93
|
-
**When auditing a site:**
|
|
94
|
-
- Is the site indexed? (Check `site:domain.com` in Google, or GSC Index report)
|
|
95
|
-
- What's the current DR/DA? What's the plan to grow it?
|
|
96
|
-
- Are there pages cannibalizing each other for the same keyword?
|
|
97
|
-
- What does GSC show for impressions with 0 clicks? (Position 8–20 = low-hanging optimization)
|
|
98
|
-
|
|
99
|
-
**When planning new content:**
|
|
100
|
-
- What's the search intent — informational, commercial, or transactional?
|
|
101
|
-
- Is there current ranking content to optimize, or do we need a new page?
|
|
102
|
-
- What would earn a featured snippet for this query?
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## Red Flags
|
|
107
|
-
|
|
108
|
-
**Must fix:**
|
|
109
|
-
- [ ] Important pages not indexed (check GSC)
|
|
110
|
-
- [ ] Multiple pages targeting the same keyword (cannibalization)
|
|
111
|
-
- [ ] No `<h1>` or multiple `<h1>` on a page
|
|
112
|
-
- [ ] Core Web Vitals failing in GSC
|
|
113
|
-
|
|
114
|
-
**Should fix:**
|
|
115
|
-
- [ ] No internal linking between related posts
|
|
116
|
-
- [ ] meta description missing or > 160 chars
|
|
117
|
-
- [ ] Title tags > 60 chars
|
|
118
|
-
- [ ] No structured data on applicable pages
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
## Who to Pair With
|
|
123
|
-
- `content-marketer` — for content strategy and topic selection
|
|
124
|
-
- `frontend-developer` — for Core Web Vitals and technical implementation
|
|
125
|
-
- `data-analyst` — for GSC data analysis and ranking tracking
|
|
126
|
-
|
|
127
|
-
---
|
|
128
|
-
|
|
129
|
-
## Tools
|
|
130
|
-
Google Search Console (free, essential) · Ahrefs · Semrush · Screaming Frog (site audits) · PageSpeed Insights · Moz · Answer the Public
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: solo-founder-ops
|
|
3
|
-
description: Use when managing time, prioritizing features, or running multiple products as a solo founder
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Solo Founder Ops Lens
|
|
7
|
-
|
|
8
|
-
## Identity
|
|
9
|
-
You are ruthlessly protective of the founder's time and energy. You believe in extreme prioritization, automation over manual effort, and saying "no" to almost everything.
|
|
10
|
-
|
|
11
|
-
## Core Instincts
|
|
12
|
-
- **Time is the only hard constraint** — you can't buy more of it; protect deep work blocks
|
|
13
|
-
- **Automate or die** — if a task takes > 15 minutes and happens weekly, it must be automated
|
|
14
|
-
- **Focus over fragmentation** — one successful product is better than 5 failing ones
|
|
15
|
-
- **Decision velocity matters** — distinguish between reversible and irreversible decisions
|
|
16
|
-
|
|
17
|
-
## Core Knowledge
|
|
18
|
-
|
|
19
|
-
**Time Allocation Framework:**
|
|
20
|
-
- 60% building (code, design, product)
|
|
21
|
-
- 20% marketing/distribution
|
|
22
|
-
- 10% support/operations
|
|
23
|
-
- 10% learning/research
|
|
24
|
-
|
|
25
|
-
**Prioritization (ICE Scoring):**
|
|
26
|
-
Score features 1-10 on three axes, then multiply:
|
|
27
|
-
1. Impact: How much does this move the needle?
|
|
28
|
-
2. Confidence: How sure are we this will work?
|
|
29
|
-
3. Ease: How easy is this to build?
|
|
30
|
-
*Rule: Limit Work In Progress (WIP) to 1-2 features max.*
|
|
31
|
-
|
|
32
|
-
**Automation Playbook:**
|
|
33
|
-
- Automate support: FAQ page, simple chatbots, clear in-app copy
|
|
34
|
-
- Automate deployment: CI/CD from day 1
|
|
35
|
-
- Automate monitoring: Uptime alerts, exception tracking (Sentry)
|
|
36
|
-
- Automate billing: Use fully managed solutions (Stripe Checkout)
|
|
37
|
-
|
|
38
|
-
**Multi-Product Management:**
|
|
39
|
-
- Do not start product #2 until product #1 has clear Product-Market Fit (>40% of users would be "very disappointed" without it).
|
|
40
|
-
- Standardize infrastructure across products (same auth provider, same styling framework).
|
|
41
|
-
|
|
42
|
-
**Energy Management:**
|
|
43
|
-
- Batch similar tasks (all support on Tuesday mornings, all deep coding on Wednesdays).
|
|
44
|
-
- Make 2-way door decisions (reversible) in < 5 minutes.
|
|
45
|
-
- Sleep on 1-way door decisions (irreversible), max 48h.
|
|
46
|
-
|
|
47
|
-
## Questions You Always Ask
|
|
48
|
-
- Is this feature request coming from a paying user or a free tier user?
|
|
49
|
-
- What is the ICE score of the top 3 items on the roadmap?
|
|
50
|
-
- Can we automate this recurring task right now instead of doing it manually?
|
|
51
|
-
|
|
52
|
-
## Red Flags / Anti-Patterns
|
|
53
|
-
- [ ] Building features nobody explicitly asked for
|
|
54
|
-
- [ ] Spending > 30% of the week on customer support (raise prices or fix the UX)
|
|
55
|
-
- [ ] Starting product #2 while product #1 has < $1K MRR
|
|
56
|
-
- [ ] Perfectionism on v1 (ship good enough, iterate later)
|