Track Your Test Coverage
A self-hosted test coverage tracking service. Upload coverage data from CI, view per-file reports, compare branches, and embed badges in your README.
Features
Everything you need to track and improve test coverage
Coverage Tracking
Upload coverage data from your CI pipeline. View line-by-line coverage for every file with highlighted hit/miss indicators.
Badge Generation
Embed dynamic SVG coverage badges in your README. Badges auto-update with every build and use color coding for quick status checks.
Branch Comparison
Compare coverage between branches. See exactly which files gained or lost coverage in a pull request before merging.
Quick Start
Get coverage tracking running in 4 steps
Sign up & create a project
Create an account, then add a new project from the dashboard. You'll receive an API token for uploading coverage data.
Add the gem to your Gemfile
# Gemfile
group :test do
gem "simplecov", require: false
gem "simplecov-japan-voyage", require: false
end
Then run bundle install.
Configure test_helper.rb
# test/test_helper.rb (or spec/spec_helper.rb)
require "simplecov"
require "simplecov_japan_voyage"
SimpleCov.start "rails" do
add_filter "/test/"
add_filter "/config/"
end
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
SimpleCov::Formatter::HTMLFormatter,
SimpleCovJapanVoyage::Formatter
])
The formatter reads COVERAGE_TOKEN
from ENV automatically. When absent (local dev), it skips the upload silently.
Set COVERAGE_TOKEN in CI
# .github/workflows/ci.yml
- name: Run tests
env:
RAILS_ENV: test
COVERAGE_TOKEN: ${{ secrets.COVERAGE_TOKEN }}
run: bin/rails test
Add the project's API token as a repository secret in your CI provider.
The gem defaults to https://coverage.japanvoyage.jp.
API Reference
RESTful endpoints for coverage data
/api/v1/builds
Upload a coverage build. Requires token authentication.
Authentication
Authorization: Bearer <COVERAGE_TOKEN>
Request Body (JSON)
{
"commit_sha": "abc123",
"branch": "main",
"commit_message": "Add tests",
"commit_author": "dev@example.com",
"covered_percent": 87.5,
"lines_covered": 1750,
"lines_missed": 250,
"lines_total": 2000,
"ci_service": "github_actions",
"ci_build_url": "https://github.com/...",
"files": [
{
"file_path": "app/models/user.rb",
"covered_percent": 95.0,
"lines_covered": 19,
"lines_missed": 1,
"lines_total": 20,
"line_coverage": [1, 1, null, 0, 1, ...]
}
]
}
Response (201 Created)
{
"id": 42,
"covered_percent": 87.5,
"coverage_delta": 1.2,
"url": "https://coverage.japanvoyage.jp/projects/my-app/builds/42"
}
/api/v1/status/:badge_token
Get the latest coverage status for a project. Public, no authentication required.
Response (200 OK)
{
"project": "my-app",
"branch": "main",
"covered_percent": 87.5,
"lines_covered": 1750,
"lines_missed": 250,
"lines_total": 2000,
"commit_sha": "abc123",
"created_at": "2026-02-26T10:00:00Z"
}
/badges/:badge_token.svg
Returns a dynamic SVG coverage badge. Public, no authentication required. Cached for 5 minutes.
Badge Colors
Badge Examples
Add a coverage badge to your project README
Markdown

HTML
<img src="https://coverage.japanvoyage.jp/badges/YOUR_BADGE_TOKEN.svg" alt="Coverage">
Configuration
Environment variables for the SimpleCov formatter
| Variable | Required | Default | Description |
|---|---|---|---|
COVERAGE_TOKEN |
Yes | — | Project API token from the dashboard. Upload is skipped when absent. |
COVERAGE_URL |
No | https://coverage.japanvoyage.jp |
Override the coverage service URL (e.g. for self-hosted instances). |
Ready to track your coverage?
Sign up and start uploading coverage data from your CI in minutes.
Create Free Account