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.
docuseal/REBRANDING.md

8.5 KiB

Rebranding Summary: DocuSeal → WaboSign

This document records the changes made when forking DocuSeal into WaboSign. It exists for transparency, to fulfil AGPLv3 §7(b) disclosure expectations, and as a reference for future maintainers tracing why a particular file was touched.

Scope: ~183 files modified. Decisions were made in a planning conversation before changes were applied; the final plan lives at .claude/plans/this-agpl-project-has-toasty-cake.md on the developer's machine.

Brand & identity

  • Ruby module DocusealWabosign (lib/wabosign.rb); Rails app module DocuSealWaboSign (config/application.rb)
  • All hardcoded DocuSeal strings in views, mailers, controllers, libs, JS/Vue replaced with Wabosign.product_name (or equivalents)
  • config/locales/i18n.yml: 168 user-facing strings sweep-replaced across all 14 languages
  • New favicons, apple-touch-icons, and logo SVG (a neutral "W" mark) generated via Inkscape
  • daisyUI theme renamed docusealwabosign in tailwind.config.js
  • Discord, Twitter, ChatGPT URLs removed entirely
  • New brand constants in lib/wabosign.rb:
    • PRODUCT_URL = 'https://sign.wabo.cc'
    • GITHUB_URL = 'https://github.com/wabolabs/wabosign'
    • SUPPORT_EMAIL = 'wabosign@wabo.cc'

AGPL §7(b) attribution

Freemium gates removed

Migrations & infrastructure

Intentionally preserved upstream references

Per AGPL §7(b) and downstream SDK compatibility, the following references remain. All are documented in NOTICE.

Verification status

  • Ruby syntax-checked all edited .rb files (lib, controllers, mailers, migration)
  • ERB-compiled the edited view partials
  • YAML-parsed config/locales/i18n.yml and docker-compose.yml
  • JSON-parsed docs/openapi.json
  • Webhook spec assertions updated to match new WaboSign Webhook user-agent

Full Rails boot requires Ruby 4.0.1, which was not available on the dev machine that performed the rebrand. Recommend running docker compose up --build to verify boot end-to-end before publishing.

Sync workflow

Upstream lives at docusealco/docuseal. Each upstream release is brought in by re-running a deterministic rebrand sweep on the upstream tree, then merging into master. The strategy details are in .claude/plans/come-up-with-a-foamy-flask.md; the short version follows.

Tooling

  • bin/rebrand-sync — Ruby script that performs the DocuSeal → WaboSign rename sweep across the working tree. Idempotent. Honors a deny-list (see §"Intentionally preserved upstream references" above) and sentinel-protects AGPL §7(b) attribution phrases, SDK custom-element names (docuseal-form, docuseal-builder), @docuseal/* npm packages, and the github.com/docusealco/{fields-detection,pdfium-binaries,turbo} binary URLs.
  • bin/rebrand-check — fails (exit 1) if any unintended DocuSeal reference survives. Wired into .github/workflows/ci.yml as the Rebrand check job.
  • git config rerere.enabled true && git config rerere.autoupdate true — once-per-checkout setup; remembers semantic conflict resolutions so the same call is not re-made each release.
  • .gitattributes marks Gemfile.lock and yarn.lock as -merge (regenerate after merge rather than diffing).

Per-sync steps

git fetch upstream --tags
git checkout -b sync/upstream-<tag> <tag>      # e.g. 3.0.0
bin/rebrand-sync
git add -A && git commit -m "Apply WaboSign rebrand sweep to upstream <tag>"

git checkout master
git merge --no-ff sync/upstream-<tag>
# Resolve conflicts. Rerere caches recurring resolutions.

bin/rebrand-sync                                # catch upstream-only new files
bin/rebrand-check                               # CI gate

bundle install
yarn install

# Verify (see "Verification" in the plan), then:
git tag wabosign-synced-with-<tag>

Adding new preserved tokens

When upstream introduces a new SDK identifier, binary URL, or attribution surface that must survive the sweep, edit PRESERVE in bin/rebrand-sync and ALLOW_PATTERNS in bin/rebrand-check together. The two must stay in sync — rebrand-sync decides what the sweep ignores, rebrand-check decides what CI tolerates.