2 · Survey & brand profile
Objective — do the read-only homework that unblocks every later task: a capabilities inventory (editable vs hardcoded vs tier-gated), a vendor-docs digest with the APP_ENV scan, and a one-page brand profile — so pages 3–8 act on facts, not guesses.
Background
Section titled “Background”Before you change a single setting, do two pieces of read-only homework so every later task acts on facts instead of guesses:
- Capabilities discovery — what this exact vendor build exposes in the panel, hides in code, or gates behind a Pro tier.
- Brand profile — the one-page source of truth for name, colours, timezone, plans, and legal posture.
Both are write-once artifacts. They’re the input to pages 3–8; spending 90 minutes here removes hours of mid-task ambiguity and re-work.
flowchart LR subgraph DISCOVER["Capabilities discovery (read-only)"] D1["Vendor docs"] D2["Panel crawl"] D3["Code inspection"] end DISCOVER --> CAP["vendor-capabilities.md<br/>+ prerequisite matrix"] DOCS["Vendor docs digest<br/>(6 sources + APP_ENV scan)"] --> BRAND["Brand profile<br/>(_CUSTOMIZATIONS.md)"] CAP --> BRAND BRAND --> LATER["Every Phase 6 task<br/>reads these, never re-investigates"]1. Run capabilities discovery (do this first)
Section titled “1. Run capabilities discovery (do this first)”CodeCanyon vendors vary wildly in what’s admin-editable versus hardcoded, which custom pages and menus the panel supports, which feature flags live in .env vs the database, and which whole modules (Landing Site, Blog, GDPR, Referrals) ship enabled vs gated behind a Pro tier. Produce one comprehensive inventory now — Admin-Local/1-Project/1-ProjectInfo/vendor-capabilities.md — and every later task consults it instead of re-discovering.
Run all three sources. No single source is sufficient: vendor docs lag the code, the panel hides features behind menus, and code search misses the panel’s visual tabs.
| Source | How | What it reveals |
|---|---|---|
| 1 · Vendor docs | _Source/ PDFs/README, the CodeCanyon item page, the vendor support portal (froiden.freshdesk.com, docs.workdo.io…) | documented modules, default admin URL, gotchas |
| 2 · Panel crawl | log in, walk every sidebar item + tab + sub-page (Playwright or manual), screenshot key config pages | the real, live feature surface (most authoritative) |
| 3 · Code inspection | the greps below | routes, settings tables, upload surface, feature flags |
-
Inspect the code surface — routes, settings tables, uploads, feature flags, dynamic pages.
Terminal window # Enumerate admin routesgrep -rn "Route::" routes/panel.php routes/web.php routes/admin.php 2>/dev/nullphp artisan route:list --name=admin # reflects live registration# Admin controllers + Livewire componentsls app/Livewire/Admin/ app/Http/Controllers/Admin/ 2>/dev/null# Settings tables — the source of truth for admin-editable configmysql -u[DB_USER] -p -e "SHOW TABLES LIKE '%settings%'" [DB_NAME]# File-upload surface (logos, favicons), feature flags, dynamic pagesgrep -rn "Storage::disk\|config('filesystems" config/ app/ 2>/dev/null | head -50grep -rn "'enabled' =>\|feature_" config/ 2>/dev/nullgrep -rn "Page::\|DynamicPage\|CustomPage" app/ 2>/dev/null# Expected: admin routes, controller/Livewire listings, settings tables, and the upload/flag surface- ✅ Routes, settings tables, upload surface, and feature flags are captured from the code.
-
Record the audience of every settings page — operator-level vs tenant-level.
- ✅ Each settings page is labelled operator-level or tenant-level before being recorded.
Capture the output: mkdir -p Admin-Local/1-Project/1-ProjectInfo/screenshots, copy the discovery template to vendor-capabilities.md and fill every section — write not applicable or needs investigation (with a note) rather than leaving a blank — then verify and commit.
-
Verify the inventory is substantial — under ~100 lines almost always means you skipped sections.
Terminal window test -f Admin-Local/1-Project/1-ProjectInfo/vendor-capabilities.md \&& wc -l Admin-Local/1-Project/1-ProjectInfo/vendor-capabilities.md# Expected: the file exists and is well over ~100 lines- ✅ The file exists and is substantial; then commit it (doc + screenshots).
The template ships a Phase 6/7/8 task prerequisite matrix — one row per downstream task, each mapped to the single question that task needs answered (e.g. “Does the vendor ship a built-in cookie banner?”). Every row must have a specific, non-empty answer before you move on. Downstream tasks read their row; they are forbidden from re-investigating. A blank row at task-run time is a discovery bug, not a downstream responsibility. A good answer is specific: “Yes — admin path Admin > Settings > GDPR; blade partials/cookie-consent.blade.php; seeded on by default.” A bad answer is “yes.”
-
Confirm the matrix has no unanswered rows.
Terminal window grep -c "needs investigation\|TODO\|TBD" \Admin-Local/1-Project/1-ProjectInfo/vendor-capabilities.md # ideally 0# Expected: 0 — no blank/"needs investigation" rows remain- ✅ The count is 0; every matrix row has a filled answer cell.
2. Review vendor docs and build the digest
Section titled “2. Review vendor docs and build the digest”CodeCanyon scripts ship vendor-authored docs that are often richer than any generic guide — exact panel layout, required env vars, common gotchas. Reading them first takes ~30 minutes and saves hours. Docs live in up to six places; scan local (cheap) first, then fetch remote.
| # | Source | Find it with |
|---|---|---|
| 1 | Bundled _Source/ PDFs/README | find _Source/ -type f \( -iname '*.pdf' -o -iname 'readme*' -o -iname 'install*' \) |
| 2 | In-repo /docs/ folder | find . -maxdepth 3 -type d -iname 'docs' -not -path './vendor/*' |
| 3 | CodeCanyon item page | the item URL in ProjectCard.md — fetch via Playwright (JS-rendered) |
| 4 | Author portfolio | click the author name → /user/<slug>/portfolio (identifies the vendor family) |
| 5 | Hosted docs site | docs.workdo.io, froiden.freshdesk.com, help.iqonic.design |
| 6 | External add-on marketplace | workdo.io/product-category/dash-saas-add-ons/, infyom.com/addons/ — the one most people miss |
Record every discovered URL in _CUSTOMIZATIONS.md under ## Vendor Docs Sources (with vendor family + fetch date) so later phases can re-fetch. The digest answers only these questions, and lives under ## Vendor Docs Digest in _CUSTOMIZATIONS.md (≤1 page):
| Question | Why it matters later |
|---|---|
| Default admin URL + credentials | Page 3 (rotate credentials) |
| Panel structure (sidebar + tabs) | every “CHECK:” in this phase |
| Multi-tenant model? | changes branding, GDPR, plans |
Required .env keys beyond Laravel defaults | email + payments |
Does the vendor hardcode behaviour on APP_ENV? | the #1 Phase 6 gotcha — see below |
| Webhook endpoints per gateway | Stripe wiring (page 5) |
| Email template locations | branding transactional email |
| Known “don’t do this” warnings | saves stepping on the same rake |
This is the single most common Phase 6 gotcha — run the APP_ENV hardcoding scan now so the email and payment pages don’t have to.
-
Scan for strict-equality checks against a non-standard
APP_ENVvalue.Terminal window grep -rnE "env\('APP_ENV'\)\s*===?\s*['\"]|config\('app\.env'\)\s*===?\s*['\"]" \app/ Modules/ packages/ 2>/dev/null | \grep -viE 'local|production|staging|testing' | head -20# Expected: any non-standard APP_ENV comparison (e.g. 'codecanyon'/'demo'), or no output- ✅ The scan result is recorded in the digest even if “none found”.
| Pattern found | Action |
|---|---|
env('APP_ENV') === 'codecanyon' in mail/payment providers | the panel for that feature is gated — configure via .env directly; document it |
env('APP_ENV') === 'demo' in controllers | demo mode (fake data, disabled writes) — don’t set APP_ENV=demo |
!== 'local' / === 'production' gates | standard Laravel — not a gotcha |
| Nothing found | vendor uses standard APP_ENV values |
3. Fill the project brand profile
Section titled “3. Fill the project brand profile”The brand profile is the source of truth every later task reads. When page 4 asks “what’s the primary colour?” or page 5 asks “what are the plan tiers?”, the answer is read here — not asked mid-task. Fill the template under ## Project Brand Profile in _CUSTOMIZATIONS.md and keep it terse (link out if a field needs >2 lines).
-
Fill every section of the brand profile from the brand decisions.
Section Fields Identity app name, tagline, legal entity, production + staging domains Audience primary/secondary user, geographic focus, launch language(s) Brand voice tone, banned phrases, sample CTA copy Visual identity primary/secondary/accent/neutral hex, heading + body type, logo (light/dark), favicon paths App settings timezone, date format, first day of week, default currency (also sets Stripe currency), default locale Legal privacy + ToS generator, cookie-consent provider, GDPR applicability, DPA needed? Payment plans tiers + prices, billing cycles, trial length, free-tier limits Integrations at launch Stripe, SMTP provider, GA4, Sentry, Cloudflare, other - ✅ Name, colours, timezone, currency, plan tiers, and legal posture are all recorded.
4. Write the execute-from plan
Section titled “4. Write the execute-from plan”Combine the docs digest (step 2) and the brand profile (step 3) into a single 1-page execution plan — the thing you (or the agent) actually execute the rest of Phase 6 from. Save it under ## Phase 6 Execution Plan in _CUSTOMIZATIONS.md. After this, every later Phase 6 task becomes “read the row, apply the values” — no mid-task brainstorming.
-
Build the read-the-row table — one row per remaining Phase 6 task (58–72), pulling each value from the digest or brand profile.
## Phase 6 Execution Plan — [PROJECT_NAME]| Task | Admin location | Values to set | Source ||---|---|---|---|| 58 Admin creds | /user/profile | Email + generated password (→ credentials.md) | Docs digest || 59 Branding | Settings → App | Logo light/dark, favicon, app name, tagline | Brand profile || 60 SMTP | Settings → Email | Host/port/user, from-name | Phase 4 SMTP creds || 61 Payment gateway | Settings → Payment | Enable Stripe, disable the rest | Brand profile || 67 Theme colors | Settings → Theme | Primary / secondary / accent hex | Brand profile || 72 Plans | Packages | Tiers + prices + cycles | Brand profile || … | … | … (one row per task 58–72) | … |**Known gotchas (from the docs digest):** e.g. "enable Modules → Billing before creating plans or the pricing page 404s".**Estimated time:** [MUST tasks + SHOULD tasks].- ✅
_CUSTOMIZATIONS.mdhas a## Phase 6 Execution Plantable with one row per task 58–72, each value sourced from the digest or brand profile.
- ✅
Checklist
Section titled “Checklist”Do not mark this step done until every box below is checked.
- 🤖 Capabilities inventory complete —
vendor-capabilities.mdexists, is >100 lines, and the prerequisite matrix has zero blank/“needs investigation” rows. - 🤖 Audience recorded — operator vs tenant is recorded for every settings page found.
- 🤖 Docs digest written — vendor docs sources + digest are in
_CUSTOMIZATIONS.md, including theAPP_ENVscan result. - 👤 Brand profile filled — name, colours, timezone, currency, plan tiers, legal posture.
- 🤖 Execution plan written —
## Phase 6 Execution Plantable in_CUSTOMIZATIONS.md, one row per task 58–72. - 🔀 Committed — capabilities doc + screenshots +
_CUSTOMIZATIONS.mdall committed.