Create customizable forms that automatically generate tasks and projects in awork.
Live Demo: awork-forms.proudpond-0e645c13.germanywestcentral.azurecontainerapps.io
awork Forms lets you create public-facing forms that, when submitted, automatically create tasks or projects in your awork workspace. Perfect for:
- Client intake forms – Collect project requests that become awork projects
- Bug report forms – Turn user-submitted bugs into trackable tasks
- Request forms – Let team members or external users submit work requests
- Onboarding forms – Automate new client/employee setup workflows
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ Create Form │ ───► │ Share Public │ ───► │ Submission │
│ in Builder │ │ URL │ │ Received │
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └────────┬────────┘
│
▼
┌─────────────────┐
│ │
│ Task/Project │
│ Created in │
│ awork │
│ │
└─────────────────┘
- Build – Create a form using the drag-and-drop builder
- Brand – Customize colors and add your logo
- Map – Connect form fields to awork task/project fields
- Share – Publish and share the unique URL
- Automate – Submissions automatically create awork items
| Feature | Description |
|---|---|
| Form Builder | Drag-and-drop fields: text, email, number, textarea, select, checkbox, date |
| Custom Branding | Set primary/background colors and upload your logo |
| awork Integration | Auto-create tasks or projects with configurable field mapping |
| Public Sharing | Each form gets a unique, shareable URL |
| Submission Tracking | View all submissions with direct links to created awork items |
- Docker (for PostgreSQL)
- .NET 10 SDK
- Node.js 20+
# Clone the repository
git clone https://github.com/awork-io/awork-forms.git
cd awork-forms
# Create environment file
cp .env.example .env
# Edit .env and set JWT_SECRET_KEY (minimum 32 characters)
# Example: JWT_SECRET_KEY=your-super-secret-key-at-least-32-chars
# Start everything (PostgreSQL + backend + frontend)
./dev.shOpen http://localhost:5173 and you're ready to go!
| Variable | Required | Default | Description |
|---|---|---|---|
JWT_SECRET_KEY |
Yes | – | Secret key for JWT tokens (min 32 characters) |
DATABASE_URL |
No | SQLite | PostgreSQL connection string |
BASE_URL |
No | http://localhost:5100 |
Public URL for OAuth redirects |
VITE_API_URL |
No | http://localhost:5100 |
API URL for frontend |
SENTRY_DSN |
No | – | Sentry DSN used by backend and frontend runtime config (/api/app-config) |
SENTRY_ENVIRONMENT |
No | ASP.NET environment | Sentry environment (also exposed to frontend runtime config) |
SENTRY_RELEASE |
No | – | Sentry release identifier (also exposed to frontend runtime config) |
SENTRY_SEND_DEFAULT_PII |
No | false |
Backend Sentry PII forwarding toggle |
VITE_SENTRY_DSN |
No | – | Frontend fallback DSN for standalone Vite usage (not required in container runtime) |
VITE_SENTRY_ENVIRONMENT |
No | Vite mode | Frontend fallback environment |
VITE_SENTRY_RELEASE |
No | – | Frontend fallback release |
# Start all services (recommended)
./dev.sh
# Or run components separately:
docker compose up -d # Start PostgreSQL
cd backend && dotnet run # Start API
cd frontend && npm run dev # Start frontend| Service | URL | Description |
|---|---|---|
| Frontend | localhost:5173 | React development server |
| Backend | localhost:5100 | .NET API |
| PostgreSQL | localhost:5432 | Database (user: postgres, pass: postgres) |
# Stop PostgreSQL
docker compose down
# Reset database
docker compose down -v && ./dev.sh
# Run backend tests
cd backend && dotnet test
# Build frontend for production
cd frontend && npm run build| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript, Vite, Tailwind CSS, shadcn/ui, dnd-kit |
| Backend | .NET 10 Minimal API, Entity Framework Core |
| Database | PostgreSQL (production), SQLite (development fallback) |
| Auth | awork OAuth 2.0 + PKCE + Dynamic Client Registration |
| Hosting | Azure Container Apps |
awork-forms/
├── frontend/ # React SPA
│ ├── src/
│ │ ├── components/ # UI components
│ │ ├── pages/ # Route pages
│ │ ├── hooks/ # Custom React hooks
│ │ └── lib/ # Utilities
│ └── package.json
│
├── backend/ # .NET API
│ ├── Auth/ # OAuth flow + JWT handling
│ ├── Awork/ # awork API client
│ ├── Endpoints/ # API route definitions
│ ├── Forms/ # Form CRUD operations
│ ├── Submissions/ # Submission processing
│ └── Program.cs # Application entry point
│
├── dev.sh # Development startup script
├── docker-compose.yml # Local PostgreSQL setup
├── Dockerfile # Production container build
└── README.md
Pushes to main automatically deploy via GitHub Actions to Azure Container Apps.
| Resource | Name | Resource Group |
|---|---|---|
| Container App | awork-forms |
awork-global |
| PostgreSQL | awork_forms |
internal-tools.postgres.database.azure.com |
# Build and push container
docker build -t awork-forms .
docker tag awork-forms <your-registry>/awork-forms
docker push <your-registry>/awork-formsYour .env file is missing or has a short JWT_SECRET_KEY. Generate one:
openssl rand -base64 32Make sure Docker is running and the container is up:
docker compose up -d
docker compose logs postgresAnother process is using the port. Find and kill it:
lsof -i :5173
kill -9 <PID>Check that BASE_URL in .env matches your actual backend URL. For local development, this should be http://localhost:5100.
Contributions are welcome! Whether it's bug fixes, new features, or documentation improvements – we'd love your help.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to your branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow existing code style and patterns
- Write meaningful commit messages
- Add tests for new functionality
- Update documentation as needed
Open an issue with:
- Steps to reproduce
- Expected vs actual behavior
- Screenshots if applicable
This project is licensed under the MIT License – see the LICENSE file for details.
Made with care by the awork team