Gumroad is a free, open source learning management systems (lms) project written in Ruby and released under MIT. It has 9,699 GitHub stars, 2,036 forks and 7 open issues, and was last pushed 4 hours ago. On this registry it ranks #1 of 6 tracked projects in Learning Management Systems (LMS), with 5 head-to-head comparisons available. It gained 16 stars over the last 6 tracked days.

What is Gumroad?

What it is

Gumroad is an e-commerce platform that enables creators to sell products directly to consumers, and this repository contains the source code for the Gumroad web application. The project sits in the Content & Publishing / Learning Management Systems category, is written in Ruby, and is licensed under MIT.

The concrete problem it addresses is giving digital creators a direct marketplace path for selling products to consumers. The repository documents a local development path, including Docker services, MySQL, Elasticsearch indices, push notifications, linting, and integration tests, so it is useful as a codebase to study and contribute to.

Key capabilities

  • The repository provides the Ruby source code for the Gumroad web application, which is an e-commerce platform for creators selling products directly to consumers.
  • It uses MySQL 8.0.x as a database dependency, with local development connecting to a MySQL instance running in Docker.
  • It includes support for generating invoices, where PDFKit expects wkhtmltopdf to convert HTML to PDF.
  • It can stamp PDF files with the Gumroad logo and buyer email addresses through PDFtk.
  • It fetches metadata from video files by using ffprobe from FFmpeg.
  • It supports preview editing through ImageMagick.
  • It has Elasticsearch indices that developers can reset during local development.

Who uses it and how

  • Creators use the hosted Gumroad product to sell digital products directly to consumers, while the public repository exposes the source code behind that web application.
  • Developers install pinned Ruby and Node.js versions, and use Docker to run development services such as MySQL.
  • Contributors prepare changes by forking the repository, opening pull requests on their own forks, and emailing [email protected] with a link to the pull request.
  • User-facing contributions need visual evidence, QA steps, test results, and an AI disclosure naming the model.
  • Teams working on Windows can follow the repository's Windows setup guide instead of the standard local setup.

Getting started

Install the Ruby and Node.js versions listed in .ruby-version and .node-version, use Docker for development services, and install MySQL 8.0.x, Percona Toolkit, ImageMagick, FFmpeg, PDFtk, and wkhtmltopdf. The README includes an installation section that mentions Bundler.

When to use it — and when not to

Use this repository when you need the Ruby source code for Gumroad's web application and are willing to operate a development environment with Docker, MySQL, Elasticsearch, and external tools such as ImageMagick, FFmpeg, PDFtk, and wkhtmltopdf. It is not a drop-in hosted product, because the repository is source code and the live service is at gumroad.com. Contribution is selective, since there is no inbound review queue, and merged changes must meet the same bar as internal work.

project readme (upstream, from github) — read inline

Gumroad logo

See what sticks.

Gumroad is an e-commerce platform that enables creators to sell products directly to consumers. This repository contains the source code for the Gumroad web application.

Gumroad CLI

Contributing

We don't run an inbound review queue on this repo. To contribute a change: fork the repo, open the pull request on your own fork, then email [email protected] with a link to it. We read every submission and merge the ones we want on our side, keeping your authorship — though we can't promise a reply to each one or a timeline.

Your PR still has to meet the same bar as our own work — visual evidence for anything user-facing, QA steps, test results, and an AI disclosure naming the model. See CONTRIBUTING.md for the full guidelines and the substitutions that apply when working from a fork.

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
Node.js
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 [email protected] percona-toolkit
brew link --force [email protected]

# 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 [email protected]
ImageMagick

We use imagemagick for preview editing.

  • For MacOS: brew install imagemagick
  • For Linux: sudo apt-get install imagemagick
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 need superuser access to expose container ports. 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 http://localhost:3000. Seller subdomains and the asset/api hosts use *.localhost (e.g. http://seller.localhost:3000, http://api.localhost:3000) — modern browsers auto-resolve these to 127.0.0.1, so no /etc/hosts edits are needed.

Local dev limitations

*.localhost over HTTP is treated as a secure context by browsers (so Stripe.js, Stripe Elements, and other secure-context APIs work), but a couple of features that need either HTTPS or a registrable cookie domain don't work in this setup:

  • Apple Pay — Stripe requires HTTPS for Apple Pay domain registration. Workaround: expose the app over HTTPS with ngrok (ngrok http 3000) and register the resulting hostname in the Stripe Apple Pay dashboard.
  • Cross-subdomain cookies (affiliate attribution, _gumroad_guid, multi-account "switch seller", session) — browsers reject Domain=localhost, so cookies set on localhost:3000 aren't sent to seller.localhost:3000. Test these flows on a single host, or front the app with a local HTTPS reverse proxy on a registrable hostname (e.g. gumroad.test via mkcert) where Domain=.gumroad.test works.

Testing

Run the full test suite:

bin/rspec

Run a single file or specific test:

bin/rspec spec/requests/dashboard_spec.rb
bin/rspec spec/requests/dashboard_spec.rb:75

Dependencies

Before running tests:

make local                          # start Docker services (db, Redis, etc.)
RAILS_ENV=test bin/rails db:setup   # set up the test database
RAILS_ENV=test bin/rails js:export  # generate JS constants for the test environment

Integration tests

Integration specs use Capybara with Selenium driving Chrome. Install Chrome from google.com/chrome.

See docs/testing.md for details on preventing flaky specs, VCR cassettes, debugging widgets, and purchase testing with Stripe/PayPal.

Development

Logging in

You can log in with the username [email protected] 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 vis

readme truncated — read the full docs on github

Frequently asked questions

Is Gumroad free to use?

Gumroad is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does Gumroad do?

Your all-in-one marketplace for digital creators and products

What is Gumroad written in?

Gumroad is primarily written in Ruby. Its source is publicly available at https://github.com/antiwork/gumroad, and it has 9,699 GitHub stars.