Gumroad
Sell stuff and see what sticks
Install / Use
/learn @antiwork/GumroadREADME
Table of Contents
Getting Started
Prerequisites
💡 If you're on Windows, follow our Windows setup guide instead.
Before you begin, ensure you have the following installed:
Ruby
- https://www.ruby-lang.org/en/documentation/installation/
- Install the version listed in the .ruby-version file
Node.js
- https://nodejs.org/en/download
- Install the version listed in the .node-version file
Docker
We use Docker to setup the services for development environment.
- For MacOS: Download the Docker app from the Docker website
- For Linux:
sudo wget -qO- https://get.docker.com/ | sh
sudo usermod -aG docker $(whoami)
MySQL & Percona Toolkit
Install a local version of MySQL 8.0.x to match the version running in production.
The local version of MySQL is a dependency of the Ruby mysql2 gem. You do not need to start an instance of the MySQL service locally. The app will connect to a MySQL instance running in the Docker container.
- For MacOS:
brew install mysql@8.0 percona-toolkit
brew link --force mysql@8.0
# to use Homebrew's `openssl`:
brew install openssl
bundle config --global build.mysql2 --with-opt-dir="$(brew --prefix openssl)"
# ensure MySQL is not running as a service
brew services stop mysql@8.0
- For Linux:
- MySQL:
- https://dev.mysql.com/doc/refman/8.0/en/linux-installation.html
apt install libmysqlclient-dev
- Percona Toolkit: https://www.percona.com/doc/percona-toolkit/LATEST/installation.html
- MySQL:
Image Processing Libraries
ImageMagick
We use imagemagick for preview editing.
- For MacOS:
brew install imagemagick - For Linux:
sudo apt-get install imagemagick
libvips
For newer image formats we use libvips for image processing with ActiveStorage.
- For MacOS:
brew install libvips - For Linux:
sudo apt-get install libvips-dev
FFmpeg
We use ffprobe that comes with FFmpeg package to fetch metadata from video files.
- For MacOS:
brew install ffmpeg - For Linux:
sudo apt-get install ffmpeg
PDFtk
We use pdftk to stamp PDF files with the Gumroad logo and the buyers' emails.
- For MacOS: Download from here
- Note: pdftk may be blocked by Apple's firewall. If this happens, go to Settings > Privacy & Security and click "Open Anyways" to allow the installation.
- For Linux:
sudo apt-get install pdftk
wkhtmltopdf
While generating invoices, to convert HTML to PDF, PDFKit expects wkhtmltopdf to be installed on your system. Download and install the version 0.12.6 for your platform.
- Note similar to pdftk, this may also be blocked by Apple's firewall on MacOS. Follow a similar process as above.
Installation
Bundler and gems
We use Bundler to install Ruby gems.
gem install bundler
Install gems:
bundle install
Also make sure to install dotenv as it is required for some console commands:
gem install dotenv
npm and Node.js dependencies
Make sure the correct version of npm is enabled:
corepack enable
Install dependencies:
npm install
Configuration
Set up Custom credentials
App can be booted without any custom credentials. But if you would like to use services that require custom credentials (e.g. S3, Stripe, Resend, etc.), you can copy the .env.example file to .env and fill in the values.
Running Locally
Start Docker services
If you installed Docker Desktop (on a Mac or Windows machine), you can run the following command to start the Docker services:
make local
If you are on Linux, or installed Docker via a package manager on a mac, you may have to manually give docker superuser access to open ports 80 and 443. To do that, use sudo make local instead.
This command will not terminate. You run this in one tab and start the application in another tab.
If you want to run Docker services in the background, use LOCAL_DETACHED=true make local instead.
Set up the database
bin/rails db:prepare
For Linux (Debian / Ubuntu) you might need the following:
apt install libxslt-dev libxml2-dev
Start the application
bin/dev
This starts the Rails server, the JavaScript build system, and a Sidekiq worker.
You can now access the application at https://gumroad.dev.
Development
Logging in
You can log in with the username seller@gumroad.com and the password password. The two-factor authentication code is 000000.
Read more about logging in as a user with a different team role at Users & authentication.
Resetting Elasticsearch indices
You will need to explicitly reindex Elasticsearch to populate the indices after setup, otherwise you will see index_not_found_exception errors when you visit the dev application. You can reset them using:
# Run this in a rails console:
DevTools.delete_all_indices_and_reindex_all
Push Notifications
To send push notifications:
INITIALIZE_RPUSH_APPS=true bundle exec rpush start -e development -f
Common Development Tasks
Rails console:
bin/rails c
Rake tasks:
bin/rake task_name
Linting
We use ESLint for JS, and Rubocop for Ruby. Your editor should support displaying and fixing issues reported by these inline, and CI will automatically check and fix (if possible) these.
If you'd like, you can run git config --local core.hooksPath .githooks to check for these locally when committing.
Common Issues
macOS Error When Running Tests (Related to fork())
objc[11912]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called.
objc[11912]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
This issue occurs on macOS due to how the fork() system call interacts with multithreaded Objective-C applications—commonly triggered when Spring is enabled during testing.
How to Fix:
Temporarily disable Spring before running your tests to avoid this error.
export DISABLE_SPRING=1
bin/rspec spec/requests/balance_pages_spec.rb
This will disable Spring for the current session, allowing the tests to run without triggering the fork()-related crash.
