WorkRunner Documentation
Step 3of 3

Submit Your Construct

Use the SDK to validate and publish your Construct. Once approved, you'll start earning from every stream.

Before You Submit

Make sure your Construct passes all validation checks:

$ npx @useworkapp/construct-sdk validate

Validating construct...
✓ construct.json is valid
✓ src/App.tsx exports default component
✓ Uses approved shadcn/ui components only
✓ Uses IndexedDB via useConstructData hook
✓ No external API calls detected
✓ Responsive design patterns found
✓ Accessibility attributes present

All checks passed! Ready to publish.
Vite project with src/App.tsx as main component
Uses only approved shadcn/ui components
Data persistence via useConstructData hook
Responsive design (mobile-first)
Dark mode support
Accessible (labels, aria-labels)
No external API calls
No TypeScript errors

Publish with the SDK

The SDK handles validation and submission in one command:

$ npx @useworkapp/construct-sdk publish

Validating construct...
✓ All checks passed

Publishing "My Expense Tracker"...
✓ Bundled for production
✓ Uploaded to Work platform
✓ Submitted for review

Your Construct has been submitted!
Track status at: https://usework.app/app/runner/constructs/abc123

What gets submitted:

  • construct.json - Title, description, and intent tags
  • Bundled code - Your app optimized for production
  • Preview build - For reviewers to test

Configure construct.json

Make sure your construct.json has good metadata for discoverability:

{
  "name": "expense-tracker",
  "title": "Expense Tracker",
  "description": "Track and categorize business expenses with receipt logging",
  "version": "1.0.0",
  "intent_tags": {
    "app_types": ["tracker", "form"],
    "domains": ["finance", "accounting"],
    "keywords": ["expenses", "receipts", "business", "tax"]
  }
}

Title: Clear, descriptive name (e.g., "Expense Tracker")

Description: What it does and who it's for

App Types: tracker, dashboard, form, calculator, etc.

Domains: finance, productivity, hr, sales, etc.

Keywords: Specific terms users might search

Review Process

StatusMeaningTypical Duration
SubmittedIn review queue24-48 hours
ApprovedPassed review, pending deployment< 1 hour
LiveAvailable for users to stream-
RejectedNeeds changes before approval-

What We Check

Our review team checks for:

  • Technical requirements: Follows all Construct standards
  • Functionality: Works as described, no bugs
  • Accessibility: Meets WCAG AA standards
  • Quality: Good UX, polished design
  • Originality: Not a duplicate of existing Construct
  • Usefulness: Solves a real business need

Common Rejection Reasons

Missing aria-labels on icon buttons

Fix: Add aria-label to all icon-only buttons

Uses fetch() or external APIs

Fix: Use useConstructData for persistence only

Inline styles instead of Tailwind

Fix: Replace style={{}} with Tailwind classes

Missing data persistence

Fix: Use useConstructData hook for state that should persist

Not responsive on mobile

Fix: Add sm: breakpoints, test on mobile

Uses unsupported components

Fix: Stick to approved shadcn/ui components

Revenue & Payments

Once your Construct is live, you earn from every stream:

Runner TypeRevenue Share
Founders Protocol (first 50)80%
Founders Protocol (51-100)75%
Standard Runners60%

Payment Details

  • • Earnings tracked in real-time in Runner Studio
  • • Payouts processed monthly via Stripe
  • • Minimum payout threshold: $25
  • • Set up payment method in Runner Studio → Payouts

Founders Protocol

First 50 Runners get 80% lifetime revenue share, Runners 51-100 get 75%. All Founders get priority payouts + free premium. The Founder badge is awarded after your first Construct is approved.

Submit Your Construct | Runner Documentation | Work