Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
161 changes: 161 additions & 0 deletions .claude/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
{
"version": "0.0.1",
"configurations": [
{
"name": "acme-advisory",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-advisory", "--", "--port", "3001"],
"port": 3001
},
{
"name": "acme-agency",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-agency", "--", "--port", "3002"],
"port": 3002
},
{
"name": "acme-build",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-build", "--", "--port", "3003"],
"port": 3003
},
{
"name": "acme-camp",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-camp", "--", "--port", "3004"],
"port": 3004
},
{
"name": "acme-compliance",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-compliance", "--", "--port", "3005"],
"port": 3005
},
{
"name": "acme-deals",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-deals", "--", "--port", "3006"],
"port": 3006
},
{
"name": "acme-fitness",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-fitness", "--", "--port", "3007"],
"port": 3007
},
{
"name": "acme-gig",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-gig", "--", "--port", "3008"],
"port": 3008
},
{
"name": "acme-insure",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-insure", "--", "--port", "3009"],
"port": 3009
},
{
"name": "acme-leasing",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-leasing", "--", "--port", "3010"],
"port": 3010
},
{
"name": "acme-legal",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-legal", "--", "--port", "3011"],
"port": 3011
},
{
"name": "acme-lending",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-lending", "--", "--port", "3012"],
"port": 3012
},
{
"name": "acme-notary",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-notary", "--", "--port", "3013"],
"port": 3013
},
{
"name": "acme-onboard",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-onboard", "--", "--port", "3014"],
"port": 3014
},
{
"name": "acme-realty",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-realty", "--", "--port", "3015"],
"port": 3015
},
{
"name": "acme-staffing",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-staffing", "--", "--port", "3016"],
"port": 3016
},
{
"name": "acme-tax",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-tax", "--", "--port", "3017"],
"port": 3017
},
{
"name": "acme-trials",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "acme-trials", "--", "--port", "3018"],
"port": 3018
},
{
"name": "ts-nextjs-embed-authoring",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "ts-nextjs-embed-authoring", "--", "--port", "3019"],
"port": 3019
},
{
"name": "ts-nextjs-embed-authoring-advanced",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "ts-nextjs-embed-authoring-advanced", "--", "--port", "3020"],
"port": 3020
},
{
"name": "ts-nextjs-freelance",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "ts-nextjs-freelance", "--", "--port", "3021"],
"port": 3021
},
{
"name": "ts-nextjs-gym",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "ts-nextjs-gym", "--", "--port", "3022"],
"port": 3022
},
{
"name": "ts-nextjs-saas-sales",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "ts-nextjs-saas-sales", "--", "--port", "3023"],
"port": 3023
},
{
"name": "pdf-templates",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "pdf-templates"],
"port": null
},
{
"name": "python-flask-backend",
"runtimeExecutable": "uv",
"runtimeArgs": ["run", "flask", "--app", "app.main", "run", "--port", "5001"],
"port": 5001
},
{
"name": "python-flask-frontend",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--prefix", "python-flask-vendor-agreement/frontend"],
"port": 5173
}
]
}
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
node_modules
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
.env.development
.env.test
.env.production
.next

pdf-templates/

prompt.md
7 changes: 7 additions & 0 deletions acme-advisory/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
DOCUMENSO_API_KEY=your-api-key
DOCUMENSO_HOST=https://app.documenso.com
NEXT_PUBLIC_DOCUMENSO_HOST=https://app.documenso.com
DOCUMENSO_TEMPLATE_IMA=template-id
DOCUMENSO_TEMPLATE_FEE_ACK=template-id
DOCUMENSO_TEMPLATE_ADV_DISCLOSURE=template-id
DATABASE_URL=postgresql://user:password@your-neon-host/dbname?sslmode=require
36 changes: 36 additions & 0 deletions acme-advisory/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*

# env files
.env
.env*.local
# typescript
*.tsbuildinfo
next-env.d.ts
7 changes: 7 additions & 0 deletions acme-advisory/.prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
dist/
node_modules/
.next/
.turbo/
coverage/
pnpm-lock.yaml
.pnpm-store/
11 changes: 11 additions & 0 deletions acme-advisory/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"endOfLine": "lf",
"semi": false,
"singleQuote": false,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 80,
"plugins": ["prettier-plugin-tailwindcss"],
"tailwindStylesheet": "app/globals.css",
"tailwindFunctions": ["cn", "cva"]
}
74 changes: 74 additions & 0 deletions acme-advisory/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# AcmeAdvisory

Meridian Wealth Advisors client onboarding demo for Documenso Platform embeds.

This standalone Next.js app shows a realistic RIA onboarding flow:

- Kanban pipeline with Prospect, Onboarding, and Active columns
- Prospect detail page for Margaret Liu and other mock households
- Server-created Documenso documents from 3 templates:
- Investment Management Agreement (IMA)
- Fee Acknowledgment
- ADV Part 2 Disclosure
- Sequential embedded signing with `EmbedSignDocument`
- Neon + Prisma persistence for live onboarding state

## Stack

- Next.js 16 App Router
- React 19
- Tailwind CSS v4 + shadcn/ui
- `@documenso/embed-react`
- `@documenso/sdk-typescript`
- Prisma + Neon Postgres

## Required environment variables

Copy `.env.example` to `.env.local` and fill in:

```bash
DOCUMENSO_API_KEY=
DOCUMENSO_HOST=
NEXT_PUBLIC_DOCUMENSO_HOST=
DOCUMENSO_TEMPLATE_IMA=
DOCUMENSO_TEMPLATE_FEE_ACK=
DOCUMENSO_TEMPLATE_ADV_DISCLOSURE=
DATABASE_URL=
```

## Local setup

```bash
bun install
bun run db:generate
bun run db:push
bun run db:seed
bun dev
```

## Demo flow

1. Open `/`
2. Click Margaret Liu in the Prospect column
3. Click Start Onboarding and enter an email
4. The server creates all 3 Documenso documents from templates
5. Sign the IMA, Fee Acknowledgment, and ADV disclosure in sequence
6. Return to the pipeline and confirm the card moved to Active

## Data model

`ClientSession` stores the live onboarding state for one household:

- `prospectId`
- `email`
- `pipelineStage`
- `imaToken`, `imaSigned`
- `feeToken`, `feeSigned`
- `advToken`, `advSigned`
- `createdAt`, `updatedAt`

## Notes

- Prospect profile data is mock data.
- Signing is real and uses the Documenso API.
- `prisma/seed.ts` seeds a couple of already-active households so the Active column is populated on first run.
Loading