Schedule smarter. Post everywhere.
Monorepo for the Profile Tailors social media management platform (marketing, dashboard, backend, shared modules, and infrastructure).
| Requirement | Version | Install |
|---|---|---|
| Node.js | >= 22.12.0 |
nodejs.org |
| pnpm | >= 11.8.0 |
npm install -g pnpm |
| just | >= 1.30 |
brew install just / winget install Casey.Just / cargo install just |
Windows users:
justruns natively on Windows. The Gradle wrapper is auto-detected (gradlew.batin CMD/PowerShell,./gradlewin Git Bash/WSL). Recipes that userm -rfstill require a POSIX shell — use Git Bash (included with Git for Windows) or WSL.
- macOS:
brew install just - Windows:
winget install Casey.Just - Ubuntu/Debian (recommended):
curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | sudo bash -s -- --to /usr/local/bin
just --versionAlternative Ubuntu/Debian installation methods are also documented in the repository Justfile.
git clone https://github.com/dallay/profiletailors.com.git
cd profiletailors.com
just setupFor full onboarding and troubleshooting, see docs/getting-started.md.
just setup will:
- copy
.env.exampleto.envwhen needed, - install workspace dependencies with
pnpm install --frozen-lockfile, - install Lefthook unless Git hooks are globally disabled (
core.hooksPath=/dev/null, e.g. Jules). - apply AI agent configurations with
pnpm dlx @dallay/agentsync apply. - run optional local tooling setup via
node scripts/setup-optional-tools.mjs.
just dev-frontend # starts both Astro and Vue dev servers- Marketing site: https://profiletailors.localhost
- Dashboard app: https://pt-app.localhost (requires Portless)
- Linked worktrees prefix these names with the branch, for example
https://fix-ui.pt-app.localhost.
This repo uses just as a centralized command runner.
All common operations are available via just <recipe> — no need to remember pnpm, Gradle, or
Docker commands separately. Run just -l to list everything.
| Command | What it does |
|---|---|
just dev-frontend |
Start both dev servers in parallel |
just app |
Start only the Vue 3 dashboard app |
just frontend-build |
Build the marketing site for production |
just frontend-preview |
Preview marketing production build |
just frontend-lint |
Lint marketing with Biome |
just frontend-format |
Format marketing code with Biome |
just frontend-check |
Run Astro type/content checks |
just frontend-test |
Run marketing unit tests (Vitest) |
just frontend-test-cov |
Run marketing unit tests with coverage |
just frontend-test-e2e |
Run marketing E2E tests (Playwright) |
just app-test-e2e-media |
Run app Media Library E2E tests |
| Command | What it does |
|---|---|
just backend-build |
Compile and package |
just backend-run |
Start Spring Boot (dev profile) |
just backend-test-fast |
Run unit tests (fast: no Postgres) |
just backend-test |
Run unit tests (pass exclude-tags) |
just backend-lint |
Run Detekt static analysis |
just backend-check |
Full check (tests + Detekt) |
just backend-coverage |
Tests with JaCoCo coverage report |
| Command | What it does |
|---|---|
just infra-up |
Start Postgres + services |
just infra-down |
Stop and remove containers |
just infra-logs |
Tail service logs |
| Command | What it does |
|---|---|
just ci-local |
Full CI pipeline simulation (fast, local-only) |
just ci-full |
CI pipeline + Postgres BDD tests |
| Command | What it does |
|---|---|
just install |
Install all dependencies |
just setup |
Full initial setup (.env + install + hooks + agentsync) |
just hooks-install |
Install Lefthook git hooks |
just clean |
Clean all build artifacts and caches |
- Frontend Apps:
apps/web/marketing/: Astro-based marketing site.apps/web/app/: Vue 3-based dashboard application.
- The marketing site uses Astro's built-in locale routing with English as the default locale and Spanish under
/es/. - User-facing copy is maintained in locale files under
apps/web/marketing/src/i18n/andapps/web/app/src/i18n/. - Shared web assets are sourced from
shared/assets/using the@shared/assets/import alias. Files inshared/assets/web/*are copied intodist/at build time by the Astro build configuration. - The current waitlist flow is client-side only (Astro component); backend persistence is documented as planned (ADR-0011).
- Code quality: Biome for linting and formatting in the frontend, Detekt for the backend.
- The backend lives in
server/smp/— Spring Boot 4 with Kotlin and WebFlux (reactive). - SDD artifacts live in
openspec/for tracking specs, designs, and tasks.
profiletailors.com/
├── apps/
│ └── web/
│ ├── app/ # Vue 3 dashboard application
│ └── marketing/ # Astro marketing site
├── server/
│ └── smp/ # Spring Boot 4 backend (Kotlin)
├── shared/ # Kotlin libraries + shared web assets
│ ├── assets/ # Shared logos, icons, and web assets
│ ├── web/ # Shared web workspace
│ ├── common/ # Domain primitives, value objects, shared kernel
│ ├── bus/ # Event bus abstractions
│ ├── security/ # Security primitives
│ └── ... # Additional shared libraries
├── tools/
│ └── compliance/ # Compliance tooling workspace
├── .agents/ # Agent tooling config and skills
├── .devcontainer/ # VS Code dev container configuration
├── .github/workflows/ # CI and automation
├── docs/ # Architecture and security docs
├── openspec/ # SDD artifacts
├── CONTRIBUTING.md
├── CLA.md
├── LICENSE
└── README.md
Profile Tailors follows a hexagonal architecture with bounded contexts from Domain-Driven Design. The backend is built as a modular monolith using Spring Boot 4, Kotlin, and reactive programming.
- System Context — Big picture, external dependencies
- Container — Deployable units, technology stack
- Component — Internal structure, bounded contexts
- Code — Implementation patterns, class design
- Summary — Executive summary and roadmap
Key Architectural Patterns:
- Hexagonal Architecture (Ports & Adapters)
- Domain-Driven Design (Bounded Contexts)
- CQRS (Command Query Responsibility Segregation)
- Reactive Programming (Kotlin coroutines + R2DBC)
- Modular Monolith (Spring Modulith)
Contributions are welcome. Before opening a pull request:
- Read
CONTRIBUTING.md. - Open an issue or discussion first for non-trivial changes.
- Sign the
CLA.mdwhen prompted on your first PR. - Verify your changes locally from
apps/web/marketing/.
We use Conventional Commits:
feat(scope): short description
fix(scope): short description
docs(scope): short description
chore(scope): short description
Examples:
feat(marketing): refine hero waitlist flow
fix(i18n): correct spanish locale switch label
docs(readme): refresh repository onboarding
If you discover a security issue, do not open a public issue.
Contact: security@profiletailors.com
- Discussions: https://github.com/dallay/profiletailors.com/discussions
- Issues: https://github.com/dallay/profiletailors.com/issues
- Email: dev@profiletailors.com
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).
See LICENSE for the full text.
Source offer (AGPL-3.0 § 13): users who interact with Profile Tailors over a network are
entitled to the corresponding source code. The canonical source is available at
github.com/dallay/profiletailors.com.
Deployed releases are tagged; the running version is exposed via /actuator/info.
For licensing questions, commercial use, or CLA enquiries see
docs/architecture/adr/0012-agpl-commercial-strategy.md
and CLA.md.
Built by the Profile Tailors team.