mirror of https://github.com/docusealco/docuseal
This file provides guidance for Claude Code when working in this repository, including: - Development commands for testing, linting, and database management - Architecture overview of Rails backend and Vue frontend - Testing structure with RSpec, Capybara, and Cuprite - Deployment configurations for Docker and cloud platforms - Key libraries, patterns, and conventions - Multitenant support and environment configuration Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>pull/599/head
parent
6ab68cc36b
commit
bb7a233863
@ -0,0 +1,271 @@
|
|||||||
|
# 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
|
||||||
Loading…
Reference in new issue