mirror of https://github.com/docusealco/docuseal
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
272 lines
7.5 KiB
272 lines
7.5 KiB
# CLAUDE.md
|
|
|
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
|
|
## Overview
|
|
|
|
DocuSeal is an open-source document signing and filling platform built with Ruby on Rails 8.1. It provides secure PDF form creation, digital signatures, and document processing with a mobile-optimized interface.
|
|
|
|
**Key Technologies:**
|
|
- Backend: Rails 8.1 with Ruby 4.0.1
|
|
- Database: PostgreSQL (default), MySQL/Trilogy, or SQLite3
|
|
- Frontend: Vue 3 components with Hotwire Turbo, Tailwind CSS + DaisyUI
|
|
- JavaScript bundling: Shakapacker (webpack)
|
|
- Background jobs: Sidekiq
|
|
- PDF processing: HexaPDF, ruby-vips, pdfium
|
|
- Storage: Local disk, AWS S3, Google Cloud Storage, or Azure Blob
|
|
|
|
## Development Commands
|
|
|
|
### Setup
|
|
```bash
|
|
# Install dependencies
|
|
bundle install
|
|
yarn install
|
|
|
|
# Setup database
|
|
rails db:create db:migrate
|
|
|
|
# Start development servers (Rails + webpack dev server)
|
|
foreman start -f Procfile.dev
|
|
# Or individually:
|
|
# rails s -p 3000
|
|
# ./bin/shakapacker-dev-server
|
|
```
|
|
|
|
### Testing
|
|
```bash
|
|
# Run all specs
|
|
bundle exec rspec
|
|
|
|
# Run specific test file
|
|
bundle exec rspec spec/requests/api/submissions_spec.rb
|
|
|
|
# Run system tests (with browser)
|
|
HEADLESS=false bundle exec rspec spec/system/
|
|
|
|
# Run with coverage
|
|
COVERAGE=true bundle exec rspec
|
|
```
|
|
|
|
### Code Quality
|
|
```bash
|
|
# Lint Ruby code
|
|
bundle exec rubocop
|
|
|
|
# Lint Ruby code with auto-fix
|
|
bundle exec rubocop -A
|
|
|
|
# Lint JavaScript/Vue
|
|
yarn eslint
|
|
|
|
# Lint ERB templates
|
|
bundle exec erblint --lint-all
|
|
|
|
# Security scan
|
|
bundle exec brakeman
|
|
```
|
|
|
|
### Database
|
|
```bash
|
|
# Create migration
|
|
rails g migration AddFieldToTable field:type
|
|
|
|
# Run migrations
|
|
rails db:migrate
|
|
|
|
# Rollback
|
|
rails db:rollback
|
|
|
|
# Reset database (drop, create, migrate, seed)
|
|
rails db:reset
|
|
```
|
|
|
|
### Assets
|
|
```bash
|
|
# Precompile assets for production
|
|
rails assets:precompile
|
|
|
|
# Compile webpack bundles
|
|
./bin/shakapacker
|
|
```
|
|
|
|
## Architecture
|
|
|
|
### Backend Structure
|
|
|
|
**Core Models:**
|
|
- `Account` - Multi-tenant account/organization
|
|
- `User` - User authentication and management (Devise)
|
|
- `Template` - PDF form template with field definitions
|
|
- `Submission` - Document instance created from template
|
|
- `Submitter` - Individual who fills/signs a submission
|
|
- `CompletedSubmitter` - Final state after signing
|
|
- `CompletedDocument` - Generated signed PDF documents
|
|
|
|
**Key Service Modules (lib/):**
|
|
- `Submissions` - Handle submission lifecycle
|
|
- `Submitters` - Manage submitter workflow
|
|
- `Templates` - Template operations and cloning
|
|
- `Accounts` - Account configuration
|
|
- `PdfUtils` - PDF processing and manipulation
|
|
- `DownloadUtils` - File download handling
|
|
- `SendWebhookRequest` - Webhook delivery
|
|
|
|
**Background Jobs (app/jobs/):**
|
|
- Document generation
|
|
- Email sending
|
|
- Webhook delivery
|
|
- File processing
|
|
|
|
**Controllers:**
|
|
- Standard Rails controllers in `app/controllers/`
|
|
- API namespace in `app/controllers/api/` with JSON responses
|
|
- RESTful design following Rails conventions
|
|
|
|
### Frontend Structure
|
|
|
|
**Custom Web Components (`app/javascript/elements/`):**
|
|
- Built with `@github/catalyst` for custom element registration
|
|
- Located in `app/javascript/elements/`
|
|
- Examples: `file_dropzone.js`, `clipboard_copy.js`, `fetch_form.js`
|
|
- Autonomous, reusable components following web standards
|
|
|
|
**Vue 3 Applications:**
|
|
- `template_builder/` - WYSIWYG PDF form builder
|
|
- Drag-and-drop field placement
|
|
- Field settings and validation
|
|
- Multi-submitter support
|
|
- `submission_form/` - Document signing interface
|
|
- Step-by-step submission flow
|
|
- Signature capture
|
|
- Field completion
|
|
|
|
**Styling:**
|
|
- Tailwind CSS utility classes
|
|
- DaisyUI component library
|
|
- Multiple Tailwind configs:
|
|
- `tailwind.config.js` - Main application
|
|
- `tailwind.application.config.js` - Application-specific
|
|
- `tailwind.form.config.js` - Form-specific
|
|
|
|
**JavaScript Entry Points:**
|
|
- `application.js` - Main app bundle
|
|
- `form.js` - Public form bundle
|
|
- `draw.js` - Drawing/signature tools
|
|
|
|
### Database Configuration
|
|
|
|
The app supports multiple database adapters configured via environment variables:
|
|
|
|
- **PostgreSQL** (default for dev/test): Set `DATABASE_HOST`, `DATABASE_PORT`, `DATABASE_USER`, `DATABASE_PASSWORD`, `DATABASE_NAME`
|
|
- **MySQL/Trilogy**: Set `DATABASE_URL` with `mysql://` or `trilogy://` protocol
|
|
- **SQLite3**: Default for production when no DATABASE_URL is set
|
|
|
|
Connection pool size: `RAILS_MAX_THREADS` (default 15) + `SIDEKIQ_THREADS` (default 5)
|
|
|
|
### API
|
|
|
|
RESTful JSON API at `/api/*`:
|
|
- Authentication via access tokens
|
|
- Endpoints for submissions, templates, submitters, attachments
|
|
- Event tracking endpoints
|
|
- Webhook support for integrations
|
|
- See `config/routes.rb` API namespace for full endpoint list
|
|
|
|
### Testing
|
|
|
|
**Test Framework:** RSpec with FactoryBot
|
|
|
|
**Test Types:**
|
|
- Request specs (`spec/requests/`) - API endpoint testing
|
|
- System specs (`spec/system/`) - Full browser integration tests using Cuprite (headless Chrome)
|
|
- Job specs (`spec/jobs/`) - Background job testing
|
|
- Mailer specs (`spec/mailers/`)
|
|
|
|
**Test Configuration:**
|
|
- Capybara with Cuprite driver for system tests
|
|
- WebMock for HTTP request stubbing
|
|
- Sidekiq testing (fake mode default, inline for specific tests)
|
|
- SimpleCov for coverage (enable with `COVERAGE=true`)
|
|
- Headful mode for debugging: `HEADLESS=false bundle exec rspec`
|
|
|
|
### Deployment
|
|
|
|
**Docker:**
|
|
```bash
|
|
docker run --name docuseal -p 3000:3000 -v.:/data docuseal/docuseal
|
|
```
|
|
|
|
**Docker Compose:**
|
|
```bash
|
|
curl https://raw.githubusercontent.com/docusealco/docuseal/master/docker-compose.yml > docker-compose.yml
|
|
sudo HOST=your-domain.com docker compose up
|
|
```
|
|
|
|
**Supported Platforms:**
|
|
- Heroku, Railway, DigitalOcean, Render
|
|
- See README.md for one-click deploy buttons
|
|
|
|
### Environment Configuration
|
|
|
|
Key environment variables:
|
|
- `DATABASE_URL` - Database connection string
|
|
- `HOST` - Application host domain
|
|
- `APP_URL` - Application URL (default: http://localhost:3000)
|
|
- `MULTITENANT` - Enable multi-tenant mode
|
|
- Storage: `AWS_*`, `GOOGLE_*`, `AZURE_*` configs
|
|
- SMTP: Email delivery configuration
|
|
- `CERTS` - Custom SSL certificates (JSON)
|
|
- `TIMESERVER_URL` - Timestamp server for signatures
|
|
|
|
### Multitenant Support
|
|
|
|
The app supports multitenant deployment via `MULTITENANT=true`:
|
|
- Account-scoped data isolation
|
|
- Subdomain-based routing
|
|
- Console interface at `console.#{HOST}`
|
|
- CDN at `cdn.#{HOST}`
|
|
|
|
### Key Libraries and Patterns
|
|
|
|
**Authentication:** Devise with 2FA (TOTP) support via `devise-two-factor`
|
|
|
|
**Authorization:** CanCanCan for permissions
|
|
|
|
**PDF Processing:**
|
|
- HexaPDF for PDF generation and manipulation
|
|
- ruby-vips for image processing
|
|
- pdfium bindings for advanced PDF operations
|
|
|
|
**Background Jobs:** Sidekiq with Redis
|
|
|
|
**Frontend State Management:**
|
|
- Vue 3 Composition API
|
|
- Turbo Drive for page navigation
|
|
- Custom elements for isolated widgets
|
|
|
|
**File Storage:** ActiveStorage with multiple backends (disk, S3, GCS, Azure)
|
|
|
|
**API Integrations:**
|
|
- Webhooks for events
|
|
- REST API with JWT authentication
|
|
- Embedded signing widgets (React/Vue/Angular npm packages available)
|
|
|
|
### Code Style and Conventions
|
|
|
|
- Ruby: Follow Rubocop rules in `.rubocop.yml` (Standard Ruby style)
|
|
- JavaScript: ESLint with Standard style + Vue 3 recommended rules
|
|
- ERB: erb_lint for template validation
|
|
- Vue: Single-file components with `<script setup>` or Options API
|
|
- Frozen string literals enabled by default
|
|
- Rails 8.1 conventions and best practices
|
|
|
|
### Accessibility Focus
|
|
|
|
This codebase is specifically being enhanced for accessibility (a11y). When making changes:
|
|
- Follow WCAG 2.2 guidelines
|
|
- Test with screen readers
|
|
- Ensure keyboard navigation
|
|
- Maintain proper ARIA labels
|
|
- Check color contrast ratios
|