<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://samsung.github.io/qaboard/release-notes</id>
    <title>QA-Board release notes</title>
    <updated>2026-10-05T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://samsung.github.io/qaboard/release-notes"/>
    <subtitle>What's new in QA-Board</subtitle>
    <icon>https://samsung.github.io/qaboard/img/favicon/favicon-32x32.png</icon>
    <entry>
        <title type="html"><![CDATA[2026-10]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2026-10</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2026-10"/>
        <updated>2026-10-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[QA-Board now works with GitHub as well as GitLab, Gitea/Forgejo and Bitbucket, searches all of a project's commits, opens big commits much faster, and has a file browser and a video viewer. A quickstart, a user guide and release notes in the app help you get started; admins, check your git host settings before upgrading, and at SIRC install one more package when you upgrade qaboard.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><span class="version_NYcp">qaboard v<!-- -->1.1.1</span><p class="description_UTc_">QA-Board now works with GitHub as well as GitLab, Gitea/Forgejo and Bitbucket, searches all of a project's commits, opens big commits much faster, and has a file browser and a video viewer. A quickstart, a user guide and release notes in the app help you get started; admins, check your git host settings before upgrading, and at SIRC install one more package when you upgrade qaboard.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q project-integration_Ky7h">Project integration</span><h3 class="title_hdm3">GitHub and other git hosts</h3><p class="text_FLe0">QA-Board works with repositories on GitHub and GitHub Enterprise as well as GitLab, and receives the push events of Gitea, Forgejo and Bitbucket Cloud. On GitHub, <code>qa batch</code> sets a commit status that links to the results, and you can start GitHub Actions workflows from the web app. The experimental <code>qa gate</code> fails the CI when quality regresses.</p><a href="https://samsung.github.io/qaboard/docs/project-init#optional-connect-your-git-host">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Search all your commits, browse your files</h3><p class="text_FLe0">The commit list's Filter box searches all of a project's commits, not only the last days: by message, committer, branch, batch or hash. Open a folder under <code>/s/</code> to get a file browser. Commit pages with 1000 runs filter and sort without freezing, and big commit lists and the projects list load much faster.</p><a href="https://samsung.github.io/qaboard/docs/user-guide/finding-results#searching-commits">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">What's new, a user guide, logs and videos</h3><p class="text_FLe0">Release notes pop up once a month is over: read them again from the sparkles button in the sidebar. A new user guide, with screenshots of demo projects, explains the web app. Logs update live, with search, failed LSF runs show why LSF stopped them, and videos compare with a wipe, frame by frame.</p><a href="https://samsung.github.io/qaboard/docs/user-guide/whats-new">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q admins_lbEZ">Admins</span><h3 class="title_hdm3">Quickstart, Kubernetes, and upgrading</h3><p class="text_FLe0">Try QA-Board with one Compose file and demo projects. <code>deployments/deploy.py</code> rolls out new backend replicas next to the old ones and rolls back instantly, and each release publishes its images and a Helm chart. Before upgrading, keep <code>GITLAB_HOST</code> set or list your GitLab in <code>QABOARD_GIT_HOSTS</code>: a migration records the git host of each project.</p><a href="https://samsung.github.io/qaboard/docs/backend-admin/git-hosts#upgrading-from-older-versions">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2026-10#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">Added the "What's new" panel: the release notes, newest first, with a search box. The link <code>/#whats-new</code> opens it, handy to share in a chat.</li>
<li class="">The "What's new" dialog pops up once a month (or quarter) is over, with everything that changed in it. The notes of the current month show in the panel as a preview, tagged "In progress".</li>
<li class="">The sidebar's help button opens the new <a class="" href="https://samsung.github.io/qaboard/docs/user-guide/overview">user guide</a>.</li>
<li class="">The Logs view lets you filter runs (all, failed, running), and tags failed runs with the reason (e.g. "LSF: out of memory").</li>
<li class="">In the Logs view, each run fits on one line, with its configuration in short and buttons to open its output directory, redo, mark as failed or delete it. The full configuration shows when you open the run's logs, and the logs no longer get wider than the window.</li>
<li class="">The sidebar's Logs entry shows how many runs failed, or are still running.</li>
<li class="">Switch between a run's <code>log.txt</code>, <code>log.lsf.txt</code> and <code>log.dask.txt</code>. For LSF runs, a summary shows the exit reason, host, run time and memory used vs requested, with hints that point to the batch's <code>lsf:</code> options.</li>
<li class="">Batches started from QA-Board (tuning, "Run Tests") show whether <code>qa batch</code> is waiting for LSF, running, failed (with the error) or didn't start any run, with a link to its logs.</li>
<li class="">Follow links to code, commits and branches on your project's own git host, with the right URLs for GitHub, GitLab, Gitea/Forgejo and Bitbucket, instead of a hardcoded GitLab server.</li>
<li class="">Shows the "Quotas" links only when the server has a quota dashboard.</li>
<li class="">The error page links to your server's support page.</li>
<li class="">The URL now keeps everything you select: the commit list's date range, the metrics shown in tables, the commits highlighted on the History page. Share the link, reload, or use the back button: you get the same view. Typing filters and toggling viewer options no longer adds entries to the browser's history.</li>
<li class="">Dynamic options (e.g. which frame to show) work across runs with different values: the controls panel lists the values of all runs, and a run that doesn't have the selected value shows the closest one and says so. Options are linked across runs from the start, and unlinking one gives each card its own selector, starting from the same value. See the <a class="" href="https://samsung.github.io/qaboard/docs/user-guide/commit-page#the-controls-panel">user guide</a>.</li>
<li class="">Links are much shorter: the URL only keeps what differs from the defaults (batch, filters, metrics, view, visualization controls, plot options).</li>
<li class="">Open a folder under <code>/s/</code> in your browser to get the new <a class="" href="https://samsung.github.io/qaboard/docs/user-guide/files">file browser</a>: sort and filter files (e.g. <code>*.png</code>), copy their Linux or Windows paths, paste a path to go there, and navigate with the keyboard (press <code>?</code>). Scripts and <code>curl</code> still get nginx's plain index.</li>
<li class="">In the file browser, a bar shows the run whose folder you are in, with its status and a link to its results: <a class="" href="https://samsung.github.io/qaboard/docs/user-guide/files#runs">redo it, delete it or mark it as failed</a> from there.</li>
<li class="">The Available Tests view is a real editor for your private and shared batches: it flags YAML mistakes as you type, shows if your changes are saved next to the Save button (or <code>Ctrl+S</code>), lets you review or discard them, and keeps them if you leave before saving. It also warns instead of overwriting someone else's changes to the shared batches. See the <a class="" href="https://samsung.github.io/qaboard/docs/user-guide/commit-page#available-tests">user guide</a>.</li>
<li class="">The Available Tests view lists the batches in each file: go to one, list the tests it resolves to on the commit, or run it in one click.</li>
<li class="">The Available Tests editor flags inputs that <code>qa batch</code> can't use as you type: an empty <code>-</code>, or a number, date or <code>yes</code> that should be in quotes.</li>
<li class="">When a batch has no tests in Available Tests or Run Tests / Tuning, see why: a file of <code>inputs.batches</code> that isn't in the commit's artifacts (with the path QA-Board looked for), a file that isn't valid YAML, a batch that no file defines, or inputs the server didn't find under the database. Available Tests also lists the batch files it read, and which one defines the batch. See the <a class="" href="https://samsung.github.io/qaboard/docs/user-guide/commit-page#available-tests">user guide</a>.</li>
<li class="">Copy the path of a run's output directory from the Logs view, next to the button that opens it. When your server has Windows path mappings, the confirmation offers the Windows path too. The batch directory, and the folders of batches started from QA-Board, have the same buttons.</li>
<li class="">See where the logs of each command that started a batch are: in the CI job (with a link), or in QA-Board (one click shows them). The batch's own <code>log.txt</code> only shows when it exists. See the <a class="" href="https://samsung.github.io/qaboard/docs/user-guide/commit-page#logs">user guide</a>.</li>
<li class="">Show more of very long logs: they show their last 50,000 lines to stay fast, and say if the hidden lines have errors or matches for your search.</li>
<li class="">When you filter a batch's runs, the commit bar menu redoes only the runs that match the filter. Follow redone runs in the Logs view, under "Started from QA-Board". See the <a class="" href="https://samsung.github.io/qaboard/docs/user-guide/running-from-the-webapp">user guide</a>.</li>
<li class="">Find your way around from the History page: the sidebar shows the project's navigation (the branch's commits, Code, History, Integrations, Milestones), and moving between these pages no longer reloads the app.</li>
<li class="">See who made a commit at a glance: when there's no avatar picture, committers, users and projects show their initials on a color that stays the same everywhere.</li>
<li class="">The Analysis view of a <code>qa optimize</code> experiment plots its convergence itself: each iteration's objective and the best one so far, even when matplotlib isn't installed where <code>qa optimize</code> ran.</li>
<li class="">Run cards fit the window when <em>qaboard.yaml</em> doesn't set their width (<code>outputs.style.width</code>): they used to be 1500 px wide, wider than a laptop's screen.</li>
<li class="">Link to History with or without the breakdown per test, or relative to the first commit: <code>?breakdown_per_test=false</code> and <code>?relative=true</code> in the URL now work.</li>
<li class="">Compare videos with a wipe, by toggling between them in place, or as their difference, besides side by side. Zoom with the mouse wheel or a pinch and drag to pan: both videos follow, and zoomed in you see the actual pixels. See <a class="" href="https://samsung.github.io/qaboard/docs/user-guide/comparing-results#video-viewer">comparing videos</a>.</li>
<li class="">Step through videos frame by frame with the arrow keys, scrub, slow down to 0.1× or loop: new and reference stay on the same frame, and wait for each other when one is still downloading.</li>
<li class="">Copy the current frame of a video (new, reference or their difference) to the clipboard, or save it as a PNG.</li>
<li class="">Start the GitHub Actions workflows declared in your project's <code>qaboard.yaml</code> from the Integrations menu, and follow the run you started, even when GitHub ran it on a newer commit of the branch. Only users who can access the project can see or start them (<a class="" href="https://samsung.github.io/qaboard/docs/triggering-third-party-tools#start-github-actions-workflows">GitHub Actions</a>).</li>
<li class="">See the status of a GitHub Actions workflow's latest run for the commit, with a link to it, in the Integrations menu.</li>
<li class="">See your git host's defaults in the Integrations menu of branch pages, when your project configures none and QA-Board knows its git host: GitLab's pipeline status, or a link to GitHub Actions (<a class="" href="https://samsung.github.io/qaboard/docs/triggering-third-party-tools#default-integrations">default integrations</a>).</li>
<li class="">Hides the Integrations menu's badges that fail to load, e.g. for private projects or projects without CI.</li>
<li class="">See commit authors' avatars from GitHub, Gitea/Forgejo and Bitbucket, learned from push events, or else their Gravatar.</li>
<li class="">Loads avatars and badges from public git hosts (github.com, Bitbucket, Codeberg, and your server's git hosts that aren't GitLab) directly, which is faster. Those from your GitLab hosts and Gravatar still load through the server, which can reach hosts you can't.</li>
<li class="">Search all of a project's commits from the commit list's <strong>Filter...</strong> box, not only those in the date range: by message, committer, branch, batch or hash. Use <code>branch:</code>, <code>committer:</code>, <code>batch:</code>, <code>message:</code> or <code>id:</code> to look at one field, and <code>-word</code> to exclude (<a class="" href="https://samsung.github.io/qaboard/docs/user-guide/finding-results#searching-commits">searching commits</a>).</li>
<li class="">Scroll through long commit lists: they show the 50 latest commits, then more as you scroll, so big projects open much faster. Branch pages still get their whole date range at once (up to 1000 commits), for their metrics chart.</li>
<li class="">Click <strong>Older commits</strong> at the end of the commit list to look a week further back.</li>
<li class="">Open the projects list much faster on sites with hundreds of projects: it downloads less, and shows more projects as you scroll.</li>
<li class="">Jump to a branch from the <strong>Filter...</strong> box: when your search can be a branch name (one word, or a <code>branch:</code> term), it suggests the most recently active branches that match, even in projects with thousands of branches.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2026-10#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class="">At SIRC, upgrading <code>qaboard</code> now requires also installing <code>qaboard-site-sirc</code>, see the <a class="" href="https://samsung.github.io/qaboard/docs/installation">installation instructions</a>. Site packages provide a base <code>qaboard.yaml</code> that every project's configuration is merged on (<a class="" href="https://samsung.github.io/qaboard/docs/project-init#site-defaults">site defaults</a>): <code>qa init</code> shows the inherited values instead of overriding them.</li>
<li class="">LSF runs write their output live to <code>log.lsf.txt</code>, with LSF's job report at the end. <code>qa batch</code> no longer passes an LSF queue or project when none is set, and fails fast when <code>bsub</code> is missing.</li>
<li class=""><code>qa init</code> creates a configuration that runs locally: LSF is commented out, and storage defaults to <code>/mnt/qaboard</code> like the server.</li>
<li class="">The CLI reads your <code>QA_TOKEN</code> from <code>$QA_TOKEN</code> or <code>~/.qaboard/secrets.yaml</code>, and warns if other users can read that file.</li>
<li class=""><code>QABOARD_API_VERIFY</code> controls the TLS verification of the CLI's requests to the server: <code>true</code> (the default), <code>false</code>, or the path to a CA bundle.</li>
<li class="">Site packages (company-specific plugins) are no longer ignored on Python 3.8 and 3.9.</li>
<li class="">The package now includes the <code>qatools</code> compatibility package, and update checks no longer suggest a site-specific install command to everyone.</li>
<li class="">Read the logs of <code>qa --share batch</code> and <code>qa optimize</code> started from a terminal in QA-Board, with the batch's commands: they save what they print in the batch directory (under <code>qa-batch-logs/</code>), errors included. <code>qa optimize</code> includes the output of its iterations. In the CI, the CI keeps the logs. See the <a class="" href="https://samsung.github.io/qaboard/docs/using-the-qa-cli">CLI tips</a>.</li>
<li class="">Configure the Windows runner's PowerShell <code>$ErrorActionPreference</code> per job (the batch's <code>error_action:</code> option) or with the <code>QA_RUNNER_ERROR_ACTION</code> environment variable (default <code>Stop</code>).</li>
<li class="">Tune how long <code>qa batch</code> waits for the Windows runner's Jenkins builds: 2 hours by default (previously 15 minutes), polling every 30 seconds (previously 5) with the <code>QA_JENKINS_TIMEOUT</code> and <code>QA_JENKINS_STATUS_INTERVAL</code> environment variables.</li>
<li class=""><code>qa batch --runs-file runs.json</code> does a list of runs, each with its input, configurations, parameters and runner options. QA-Board uses it to redo runs together. See the <a class="" href="https://samsung.github.io/qaboard/docs/using-the-qa-cli">CLI tips</a>.</li>
<li class="">With <code>--no-wait</code> and an existing Dask cluster (<code>scheduler_address</code>), the Dask runner now enforces <code>concurrency</code>: a driver LSF job sends the runs, as without <code>scheduler_address</code>. See the <a class="" href="https://samsung.github.io/qaboard/docs/dask-integration">Dask runner</a>.</li>
<li class="">Fail the CI when quality regresses, with the experimental <code>qa gate</code>: set rules in <em>qaboard.yaml</em> (<code>gate:</code>) on the median of a metric vs a reference branch, milestone or commit, on each test, on failed runs or on bit-accuracy. It prints a table (or Markdown, or JSON), fills the GitHub Actions job summary, and can post a commit status to GitHub or GitLab that links to the Metrics Diff. See <a class="" href="https://samsung.github.io/qaboard/docs/quality-gate">Quality gate</a>.</li>
<li class="">Batches list their inputs in the same order on every machine: the inputs found by <code>globs</code> are sorted by path, instead of coming in the order the filesystem lists them.</li>
<li class="">Set the frame rate of a video visualization with <code>fps</code> in <em>qaboard.yaml</em>, when the web app's guess is wrong. See <a class="" href="https://samsung.github.io/qaboard/docs/visualizations#video-viewer">the video viewer</a>.</li>
<li class=""><code>qa batch</code> sets a commit status that links to the results on GitHub too (<a class="" href="https://samsung.github.io/qaboard/docs/ci-integration">CI integration</a>).</li>
<li class=""><code>qa check-bit-accuracy</code> waits for the GitHub checks of the reference commit too, like it does for GitLab pipelines (<a class="" href="https://samsung.github.io/qaboard/docs/bit-accuracy">bit-accuracy</a>).</li>
<li class="">In GitHub Actions, <code>qa</code> records the pull request's branch and last commit instead of the temporary merge commit (<a class="" href="https://samsung.github.io/qaboard/docs/ci-integration#example-with-github-actions">CI integration</a>).</li>
<li class="">In GitHub Actions, <code>qa</code> records the tag of tag builds.</li>
<li class=""><code>qa</code> finds your git host, its API and its token in <code>QABOARD_GIT_HOSTS</code> too (<a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/git-hosts#the-cli">git hosts</a>).</li>
<li class=""><code>qa</code> sends <code>GITHUB_ACCESS_TOKEN</code> only to github.com and the GitHub hosts you configured, not to any hostname that looks like GitHub.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2026-10#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">Zero-downtime deploys with <a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/deployment">deployments/deploy.py</a>: images tagged per version, several backend replicas behind nginx, rolling updates, <code>rollback</code>, <code>status</code> and <code>restore-db</code>.</li>
<li class=""><code>deploy.py seed-db</code> fills a staging database with only production's recent data.</li>
<li class="">A <a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/kubernetes">Helm chart</a> to run QA-Board on Kubernetes.</li>
<li class="">The backend has a <code>/api/v1/health</code> endpoint, shuts down gracefully, and keeps working when redis is down.</li>
<li class="">Security: actions that run commands (redo, tuning, stopping or deleting batches...) now require a login and run as the logged-in user, and their inputs are escaped. See SECURITY.md.</li>
<li class="">Security: the server only writes, deletes or runs code in the folders listed in <code>QABOARD_STORAGE_ROOTS</code> (default: <code>/mnt/qaboard</code>), and refuses results stored elsewhere. <strong>If your projects store results in other folders, set it before upgrading</strong> (see <a class="" href="https://samsung.github.io/qaboard/docs/deploy#optional-environment-variables">environment variables</a>).</li>
<li class="">Require a secret in push webhooks: set <code>QABOARD_WEBHOOK_SECRET</code>, and the same secret in your repositories' webhooks, so that only your git hosts can send push events (<a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/git-hosts#webhooks">webhooks</a>).</li>
<li class="">Each batch started from QA-Board gets its own folder with its scripts and logs, under the batch's <code>qaboard-batches/</code>.</li>
<li class="">The web app links to the docs served by your server at <code>/docs/</code>, which match its version, instead of the public website. Set <code>QABOARD_DOCS_ROOT</code> to use another docs site.</li>
<li class="">Configure the quota dashboard and support links with <code>QABOARD_QUOTA_URL_TEMPLATE</code> and <code>QABOARD_SUPPORT_URL</code>.</li>
<li class="">Security: the server only loads avatars and badges for the web app from your GitLab hosts and gravatar. <strong>If your projects' <code>avatar_url</code> or badges (<code>integrations[].src</code>) come from other hosts, list them in <code>QABOARD_PROXY_HOSTS</code></strong> (see <a class="" href="https://samsung.github.io/qaboard/docs/deploy#optional-environment-variables">environment variables</a>).</li>
<li class="">Restrict who can read the files of restricted projects, or of the folders you list under <code>paths</code> in <code>users_restrict.yml</code>: nginx asks the backend before sending each file (see <a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/user-management#restricting-who-can-read-files">user management</a>). If you use your own nginx configuration, include <code>snippets/qaboard-files.conf</code> in the <code>/s/</code> locations to get the file browser.</li>
<li class="">In the folders listed in <code>QABOARD_FILES_UNIX_PERMISSIONS</code> (e.g. <code>/home</code>), users only read the files that their own Unix account can read (see <a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/user-management#unix-permissions">user management</a>).</li>
<li class="">Without a complete <code>/etc/passwd</code>, e.g. with LDAP or SSSD, <code>QABOARD_ACCOUNTS_COMMAND</code> (and <code>QABOARD_GROUPS_COMMAND</code>) gives the backend the users' accounts, refreshed daily: the file browser shows owners' names instead of their ids (see <a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/user-management#users-accounts">users' accounts</a>).</li>
<li class="">Redoing, deleting or marking a run as failed now requires access to its project, for restricted projects.</li>
<li class="">Scripts can send results that describe their commit with only <code>commit_sha</code> and <code>commit_authored_datetime</code>: the other <code>commit_*</code> fields (branch, message, committer, parents) are optional, and the server doesn't need access to the git repository.</li>
<li class="">Add pages for your own users to the docs your server serves: put them in <code>website/site-docs/&lt;site&gt;/</code> and build with <code>QABOARD_SITE=&lt;site&gt;</code>. They get their own menu, and the installation page links to them. At SIRC, "At SIRC" has the install commands and SIRC specifics.</li>
<li class="">Pull QA-Board's images from <code>ghcr.io/samsung/qaboard</code>: <code>docker-compose.yml</code> uses them by default, each release has its own tags (e.g. <code>backend-1.2.0</code>), and <code>QABOARD_IMAGE</code> picks another registry.</li>
<li class="">Install QA-Board on Kubernetes from the Helm chart published with each release, <code>oci://ghcr.io/samsung/charts/qaboard</code> (see <a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/kubernetes">Kubernetes</a>).</li>
<li class="">Try QA-Board on your laptop with kind: <code>charts/qaboard/quickstart.yaml</code> and <code>charts/qaboard/kind.yaml</code> start a small cluster where the <code>qa</code> CLI can save results (see <a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/kubernetes">the quickstart</a>).</li>
<li class="">Mount the storage where runs save results with the chart's new <code>results</code> setting (an existing claim, a new volume, NFS or a node folder): the chart mounts it where the backend, nginx and Cantaloupe expect it, and sets <code>QABOARD_STORAGE_ROOTS</code>.</li>
<li class="">The <code>website</code> image (the docs your server serves) is built from the repository's root, like the <code>frontend</code> image: if you build it without <code>docker compose</code>, run <code>docker build -f website/Dockerfile .</code>.</li>
<li class="">At SIRC, QA-Board no longer serves the storage over WebDAV (<code>/davs/algo/</code>): it let anyone write and delete files. <code>services/nginx/webdav.conf</code> explains how to bring it back.</li>
<li class="">Get the numbers of the Summary and Metrics Diff views from scripts and agents, with the experimental <code>/api/v1/commit/&lt;sha&gt;/compare</code>: each metric's median vs a reference, each run vs its reference run, and how many runs failed. See <a class="" href="https://samsung.github.io/qaboard/docs/quality-gate#from-scripts-and-agents">Quality gate</a>.</li>
<li class="">Try QA-Board on your computer with demo projects to look at: download one Compose file, <code>deployments/quickstart/compose.yml</code>, and run <code>docker compose up -d --wait</code> (see the <a class="" href="https://samsung.github.io/qaboard/docs/get-started/quickstart">quickstart</a>). It only answers on your computer.</li>
<li class="">Show the docs' demo projects on a Helm install with the chart's new <code>demoData</code> setting, which the kind quickstart (<code>quickstart.yaml</code>) turns on: they're restored once, before QA-Board first starts, and never over existing data. The demo data is published with each release, as <code>ghcr.io/samsung/qaboard:demo-data-&lt;version&gt;</code>.</li>
<li class="">Build the website image behind a proxy that blocks some of the docs' media (e.g. videos), or all of them: with <code>QABOARD_MEDIA_MISSING=remote</code>, readers' browsers load those shots from the media host or your mirror (<code>QABOARD_MEDIA_BASE_URL</code>), and with <code>QABOARD_MEDIA_MISSING=placeholder</code> they render as placeholders, instead of failing the build. A proxy's "blocked" page is reported as such, without retrying.</li>
<li class="">Configure all your git hosts (GitHub and GitHub Enterprise, GitLab, Gitea/Forgejo, Bitbucket, other git servers), each with its own token and webhook secret, with <code>QABOARD_GIT_HOSTS</code> (<a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/git-hosts">git hosts</a>).</li>
<li class="">Keeps your current git settings working: <code>GITLAB_HOST</code> (also without a scheme, or with credentials), <code>GITLAB_ACCESS_TOKEN</code>, <code>GITHUB_ACCESS_TOKEN</code>, <code>QABOARD_GITHUB_HOSTS</code> for GitHub Enterprise, and <code>QABOARD_GITLAB_HOSTS</code>, whose hostnames are other names of <code>GITLAB_HOST</code>. A GitLab and a GitHub host can share a hostname (<a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/git-hosts#backward-compatibility">backward compatibility</a>).</li>
<li class="">Records each existing project's git host, with a migration that uses the deploy's git host settings. <strong>Before upgrading, keep <code>GITLAB_HOST</code> set</strong>, or list your GitLab in <code>QABOARD_GIT_HOSTS</code> with the hostnames older projects used (<a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/git-hosts#upgrading-from-older-versions">upgrading</a>).</li>
<li class="">Receives the push events of repositories on Gitea, Forgejo and Bitbucket Cloud, at <code>/webhook/gitea</code> (or <code>/webhook/forgejo</code>) and <code>/webhook/bitbucket</code> (<a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/git-hosts#webhooks">webhooks</a>, <a class="" href="https://samsung.github.io/qaboard/docs/project-init#optional-connect-your-git-host">project setup</a>).</li>
<li class="">Stops saving git tokens in new clones' <code>.git/config</code>, or showing them in error messages: git gets them from a credential helper, and only for their own host (it needs git 2.31 or newer). Clones made by older versions still have the token in their remote URL: <a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/git-hosts#tokens">remove it</a>.</li>
<li class="">Stops sending git tokens, and GitLab session cookies, to another host when git or API calls are redirected there.</li>
<li class="">Reads git tokens and webhook secrets only from its environment, not from the CLI's shared secrets file (<code>QA_SECRETS</code>).</li>
<li class="">Refuses push events for git hosts without a webhook secret, once any host has one or <code>QABOARD_WEBHOOK_SECRET</code> is set (<code>401</code>): otherwise anyone could claim a repository is on such a host.</li>
<li class="">Refuses push events from git hosts the server doesn't know (<code>403</code>), without reading the rest of the payload. Pushes to <code>/webhook/gitlab</code> from unknown hostnames still go to your GitLab, like before.</li>
<li class="">Refuses push events that would move an existing project to another git host (<code>409</code>).</li>
<li class="">Refuses webhook payloads over 25 MB (<code>413</code>), the most GitHub sends.</li>
<li class="">Answers and ignores webhook events other than pushes, like GitHub's <code>ping</code>.</li>
<li class="">Keeps starting, and running migrations, when the git host settings are invalid: the server logs the error, and refuses webhooks (<code>503</code>) until you fix them.</li>
<li class="">Lists of commits answer many times faster on big projects, and use much less memory: they no longer load every output of every commit.</li>
<li class="">API: page through <code>/api/v1/commits</code> with <code>limit</code> and <code>offset</code> (the <code>X-Has-More</code> response header tells if there are more), and search all of a project's commits with <code>q</code> (<a class="" href="https://samsung.github.io/qaboard/docs/apis#lists-of-commits-branches-and-projects">lists of commits</a>). Without them, it answers as before.</li>
<li class="">API: get the most recently active branches matching a text with <code>/api/v1/project/branches?q=...&amp;limit=...</code>.</li>
<li class="">API: get a much smaller list of projects with <code>/api/v1/projects?summary=true</code>.</li>
<li class="">Adds two indexes on <code>ci_commits</code>, to list commits faster. They are built without blocking writes, which can take a few minutes on big databases. If building one fails, the next deploy builds it again.</li>
<li class="">Starts even when the database has migrations it doesn't know, made by a newer version, e.g. after a rollback: it keeps them.</li>
<li class="">Versions from before October 2026 don't start on a database migrated by this one: to roll back to them, first undo the newer migrations (<a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/deployment">rollbacks</a>).</li>
<li class="">The Helm chart's migrations Job gets the chart's <code>config:</code> settings, which data migrations need (<a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/kubernetes">Kubernetes</a>).</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="documentation">Documentation<a href="https://samsung.github.io/qaboard/release-notes/2026-10#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class="">New <a class="" href="https://samsung.github.io/qaboard/docs/user-guide/overview">user guide</a> for people who use the web app every day.</li>
<li class="">New runbooks for deployments, rollbacks and Kubernetes.</li>
<li class="">Release notes going back to 2017, on the website and in the app.</li>
<li class="">Many pages updated to match the code, and features that were never documented: GitHub webhooks, API tokens, batch options, bit-accuracy manifests, auto-optimization...</li>
<li class="">Find the server docs in one place, written for any site: starting a server, deployments and rollbacks with <code>deploy.py</code>, host maintenance, backups and <a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/troubleshooting">troubleshooting</a>.</li>
<li class="">Follow old links to pages that moved or were removed: they redirect to the closest page.</li>
<li class="">Find <a class="" href="https://samsung.github.io/qaboard/docs/auto-optimization">auto-optimization</a> in the sidebar.</li>
<li class="">Write your own file viewer: see the end of <a class="" href="https://samsung.github.io/qaboard/docs/visualizations">visualizations</a>.</li>
<li class="">See where QA-Board is going on the new <a class="" href="https://samsung.github.io/qaboard/docs/roadmap">roadmap</a>: its principles, and for each theme what's shipped, experimental, next or still being explored.</li>
<li class="">See each image viewer tool at work in screenshots and short clips of a demo project, in <a class="" href="https://samsung.github.io/qaboard/docs/user-guide/comparing-results#image-viewers">Comparing results</a> and <a class="" href="https://samsung.github.io/qaboard/docs/user-guide/commit-page">The commit page</a>.</li>
<li class="">See the web app in screenshots and clips of the demo projects on every page of the <a class="" href="https://samsung.github.io/qaboard/docs/user-guide/overview">user guide</a>, and next to the settings that produce them in the project integration docs, like <a class="" href="https://samsung.github.io/qaboard/docs/visualizations">Visualizations</a>.</li>
<li class="">Run QA-Board on your computer with the new <a class="" href="https://samsung.github.io/qaboard/docs/get-started/quickstart">quickstart</a>: one Docker Compose file, or a kind cluster and the Helm chart, with demo projects to look at, then results from an example project.</li>
<li class="">Put your project on QA-Board step by step with the <a class="" href="https://samsung.github.io/qaboard/docs/get-started/tutorial">tutorial</a>: pick your server, code hosting, CI and runners once at the top, and every step shows the instructions for your stack. Links keep your choices (e.g. <code>?server=k8s&amp;ci=gitlab-ci</code>).</li>
<li class="">See what QA-Board is for in <a class="" href="https://samsung.github.io/qaboard/docs/tour">QA-Board in 5 minutes</a> and in one use case per demo project of a fictional robotics company, starting with <a class="" href="https://samsung.github.io/qaboard/docs/use-cases/image-quality">image quality</a>. The <a class="" href="https://samsung.github.io/qaboard/docs/get-started/concepts">key concepts</a> fit in one page.</li>
<li class="">Find the quickstart, the review loop and what's coming next on the website's new home page.</li>
<li class="">Links to the docs shared in chats and social networks show a card with QA-Board's tagline and a glimpse of the web app.</li>
<li class="">The docs show a placeholder that describes a screenshot or clip when your browser can't load it, instead of a broken image.</li>
<li class="">New <a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/git-hosts">git hosts</a> page for admins.</li>
<li class="">The project setup and CI pages cover GitHub and GitLab equally (<a class="" href="https://samsung.github.io/qaboard/docs/ci-integration">CI integration</a>).</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="performance">Performance<a href="https://samsung.github.io/qaboard/release-notes/2026-10#performance" class="hash-link" aria-label="Direct link to Performance" title="Direct link to Performance" translate="no">​</a></h2>
<p>Measured on a commit with 1000 runs:</p>
<ul>
<li class="">Type in the filter box of a commit page without the page freezing: the results update in half a second, instead of after 7 seconds of a frozen page. Sorting runs, and matching them with their reference, no longer freeze the page either.</li>
<li class="">Open the Metrics Table in a third of a second instead of 7 seconds, with a fraction of the memory (40 MB instead of 640 MB): big tables only render the rows on screen.</li>
<li class="">Open the Visualizations twice as fast: cards download their files as they scroll into view, and files shared by several cards or viewers are downloaded once. Batches with more than 300 runs show more cards as you scroll, or all of them with "show all".</li>
<li class="">Commit pages load in 0.6 s instead of 1 s.</li>
<li class="">Come back to a page you already visited and it shows up at once, then refreshes in the background. Commits with running outputs keep updating.</li>
<li class="">After a reload, the projects and your account show at once, from your browser's cache, while QA-Board fetches fresh data.</li>
<li class="">Open tuning batches faster: runs that have an exact match in the reference no longer go through a name-similarity search.</li>
<li class="">Scroll through hundreds of runs in the Logs view without slowdowns.</li>
<li class="">Open very long logs (tens of thousands of lines) several times faster, and search them without the page freezing for seconds.</li>
<li class="">See the diff of big text files (logs, configurations...) with the reference sooner: the editor loads while the files download, instead of after.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2026-10#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="across-the-web-app">Across the web app<a href="https://samsung.github.io/qaboard/release-notes/2026-10#across-the-web-app" class="hash-link" aria-label="Direct link to Across the web app" title="Direct link to Across the web app" translate="no">​</a></h3>
<ul>
<li class="">Copying the path of an output, batch or commit directory gives the right path when folder names contain characters like <code>#</code>, and the confirmation shows the copied path.</li>
<li class="">Notifications show at the bottom of the window again, instead of at the bottom of the page's first screen where they were out of sight once you scrolled down.</li>
<li class="">Counters say "1 output", "1 run" and "1 project" instead of "1 outputs", "1 runs" and "1 projects".</li>
<li class="">Links to the LSF docs and to the getting-started page work again, and the retired chat link now points to your server's support page (by default, QA-Board's GitHub issues).</li>
<li class="">The "No projects yet" page links to your server's docs and support page.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="commit-page-and-viewers">Commit page and viewers<a href="https://samsung.github.io/qaboard/release-notes/2026-10#commit-page-and-viewers" class="hash-link" aria-label="Direct link to Commit page and viewers" title="Direct link to Commit page and viewers" translate="no">​</a></h3>
<ul>
<li class="">Dynamic options no longer show an empty card when a run doesn't have the selected value, sort numbers as numbers (<code>2</code> before <code>10</code>), and no longer split into options like <code>frame_1234</code> that control nothing. Whether an option is linked is no longer remembered across projects.</li>
<li class="">In the image viewer, changing a Dynamic Option (e.g. a slider over your pipeline's stages) keeps the zoom and the selected ROI, for the new and reference images, instead of zooming out to the whole image, most often when the reference's image showed up. Images with another aspect ratio fit the selected ROI again.</li>
<li class="">Hiding a visualization shown by default takes one click instead of two.</li>
<li class="">A run is compared with the reference run of the same platform: when the reference batch had the same input and configuration on two platforms, the other platform's run was picked.</li>
<li class="">The Improvement report showed "=" for metrics that changed, and badges for those that didn't.</li>
<li class="">The Summary's change in % has the right sign for metrics with negative values, and runs that return no value (<code>null</code>) for a metric no longer count as 0 in its median.</li>
<li class="">The Summary only warns that it mixes runs with different parameters when the runs it aggregates really have different parameters: filter the runs to compare one configuration.</li>
<li class="">In the Metrics Table, the New and Ref headers stay over their columns when a filter leaves out every run that has some metric, and metrics without a target show just their unit, like <code>[s]</code>.</li>
<li class="">Removing a metric from a table's metric picker no longer also drops the selected metrics that the current batch doesn't have.</li>
<li class="">The reference commit's refresh button works again: it was disabled once the commit had loaded.</li>
<li class="">The error page shows the error as text, instead of inserting it in the page as HTML.</li>
<li class="">Output Files tags runs <strong>Bit-accurate</strong> when their output files match the reference's: like <code>qa check-bit-accuracy</code>, it only checks the files that match <code>bit_accuracy.patterns</code> in <em>qaboard.yaml</em> (all files by default, except logs, <code>run.json</code> and <code>metrics.json</code>). The other files are still listed when they differ, greyed and tagged "not checked". See <a class="" href="https://samsung.github.io/qaboard/docs/bit-accuracy#what-files-are-checked">bit-accuracy tests</a>.</li>
<li class="">Images show in the image viewer on servers that don't set <code>QABOARD_IMAGE_SERVERS</code>: the default is now Cantaloupe's <code>/iiif/2/</code> endpoint, instead of a <code>/iiif</code> URL that Cantaloupe couldn't answer.</li>
<li class="">JPEG images show in the image viewer again, instead of an "Image Download Error": the image server only sent them as JPEG tiles, and the viewer asks for PNG ones. They now come as PNG tiles, with the exact pixel values for the pixel tooltip and the diff. Update the <code>cantaloupe</code> image to get the fix.</li>
<li class="">The image viewer's <strong>Auto ROIs</strong> finds regions again, instead of failing with an error.</li>
<li class="">The image viewer's ROI thumbnails show the image the viewer shows: they no longer break for runs that save a TIFF instead of a PNG, or for images served by another image server (<code>QABOARD_IMAGE_SERVERS</code>).</li>
<li class="">ROIs set on inputs of another size than the output images are placed right on non-square images, in the thumbnails and when you zoom on them.</li>
<li class="">In the image viewer, selecting a region (the selection button, or <code>c</code>) draws it again and shows its histograms, instead of panning the image.</li>
<li class="">The image viewer's diff threshold slider no longer jumps to its maximum and gets stuck: it moves step by step after you turn the diff on.</li>
<li class="">In point clouds, WASD moves while the key is pressed, not after it's released.</li>
<li class="">Plots saved with <code>side_by_side: false</code> draw the reference run's traces on the same axes, instead of nothing when a figure has several traces. Traces keep their own dash style.</li>
<li class="">Differential flame graphs are colored by what changed: red for frames that take more time than in the reference, blue for less, orange for new ones. The colors no longer exaggerate changes near the root.</li>
<li class="">The SLAM and tuning plots no longer have Plotly's "Send to Cloud" button, so their data can't be uploaded to Plotly's public cloud.</li>
<li class="">Text viewers set to show only differences hide identical files, and videos play without a reference.</li>
<li class="">Text files in a run's output files show again when the reference run doesn't have them, and their diff with the reference no longer breaks when you press <code>t</code> to swap the sides.</li>
<li class="">HTML outputs (like a run's report) show their images and links, which are relative to their own folder, and their styles no longer change the rest of the page: they show in a frame, without running scripts.</li>
<li class="">Artifacts &amp; Configurations shows the artifacts again when the commit loads after the view, instead of "Could not find" them.</li>
<li class="">Playing or pausing a video that has no reference no longer raises errors ("pause is not a function").</li>
<li class="">Videos your browser can't play (e.g. HEVC) say so, with the command to convert them, instead of staying black. Animated <em>.webp</em> and <em>.gif</em> files now show, side by side with the reference's, instead of a black box or their bytes as text.</li>
<li class="">The Summary's box plots on a log scale show a few round ticks, instead of labels that overlapped.</li>
<li class="">In the video viewer's Toggle mode, clicking "Toggle" again flips between the new and reference videos, like the <code>t</code> shortcut.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="logs">Logs<a href="https://samsung.github.io/qaboard/release-notes/2026-10#logs" class="hash-link" aria-label="Direct link to Logs" title="Direct link to Logs" translate="no">​</a></h3>
<ul>
<li class="">The Logs view's copy buttons (logs, commands) work when QA-Board is served over plain http, not only https.</li>
<li class="">Switching between a run's log files shows the end of the new file, instead of keeping the scroll position and the highlighted error of the previous one.</li>
<li class="">The floating panel's button no longer hides the buttons on the right of the Logs view.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="commits-branches-and-history">Commits, branches and history<a href="https://samsung.github.io/qaboard/release-notes/2026-10#commits-branches-and-history" class="hash-link" aria-label="Direct link to Commits, branches and history" title="Direct link to Commits, branches and history" translate="no">​</a></h3>
<ul>
<li class="">Reloading a page, opening a shared link or using the back button shows what the URL says: the selected commits, batches and filters could disagree with it.</li>
<li class="">The back button takes you back in one click after following links inside QA-Board: some links added two entries to the browser's history.</li>
<li class="">The chart above a branch's commits shows the branch's metrics, the median or average over each commit's runs, instead of staying empty. Each commit row also shows the median and average of the default metric over its CI runs.</li>
<li class="">History's "Performance over time" chart shows your project's metrics again, instead of asking you to define them.</li>
<li class="">In History, the chart's axis no longer shows the metric's unit when the values are relative to the first commit (@100).</li>
<li class="">The History page's per-test tables show their metric columns again, in tabs named "Metrics Table" and "Metrics Diff" like on commit pages.</li>
<li class="">On the History page, picking metrics updates the metrics distribution too.</li>
<li class="">Selecting a milestone from <code>qaboard.yaml</code> selects the latest commit of its branch.</li>
<li class="">The batch selector no longer jumps back to the top while you scroll it, and its keyboard navigation works again. It now opens on the selected batch, marked with a check.</li>
<li class="">Switching to a branch you had opened in a previous visit no longer crashes the commits list ("setHours is not a function").</li>
<li class="">Commit pages and the branch list no longer break when results were sent without a branch.</li>
<li class="">The commit list's day headers say "1 commit" instead of "1 Commits".</li>
<li class="">The projects list shows the description from <em>qaboard.yaml</em> (<code>project.description</code>) for projects that aren't on GitHub or GitLab too.</li>
<li class="">History's y axis no longer cuts off the start of its top label ("000 ms" for 1000 ms).</li>
<li class="">The chart above a branch's commits leaves out the commits that don't have the metric, instead of drawing gaps in its line.</li>
<li class="">Typing a commit id in the commits list's search and pressing Enter no longer leaves "[object Object]" in the search box.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="runs-batches-and-tuning">Runs, batches and tuning<a href="https://samsung.github.io/qaboard/release-notes/2026-10#runs-batches-and-tuning" class="hash-link" aria-label="Direct link to Runs, batches and tuning" title="Direct link to Runs, batches and tuning" translate="no">​</a></h3>
<ul>
<li class="">Redoing runs from QA-Board respects the batch's concurrency, and uses the runner the runs were started with (e.g. Dask) and its settings. QA-Board used to start each run with its own <code>qa batch</code>, so they all ran at once, with the default runner.</li>
<li class="">Runs that start again (redo, <code>qa batch</code>...) no longer show as failed, and count as failed, until they finish: their status is reset when they are pending or running.</li>
<li class="">Finished runs whose metrics don't include <code>is_failed</code> count as successful, instead of neither successful nor failed.</li>
<li class="">A stuck run's "Mark as Finished" action is now labelled "Mark as Failed", which is what it does.</li>
<li class="">Moving runs to another batch closes the dialog, and saving a milestone no longer risks losing it.</li>
<li class="">The tuning form shows a readable error instead of the server's raw response.</li>
<li class="">The tuning form remembers the "Overwrite" option, and setting the number of iterations no longer crashes.</li>
<li class="">Run Tests / Tuning runs as you when you open it from a link: it no longer asks for a user it can't let you type, with Send disabled.</li>
<li class="">The Auto-Tuning Analysis plots each iteration's metrics (those in the objective) next to the objective, for tunings run from now on: <code>qa optimize</code> used to get no metrics from the server.</li>
<li class="">Projects whose inputs are inside the project (a relative <code>inputs.database</code>, like <code>inputs</code>) see their tests in the Run Tests / Tuning form and in Available Tests: they are looked for in the commit's artifacts, where the runs started from QA-Board run, instead of in a folder of the server. In monorepos, from the root <em>qaboard.yaml</em>'s folder, like <code>qa</code> does.</li>
<li class="">Run Tests / Tuning and Available Tests find the inputs of projects whose <code>inputs.database</code> uses <code>{project}</code> or <code>{subproject}</code> (e.g. <code>/datasets/{project.name}</code>), instead of looking for them from <code>/</code>.</li>
<li class="">When several of a commit's batch files define the same batch, Run Tests / Tuning and Available Tests use the last one, like <code>qa batch</code>, instead of the first.</li>
<li class="">Listing a batch's tests no longer fails for commits that QA-Board saw before <code>qa</code> sent their <em>qaboard.yaml</em> (e.g. opened by branch name): it uses the project's, and the commit gets its own the next time <code>qa</code> runs on it.</li>
<li class="">Run Tests / Tuning lists the tests of batches whose name contains <code>+</code>, <code>&amp;</code> or <code>#</code>.</li>
<li class="">When a batch has an input it can't use, like an empty <code>-</code> or a number, <code>qa batch</code> says which batch, in which file and at which line, instead of "Could not understand the inputs in the batch" followed by all its inputs. Available Tests and Run Tests / Tuning show the same error.</li>
<li class="">Runs started from QA-Board are the logged-in user's, instead of the server's user.</li>
<li class="">Stopping a batch whose runs can't be stopped reports the error instead of failing.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="file-browser">File browser<a href="https://samsung.github.io/qaboard/release-notes/2026-10#file-browser" class="hash-link" aria-label="Direct link to File browser" title="Direct link to File browser" translate="no">​</a></h3>
<ul>
<li class="">Going back after opening a file shows the folder again, instead of its raw listing.</li>
<li class="">Links to a run's output directory open the file browser even when the folder doesn't exist, e.g. for runs that failed before they started, instead of an error page.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli">CLI<a href="https://samsung.github.io/qaboard/release-notes/2026-10#cli" class="hash-link" aria-label="Direct link to CLI" title="Direct link to CLI" translate="no">​</a></h3>
<ul>
<li class="">With LSF job arrays and the Dask runner, <code>qa run</code> no longer deletes the log file its output goes to: errors are no longer lost.</li>
<li class="">Runs started from a <code>git worktree</code> checkout are saved under their commit, instead of their branch name. Submodules with a relative <code>.git</code> pointer also work.</li>
<li class="">On Windows, <code>qa batch</code> finds existing results for projects whose name contains a "/", instead of failing with "could not find any data on commit ID": <code>--action-on-existing</code> works there.</li>
<li class=""><code>qa optimize</code> works with recent versions of scikit-optimize, instead of failing with "cannot import name 'Integer'".</li>
<li class=""><code>qa optimize</code> no longer fails at the end when matplotlib isn't installed: it only skips its convergence plot.</li>
<li class=""><code>qa batch --tuning-search</code> runs a grid search when the JSON doesn't say <code>search_type</code>, as the docs show, instead of failing with <code>KeyError: 'search_type'</code>.</li>
<li class=""><code>qa</code> no longer warns that it doesn't know where your server is when you set <code>QABOARD_URL=http://localhost:5151</code>.</li>
<li class=""><code>qa</code> no longer prints a git error when the commit it runs on isn't in the local clone (e.g. shallow CI clones): it only did without the commit's details. <code>QA_VERBOSE=1</code> still shows it.</li>
<li class="">With Python 3.12 and later, <code>qa</code> no longer prints a <code>SyntaxWarning: invalid escape sequence</code> when it starts.</li>
<li class=""><code>qa batch</code> accepts a single input written as text (<code>inputs: a.jpg</code>), and says that a batch written as a list (<code>my-batch: [a, b]</code>) must be a mapping with <code>inputs:</code>, also in the web app (the server used to call <code>exit()</code> there).</li>
<li class=""><code>qa get</code> works with Python 3.13: it said "Could not find" for every variable.</li>
<li class=""><code>QA_BATCH_CONCURRENCY</code> no longer overrides the concurrency of the runs that <code>qa batch --runs-file</code> redoes, as if <code>--local-concurrency</code> was given.</li>
<li class=""><code>bit_accuracy.on_reference_failed_ci: compare-first-parent</code> goes back up to <code>bit_accuracy.max_parents_depth</code> parents, instead of two at most.</li>
<li class=""><code>bit_accuracy.failed_ci_job_name</code> works again: <code>qa check-bit-accuracy</code> only looks at that job (<code>&lt;job&gt; &lt;subproject&gt;</code> in subprojects).</li>
<li class=""><code>qa check-bit-accuracy</code> counts skipped CI jobs as successful, instead of waiting for them.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration-1">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2026-10#server-and-administration-1" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h3>
<ul>
<li class="">The project's settings (metrics, visualizations, storage...) are no longer replaced by those of whichever branch got new results last: they come from the reference branch (<code>project.reference_branch</code> in <em>qaboard.yaml</em>), or from the project's first results.</li>
<li class="">Upgrading the Helm chart no longer restarts the backend for nothing after a first install (its settings checksum included a generated secret that rendered differently each time).</li>
<li class="">nginx starts on hosts without IPv6, instead of failing on its <code>listen [::]:80</code> line.</li>
<li class="">Repositories whose clone is broken are cloned again, instead of failing until an admin deletes them. The broken clone is only replaced once the new clone succeeded.</li>
<li class="">Tag pushes record the tag's whole name: its first character was cut.</li>
<li class="">Pushes to repositories with files or folders whose name only looks like <em>qaboard.yaml</em> (for example an agent skill folder named <code>qaboard-yaml</code>) no longer fail: only files named exactly <em>qaboard.yaml</em> or <em>qatools.yaml</em> define projects.</li>
<li class="">Jenkins integrations show the status of the builds they trigger when Jenkins' own URL uses another hostname than the integration's <code>build_url</code> (for example a full domain name): checking them failed with a 403 because no credentials matched that hostname in <code>JENKINS_AUTH</code>.</li>
<li class="">Servers outside SIRC no longer show avatars from SIRC's directory for GitLab users without one: set <code>QABOARD_AVATAR_URL</code> to use your own (<a class="" href="https://samsung.github.io/qaboard/docs/deploy#optional-environment-variables">environment variables</a>).</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="security-and-data-safety">Security and data safety<a href="https://samsung.github.io/qaboard/release-notes/2026-10#security-and-data-safety" class="hash-link" aria-label="Direct link to Security and data safety" title="Direct link to Security and data safety" translate="no">​</a></h3>
<ul>
<li class="">Marking a run as failed or deleting it now requires a login.</li>
<li class="">Deleting results no longer deletes the contents of folders that they link to.</li>
<li class="">When a restricted project saves its results in a folder per user (e.g. <code>/algo/outputs/{user}</code>), the project's files are now restricted in every user's folder, not only in the server's.</li>
<li class="">The API <code>qa</code> uses to update batches no longer lets anyone without a login delete runs. <code>qa optimize</code> still replaces its previous best iteration's runs, and only those.</li>
<li class="">When <code>qa</code> fails to update QA-Board, its warning no longer prints your API token (<code>QA_TOKEN</code>).</li>
<li class="">When signing up with a user name or email that is already used, the server answers "already taken" instead of an error that included the password's hash, and no longer writes the password to its logs.</li>
<li class="">Logging in with an empty password is refused, and LDAP logins escape the user name.</li>
<li class="">The server only deletes the git clones it made: it refuses repository paths inside a clone, or that hold other clones.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-09]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2026-09</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2026-09"/>
        <updated>2026-09-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Cap how many runs of a batch use the LSF cluster at the same time, or run batches of short runs on a pool of Dask workers. The server is easier to deploy from scratch, and re-running outputs or tuning on LSF goes through the configured LSF bridge.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">Cap how many runs of a batch use the LSF cluster at the same time, or run batches of short runs on a pool of Dask workers. The server is easier to deploy from scratch, and re-running outputs or tuning on LSF goes through the configured LSF bridge.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q project-integration_Ky7h">Project integration</span><h3 class="title_hdm3">Limit batch concurrency on LSF</h3><p class="text_FLe0">Set runners.lsf.concurrency in qaboard.yaml, or use qa batch --lsf-concurrency 20, so a batch never has more than 20 LSF jobs running at once and doesn't flood the cluster. The default, 0, keeps the previous behavior: no limit.</p><a href="https://samsung.github.io/qaboard/docs/lsf-integration">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q project-integration_Ky7h">Project integration</span><h3 class="title_hdm3">Dask runner</h3><p class="text_FLe0">With qa batch --runner dask, a batch's runs execute on a few long-lived Dask workers started as LSF jobs, with a bounded number of runs in flight. It avoids paying LSF's scheduling overhead for each of many short runs. Install it with pip install "qaboard[dask]".</p><a href="https://samsung.github.io/qaboard/docs/dask-integration">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2026-09#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class="">By default the LSF concurrency limit uses an LSF job array with a slot limit: a new run starts as soon as one ends. Set <code>runners.lsf.concurrency_strategy: waves</code> to send runs in groups that each wait for the previous group to end, if job arrays don't work for you.</li>
<li class="">The Dask runner is configured under <code>runners.dask</code> in <em>qaboard.yaml</em>: <code>concurrency</code> (or <code>--dask-concurrency</code>), the worker jobs' <code>cluster</code> size and memory, and <code>scheduler_address</code> to use a Dask cluster you already run.</li>
<li class="">With <code>--no-wait</code>, the Dask runner sends a small "driver" LSF job that runs the batch, with its own LSF options (<code>runners.dask.driver</code>), and <code>qa batch</code> returns right away.</li>
<li class="">Dask workers' and the driver's logs are saved in the batch directory, under <code>dask/</code>, and each run's output directory gets a <code>log.dask.txt</code>. Stopping a batch from QA-Board also stops its Dask workers.</li>
<li class=""><code>qa save-artifacts</code> and other commands no longer crash with "'NoneType' object is not iterable" in legacy projects whose configuration defines no inputs.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2026-09#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">"Redo" actions on a batch (deleted, failed or all outputs) and tuning batches sent to LSF from the web app now go through the backend's <code>QA_RUNNERS_LSF_BRIDGE</code>, which supports the <code>{user}</code> and <code>{bsub_command}</code> placeholders, instead of a hardcoded SSH host. Set it to use these features with LSF (see <a class="" href="https://samsung.github.io/qaboard/docs/lsf-integration">LSF bridges</a>).</li>
<li class="">The Flower dashboard for Celery now runs from the backend image: there is no separate Flower image to build anymore.</li>
<li class="">The documentation site's image now builds with Docusaurus 3.10.</li>
<li class="">The SIRC deployment's files, including <code>.env.sirc.example</code>, now all live under <code>deployments/sirc/</code>.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="documentation">Documentation<a href="https://samsung.github.io/qaboard/release-notes/2026-09#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class="">New <a class="" href="https://samsung.github.io/qaboard/docs/dask-integration">Dask integration</a> page. The <a class="" href="https://samsung.github.io/qaboard/docs/using-the-qa-cli">CLI docs</a> now list the batch runners (local, LSF, Dask, Celery) and how to limit their concurrency, and the <a class="" href="https://samsung.github.io/qaboard/docs/lsf-integration">LSF page</a> documents <code>--lsf-concurrency</code>.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2026-09#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">Fixed results uploads failing (HTTP 500 on every new output) on servers whose database was created from scratch rather than migrated from an older version.</li>
<li class="">The database container now starts on a fresh, empty volume: its custom configuration is applied only once the database is initialized.</li>
<li class="">Fixed Docker builds that download a CA certificate (<code>CA_CERT_URL</code>) failing when the certificate file already existed.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="notes">Notes<a href="https://samsung.github.io/qaboard/release-notes/2026-09#notes" class="hash-link" aria-label="Direct link to Notes" title="Direct link to Notes" translate="no">​</a></h2>
<ul>
<li class="">The LSF concurrency limit and the Dask runner are in <code>qaboard</code> 1.1, released in October.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-q2]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2026-q2</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2026-q2"/>
        <updated>2026-06-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The image viewer shows TIFF versions of PNG outputs when they exist and compares outputs saved in different formats. Jenkins build statuses update live and survive page refreshes, and shared milestones now have owners and can be filtered by person.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">The image viewer shows TIFF versions of PNG outputs when they exist and compares outputs saved in different formats. Jenkins build statuses update live and survive page refreshes, and shared milestones now have owners and can be filtered by person.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">TIFF versions of images</h3><p class="text_FLe0">When an output has both image.png and image.tiff, the image viewer shows the TIFF. When comparing to a reference saved in another format, each side falls back to the file it has: TIFF, PNG or the older BMP.</p><a href="https://samsung.github.io/qaboard/docs/visualizations">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Live Jenkins build status</h3><p class="text_FLe0">After you trigger a Jenkins build from the commit page, its status tag now updates on its own (queued, running, then the result), and it is still there when you refresh the page or come back to the commit in the same browser.</p><a href="https://samsung.github.io/qaboard/docs/jenkins-integration">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Milestone owners</h3><p class="text_FLe0">Shared milestones remember who created them and the commit's author. Filter milestones by their names, and only a milestone's owners can edit or delete it.</p><a href="https://samsung.github.io/qaboard/docs/references-and-milestones">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2026-q2#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">Pixel values shown when you hover an image are now read from the file actually displayed (the TIFF when it is used), and always match the pixel under the cursor. They could be off by one pixel before, especially at the image's edges.</li>
<li class="">In the "Output Files" view, opening a TIFF or a PNG also falls back to the other format on the side (new or reference) that doesn't have it.</li>
<li class="">Build status icons are clearer: a clock while a build is queued or pending, a spinning icon while it runs, and a pause icon only for blocked or stuck builds.</li>
<li class="">Integration links inside sub-menus are now checked too, so broken links show up there like in top-level menus.</li>
<li class="">Saving, editing or deleting a shared milestone now requires being logged in. Milestones saved before this change have no owner: any logged-in user can still edit them, and becomes an owner by doing so. Milestones show their commit's author as a tag.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2026-q2#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">Added <code>services/vips</code>, a small Docker image with the libvips command line tools, to convert PNG outputs to TIFF.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2026-q2#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">The loading spinner of the image viewer now disappears once the images are loaded, including for the reference image and for images already in the browser's cache.</li>
<li class="">Jenkins builds triggered from the commit page are now polled for their status. Before, their status could stay stuck after the trigger.</li>
<li class="">Integrations with the same name in different menus no longer share their status.</li>
<li class="">When <code>qa</code> reports a commit the server can't find, the server answers with a clear error instead of crashing.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-03]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2026-03</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2026-03"/>
        <updated>2026-03-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Synced zoom and pan in the image viewer stays smooth on pages with many images, and the server can track GitHub repositories. Every deployment now runs the same code: site-specific settings moved to compose overlays and to site packages for the qa CLI.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">Synced zoom and pan in the image viewer stays smooth on pages with many images, and the server can track GitHub repositories. Every deployment now runs the same code: site-specific settings moved to compose overlays and to site packages for the qa CLI.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Smoother synced zoom and pan</h3><p class="text_FLe0">On pages with many images, zooming or panning one image no longer slows down the page: only the images on screen follow along, and the others catch up instantly when you scroll to them. Images that load late open at the current zoom and position.</p><a href="https://samsung.github.io/qaboard/docs/visualizations">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q admins_lbEZ">Admins</span><h3 class="title_hdm3">GitHub repositories</h3><p class="text_FLe0">Besides GitLab, the server can now follow projects hosted on GitHub or GitHub Enterprise: it receives push events on /webhook/github, clones the repositories with GITHUB_ACCESS_TOKEN and shows GitHub avatars. Commit statuses and GitHub Actions are not supported yet.</p><a href="https://samsung.github.io/qaboard/docs/project-init">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q admins_lbEZ">Admins</span><h3 class="title_hdm3">One codebase for every site</h3><p class="text_FLe0">The base docker-compose.yml now has open-source defaults, and each site adds its own settings with an overlay in deployments/, for example deployments/sirc/sirc.yml. Copy deployments/example.yml to describe your own site.</p><a href="https://samsung.github.io/qaboard/docs/deploy">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Site packages for the qa CLI</h3><p class="text_FLe0">Install qaboard[sirc] to get your site's defaults (server URL, secrets location, internal dependencies) without setting environment variables. Environment variables still override them.</p><a href="https://samsung.github.io/qaboard/docs/installation">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2026-03#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">The visualizations section of the commit page's controls panel shows up right away, instead of waiting for every output's file list to load.</li>
<li class="">Avatars from any git server now go through QA-Board, so they are no longer blocked as mixed content when QA-Board is served over HTTPS.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2026-03#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class="">Without <code>QABOARD_HOST</code> or a site package, <code>qa</code> now connects to <code>http://localhost:5151</code>, the default local server. It used to try an internal SIRC server. At SIRC, install <code>qaboard[sirc]</code> (see <a class="" href="https://samsung.github.io/qaboard/docs/installation">Client Installation</a>).</li>
<li class="">Removed <code>qaboard.on_vdi</code> and <code>qaboard.on_lsf</code>, which detected SIRC hosts from the hostname: update project code that imports them. Site packages now provide site-specific settings.</li>
<li class="">An internal SIRC dependency is now installed only with <code>qaboard[sirc]</code>, so <code>pip install qaboard</code> works outside SIRC.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2026-03#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">Deploy with your site's overlay on top of the base files, e.g. <code>docker compose -f docker-compose.yml -f production.yml -f deployments/sirc/sirc.yml up -d</code>. Site-specific nginx configuration, volumes and services (fluentd, metabase...) moved to <code>deployments/&lt;site&gt;/</code>.</li>
<li class="">The Docker images build with no arguments by default. Behind a proxy, pass the <code>PROXY_URL</code>, <code>CA_CERT_URL</code> and <code>NO_PROXY</code> build args, and <code>QABOARD_EXTRA</code> to include a site package in the backend image.</li>
<li class="">Credentials for LDAP, Sentry and PostHog are read from a <code>.env</code> file instead of the compose files. <code>.env.sirc.example</code> lists the SIRC variables.</li>
<li class="">The web app now gets its settings from the server when it loads (image servers, login type, Sentry and PostHog keys, path mappings, docs URL), so changing them no longer requires rebuilding the web app image.</li>
<li class=""><code>QABOARD_IMAGE_SERVERS</code> picks the IIIF image server per file extension, e.g. one server for raw images and Cantaloupe for the rest.</li>
<li class=""><code>QABOARD_PATH_MAPPINGS</code> (a JSON list of Windows/Linux path pairs) replaces the hardcoded mappings used to convert paths between Windows shares and Linux.</li>
<li class=""><code>QABOARD_TUNING_RUNNER</code> chooses how tuning batches started from the web app run: <code>local</code> (default), <code>celery</code> or <code>lsf</code>. <code>QABOARD_DEFAULT_USER</code> sets the user that owns their outputs. See <a class="" href="https://samsung.github.io/qaboard/docs/tuning-from-the-webapp">tuning from the web app</a>.</li>
<li class=""><code>GITLAB_HOST</code> and <code>GITLAB_ACCESS_TOKEN</code> are no longer required to start the backend: without a token, repositories are cloned anonymously.</li>
<li class="">The backend now gives up after 20 seconds when the database is unreachable, instead of hanging silently.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="documentation">Documentation<a href="https://samsung.github.io/qaboard/release-notes/2026-03#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class="">The <a class="" href="https://samsung.github.io/qaboard/docs/deploy">server</a> and <a class="" href="https://samsung.github.io/qaboard/docs/installation">client installation</a> docs describe the compose overlays and site packages. <code>MIGRATION.md</code>, at the root of the repository, lists the changes to make when upgrading an existing deployment.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2026-03#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">Opening another page now always starts images at the default zoom, even when the previous page had images synced with the same key.</li>
<li class="">Fixed crashes of the backend when several people read pixel values on the same image at the same time. Its image cache, which had been turned off because of them, is back on, so pixel values show up faster.</li>
<li class="">The visualizations panel now resets when you switch to another commit or batch, keeps your show/hide choices when the project configuration reloads, and lists the options found in all output files (only the first 1000 files were used).</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-02]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2026-02</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2026-02"/>
        <updated>2026-02-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Image and text viewers no longer react to their keyboard shortcuts while you type or use Ctrl/Cmd shortcuts, and the storage quota link works again.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">Image and text viewers no longer react to their keyboard shortcuts while you type or use Ctrl/Cmd shortcuts, and the storage quota link works again.</p></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2026-02#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">Added a database index on outputs (<code>idx_outputs_batch_user_storage</code>) that speeds up the storage quota dashboard. New databases get it automatically; on an existing database, create it by hand.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2026-02#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">The image and text viewers' keyboard shortcuts (e.g. <code>t</code> to toggle between new and reference) no longer fire while you type in a text area or an editable field, or when you press Ctrl, Cmd or Alt combinations such as Ctrl+C.</li>
<li class="">The "Quota" entry in the commit list's menu opens the current storage dashboard again. It pointed to a dashboard that was deleted.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-01]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2026-01</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2026-01"/>
        <updated>2026-01-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A fix for triggering Jenkins builds from the web app.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">A fix for triggering Jenkins builds from the web app.</p></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2026-01#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">Triggering a <a class="" href="https://samsung.github.io/qaboard/docs/jenkins-integration">Jenkins build</a> from the web app no longer fails with an error when Jenkins's response about the queued build can't be read.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-q4]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2025-q4</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2025-q4"/>
        <updated>2025-12-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Use -- to pass arguments to your own code with qa run, qa postprocess and qa batch, and save your custom batches in the web app with Ctrl-S. The backend image moved to Debian trixie and Python 3.13.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">Use -- to pass arguments to your own code with qa run, qa postprocess and qa batch, and save your custom batches in the web app with Ctrl-S. The backend image moved to Debian trixie and Python 3.13.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Forward arguments with --</h3><p class="text_FLe0">Everything after -- on the command line is passed as-is to your code, for example qa batch my-batch -- --my-flag. Late qa options like qa batch my-batch --list keep working.</p><a href="https://samsung.github.io/qaboard/docs/using-the-qa-cli">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Ctrl-S to save custom batches</h3><p class="text_FLe0">In the web app's editor for custom batches, used by tuning experiments, press Ctrl-S (Cmd-S on macOS) to save your changes instead of clicking "Update Batches".</p><a href="https://samsung.github.io/qaboard/docs/tuning-from-the-webapp">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2025-q4#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class=""><code>QA_BATCH_FILTER_INPUT_REGEX</code> now matches anywhere in the input path, and ignores a leading <code>^</code>.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2025-q4#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">The backend image is now based on Debian trixie with Python 3.13, which also brings fixes for the XML libraries used by SAML login.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2025-q4#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">On Windows, the CLI uses Git for Windows' <code>ssh</code> when it is installed to fix the permissions of outputs on network storage, since the built-in <code>ssh</code> can't read keys from network paths. Paths with spaces are quoted correctly.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-q3]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2025-q3</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2025-q3"/>
        <updated>2025-09-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Copy a run's configuration in one click, ready to paste in a tuning experiment, and qa batch accepts several batch names at once. Commit pages use less memory on the server.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">Copy a run's configuration in one click, ready to paste in a tuning experiment, and qa batch accepts several batch names at once. Commit pages use less memory on the server.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Copy configurations, also in tuning format</h3><p class="text_FLe0">Hover a run's configuration tags to copy one item, the full configuration, or the full configuration in the format the tuning form expects.</p></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Paste parameters into the tuning form</h3><p class="text_FLe0">When you paste key=value parameter lines into the tuning form's editor, including multi-line matrices, they are converted to the tuning format for you.</p><a href="https://samsung.github.io/qaboard/docs/tuning-from-the-webapp">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Several batches in one qa batch</h3><p class="text_FLe0">Run qa batch first-batch second-batch instead of repeating --batch for each one. Options that start with a dash after the batch names are still forwarded to qa run.</p><a href="https://samsung.github.io/qaboard/docs/batches-running-on-multiple-inputs">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2025-q3#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">The batch selector marks milestone batches with a star, and works better with the keyboard.</li>
<li class="">On commits with many outputs, the controls panel shows how many outputs it has read options from, with a "Refresh Options" button to update them all.</li>
<li class="">The "Delete All Runs" menu item says more clearly that it deletes the runs in all other projects for this commit.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2025-q3#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class=""><code>qa batch</code> fails with a clear error when a batch in <code>batches.yaml</code> is not a mapping (with <code>inputs</code>, <code>configurations</code>...), and warns about batches with an empty definition.</li>
<li class="">Set <code>QA_BATCH_FILTER_INPUT_REGEX</code> to only run the inputs of a batch whose path matches a regular expression.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2025-q3#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">Commit pages use less memory on the server, and a commit that is missing from the database returns a clean 404.</li>
<li class="">The nginx image builds again: it now uses the Debian archive since Debian Buster reached its end of life.</li>
<li class="">The backend image builds its XML libraries from source to avoid library version mismatches. If SAML support can't load, the backend now starts anyway and logs a warning.</li>
<li class="">For contributors, <code>development.yml</code> runs the backend with <code>uv run</code> and as your own user.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="documentation">Documentation<a href="https://samsung.github.io/qaboard/release-notes/2025-q3#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class="">The <a class="" href="https://samsung.github.io/qaboard/docs/batches-running-on-multiple-inputs">batches</a> page uses the new <code>qa batch first-batch second-batch</code> syntax.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2025-q3#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">Fixed "Copy reference image to the clipboard", which copied the new image instead of the reference.</li>
<li class="">Fixed the size of the current region of interest in the image viewer.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-06]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2025-06</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2025-06"/>
        <updated>2025-06-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The commit page has a new controls panel to pick visualizations, metrics and sorting, and options like the frame to show can now be synced across all outputs or set per output. Input types can have their own runner settings.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">The commit page has a new controls panel to pick visualizations, metrics and sorting, and options like the frame to show can now be synced across all outputs or set per output. Input types can have their own runner settings.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">A controls panel on the commit page</h3><p class="text_FLe0">A panel on the right side of the commit page gathers the viewer controls: which visualizations to show, with a filter box, the image diff toggle, sorting and the metrics to display. Collapse it with its arrow button when you need the room.</p><a href="https://samsung.github.io/qaboard/docs/visualizations">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Synced or per-output visualization options</h3><p class="text_FLe0">Options that come from visualization paths, like :frame, default to synced: one control in the panel drives every output. Unsync an option to pick its value separately in each output card.</p><a href="https://samsung.github.io/qaboard/docs/visualizations">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q project-integration_Ky7h">Project integration</span><h3 class="title_hdm3">Runner settings per input type</h3><p class="text_FLe0">Input types in qaboard.yaml can now have their own runner settings under runners, for instance a different LSF queue for each type of input. Settings in a batch still win, and flags you pass to qa batch win over both.</p><a href="https://samsung.github.io/qaboard/docs/inputs">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Searchable batch selector</h3><p class="text_FLe0">The batch selector in the commit navbar is now a search box. Find a batch by name, by the user who launched it, or with words like failed, running or tuning.</p></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2025-06#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">The image viewer's filters have a new panel with value displays, a reset button and a new Sharpen filter, next to Brightness, Contrast and Gamma.</li>
<li class="">In the bit-accuracy viewer, hover a file's size to download the new or the reference version of the file.</li>
<li class="">The filter box of the controls panel also filters the list of metrics.</li>
<li class="">Redesigned sidebar, with a user menu that shows who you are logged in as and lets you sign out.</li>
<li class="">You can search the sidebar's list of <a class="" href="https://samsung.github.io/qaboard/docs/triggering-third-party-tools">integrations</a>, and menus keep their state when you close and reopen them.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2025-06#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class="">Runner settings are merged in this order, each winning over the previous: the <code>runners</code> section of <code>qaboard.yaml</code>, the input type's <code>runners</code>, the batch's runner settings, then the flags you pass explicitly to <code>qa batch</code> such as <code>--lsf-queue</code> or <code>--local-concurrency</code>.</li>
<li class=""><code>--local-timeout</code> and <code>runners.local.timeout</code> now set the timeout of local runs, not only <code>QA_BATCH_TIMEOUT</code>.</li>
<li class="">Removed <code>qa batch --lsf-fast-queue</code>: LSF jobs always use the regular queue.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="documentation">Documentation<a href="https://samsung.github.io/qaboard/release-notes/2025-06#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class="">The <a class="" href="https://samsung.github.io/qaboard/docs/inputs">inputs</a> page shows how to set runner settings per input type.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2025-06#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">Fixed the CLI when it is embedded in a C++ program and has no command-line arguments.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-05]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2025-05</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2025-05"/>
        <updated>2025-05-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[qaboard 1.0.3 is packaged with a modern pyproject.toml, and the backend's dependencies are managed with uv. The image viewer stops flagging images whose pixels are identical as different.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><span class="version_NYcp">qaboard v<!-- -->1.0.3</span><p class="description_UTc_">qaboard 1.0.3 is packaged with a modern pyproject.toml, and the backend's dependencies are managed with uv. The image viewer stops flagging images whose pixels are identical as different.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Images compared by their pixels</h3><p class="text_FLe0">When the outputs manifest has a hash of an image's pixel values, the image viewer uses it to decide whether the new and reference images are the same. Images that only differ in their metadata are no longer shown as changed.</p><a href="https://samsung.github.io/qaboard/docs/visualizations">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q project-integration_Ky7h">Project integration</span><h3 class="title_hdm3">qaboard 1.0.3, built with pyproject.toml</h3><p class="text_FLe0">The qaboard package is now defined in pyproject.toml instead of setup.py. Developers install it with uv sync --extra dev, and the backend's dependencies are locked with uv instead of poetry.</p><a href="https://samsung.github.io/qaboard/docs/installation">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2025-05#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">Hover the colored dot of an automatic region of interest to see its diff value.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2025-05#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class="">The deprecated <code>qatools</code> package still ships for older scripts, and importing it now shows a deprecation warning: use <code>qaboard</code> instead.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2025-05#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">The backend image installs its dependencies with uv from <code>backend/uv.lock</code>.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-04]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2025-04</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2025-04"/>
        <updated>2025-04-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[You can find a run by its ID in the commit page's search box, and qa batch now stops before flooding QA-Board with more than 1,000 runs at once.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">You can find a run by its ID in the commit page's search box, and qa batch now stops before flooding QA-Board with more than 1,000 runs at once.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Search runs by ID</h3><p class="text_FLe0">Type id:1234 in the commit page's filter box to show only the run with that ID, for instance when a colleague or a log gives you a run ID.</p></div><div class="card_ukht"><span class="audience_eP3Q project-integration_Ky7h">Project integration</span><h3 class="title_hdm3">A limit of 1,000 runs per qa batch</h3><p class="text_FLe0">qa batch now fails when it would send more than 1,000 runs at once, which is usually a mistake in a batch definition. Set QA_BATCH_ALLOW_MANY_RUNS=1 when you really need more, or use qa --offline batch to run without reporting to QA-Board.</p><a href="https://samsung.github.io/qaboard/docs/batches-running-on-multiple-inputs">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2025-04#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">The server updates the "latest results" time of commits and projects at most every few seconds, which avoids database lock contention when many runs report their results together.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2025-04#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class=""><code>qa run</code> no longer crashes when writing the outputs manifest fails, it only warns.</li>
<li class="">Fixed <code>qa optimize</code> crashing when it sets <code>QA_OPTIM_DIR</code>.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-03]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2025-03</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2025-03"/>
        <updated>2025-03-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[You can copy the new, reference or diff image straight to the clipboard to paste it in a chat or a report. Admins get a backend tuned for heavy load, and production logs can go to a central collector.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">You can copy the new, reference or diff image straight to the clipboard to paste it in a chat or a report. Admins get a backend tuned for heavy load, and production logs can go to a central collector.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Copy images to the clipboard</h3><p class="text_FLe0">The image viewer has a new Copy button. Click it to copy the new image, or hover it to copy the reference or the diff image instead. If your browser can't write images to the clipboard, the image is downloaded.</p><a href="https://samsung.github.io/qaboard/docs/visualizations">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q admins_lbEZ">Admins</span><h3 class="title_hdm3">A backend tuned for heavy load</h3><p class="text_FLe0">uWSGI workers now use threads, a larger request queue and longer timeouts, and are recycled when they use more than 4GB of memory. Fewer processes and smaller database connection pools keep PostgreSQL from running out of connections.</p></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2025-03#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">The image viewer's zoom controls fade out faster, and the sidebar's menus close sooner after the mouse leaves them.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2025-03#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">Production deployments can forward the logs of the backend, database and redis containers to a fluentd log collector.</li>
<li class="">PostgreSQL now writes its logs to files and logs connections and disconnections, and accepts up to 200 connections.</li>
<li class="">Larger request headers are accepted (<code>buffer-size</code> 65535), and big uploads are buffered so they don't block a worker.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2025-03#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">Fixed the diff image after the upgrade of the image viewer library.</li>
<li class="">HTML and Plotly viewers no longer stay blank when a file fails to load.</li>
<li class="">Fixed the visualization options (such as the frame selector) sometimes not appearing after the move to React 18.</li>
<li class="">Fixed a server error on some commit pages.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-02]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2025-02</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2025-02"/>
        <updated>2025-02-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Commit pages load faster, especially for big batches and for commits that don't exist, and their errors now say what went wrong. The web app moved to React 18 and newer UI libraries.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">Commit pages load faster, especially for big batches and for commits that don't exist, and their errors now say what went wrong. The web app moved to React 18 and newer UI libraries.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Faster commit pages</h3><p class="text_FLe0">The server now caches slow lookups like the list of users in redis, shared by all its workers, and the web app matches each run with its reference run much faster. Large commits open noticeably quicker.</p></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Clearer errors on the commit page</h3><p class="text_FLe0">Hover the red "Error" tag in the commit navbar to see the server's message. It also tells you whether to check the commit and project you asked for, or to contact the QA-Board admins.</p></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2025-02#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">Output cards keep a minimum height while they load, so scrolling a long list no longer starts loading too many images at once.</li>
<li class="">The reference image's label always shows the image size.</li>
<li class="">Upgraded to React 18, Redux 5 and recent Blueprint and Plotly versions.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2025-02#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">The backend now uses a redis service as a shared cache, with <code>REDIS_HOST</code> and <code>REDIS_PORT</code> (included in <code>docker-compose.yml</code>). Each worker warms the cache when it starts.</li>
<li class="">Asking for a full commit hash that has no results now fails right away with a 404, instead of a slow search.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2025-02#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">Fixed an error when hovering an image while the diff image is hidden.</li>
<li class="">Fixed a server error when a run was reported without any extra data.</li>
<li class="">Fixed small display issues in the metrics, tables and tuning forms after the upgrade.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-01]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2025-01</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2025-01"/>
        <updated>2025-01-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[When you compare images, the diff image now shows the same crosshair as the new and reference images. The CLI can authenticate to the API with a QA_TOKEN environment variable.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">When you compare images, the diff image now shows the same crosshair as the new and reference images. The CLI can authenticate to the API with a QA_TOKEN environment variable.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Synced crosshair on the diff image</h3><p class="text_FLe0">Hovering over the new or reference image now draws the crosshair at the same spot on the diff image too, so you can see where a difference is. It goes away when the mouse leaves the image.</p><a href="https://samsung.github.io/qaboard/docs/visualizations">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">API token from QA_TOKEN</h3><p class="text_FLe0">When the QA_TOKEN environment variable is set, the qa CLI and qaboard.api send it to the QA-Board API as a bearer token, which lets scripts and CI jobs call the API as a logged-in user.</p></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2025-01#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">The crosshair stays in sync with the diff image while you zoom.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2025-01#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">Fixed videos that never started playing when the browser had them in its cache.</li>
<li class="">Fixed the image viewer when an output has no reference to compare to.</li>
<li class=""><code>qa check-bit-accuracy</code> now looks for outputs on the platform you selected with <code>--platform</code> (or the batch's platform) instead of always the default platform.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2024-q4]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2024-q4</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2024-q4"/>
        <updated>2024-12-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Scripts can call the API with personal tokens, the video viewer keeps both videos in sync and shows the time of each, and runs remember which batch they came from. Image comparisons flag different sizes and failed tiles.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">Scripts can call the API with personal tokens, the video viewer keeps both videos in sync and shows the time of each, and runs remember which batch they came from. Image comparisons flag different sizes and failed tiles.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">API tokens</h3><p class="text_FLe0">Logged-in users can create a personal API token with a POST to /api/v1/user/token/, then authenticate scripts with an Authorization Bearer header or a token URL parameter.</p><a href="https://samsung.github.io/qaboard/docs/installation">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Synced video comparisons</h3><p class="text_FLe0">The video viewer keeps the new and reference videos in sync, re-syncs when you pause, and shows the current time of each video and how far apart they are.</p></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Batch names on runs</h3><p class="text_FLe0">Runs now record the name of the batch they were started from. It is shown in the run's menu, and you can filter runs by it.</p></div><div class="card_ukht"><span class="audience_eP3Q project-integration_Ky7h">Project integration</span><h3 class="title_hdm3">Metric descriptions</h3><p class="text_FLe0">Metrics in metrics.yaml can have a description, shown in a tooltip on the metric's header.</p><a href="https://samsung.github.io/qaboard/docs/computing-quantitative-metrics">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2024-q4#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">The image viewer shows both images' dimensions when they differ, and warns when some tiles fail to load.</li>
<li class="">Logs link directly to the LSF log when LSF killed the run.</li>
<li class="">Clearer error messages when tuning is not possible, and when an export folder is not writable or has locked-down permissions.</li>
<li class="">Style and help text improvements.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2024-q4#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class=""><code>exclude</code> filters can match the input path relative to the database with <code>rel_input_path</code>.</li>
<li class=""><code>QA_BATCH_TIMEOUT</code> sets the timeout of local runs, and <code>QA_BATCH_QUIET</code> stops <code>qa batch</code> from printing each run's command and output directory.</li>
<li class=""><code>qa check-bit-accuracy</code> sets <code>QA_BATCH</code>, so batch-only metadata logic behaves as in <code>qa batch</code>.</li>
<li class="">When the server cannot report run statuses, <code>qa batch</code> warns and falls back to reading the output folders.</li>
<li class="">Fixed batch aliases, batches named <code>matrix</code>, and <code>*</code> input patterns.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2024-q4#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">The local sign-up endpoint is enabled again, unless you set <code>QABOARD_DISABLE_SIGNUP=True</code>.</li>
<li class="">API tokens are stored in a new table (with a migration).</li>
<li class="">Batch summaries are counted in the database, using less memory, and file exports are faster.</li>
<li class="">Output folders created by the server are now writable by all users (umask 0), avoiding permission issues when runs write to them.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2024-q3]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2024-q3</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2024-q3"/>
        <updated>2024-09-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Admins can restrict access to specific projects or namespaces, exports let you choose how and where files go, and batches can be selected with wildcards. The qa CLI starts faster and the docs moved to Docusaurus 3.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">Admins can restrict access to specific projects or namespaces, exports let you choose how and where files go, and batches can be selected with wildcards. The qa CLI starts faster and the docs moved to Docusaurus 3.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q admins_lbEZ">Admins</span><h3 class="title_hdm3">Per-project access control</h3><p class="text_FLe0">The users restriction YAML has a new projects section to allow only some users into a project or a whole namespace. Sign-in rules move under a login key. Users now stay signed in for 180 days.</p><a href="https://samsung.github.io/qaboard/docs/backend-admin/user-management">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Better file exports</h3><p class="text_FLe0">Exporting results lets you choose between links and copies and set the destination folder on the shared storage. It warns about invalid file patterns, and reports errors and the number of exported files clearly.</p></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Wildcards for batches</h3><p class="text_FLe0">qa batch 'batch-*' runs every matching batch, and wildcards also work in aliases and pipelines.</p><a href="https://samsung.github.io/qaboard/docs/batches-running-on-multiple-inputs">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Synced cursor in the image viewer</h3><p class="text_FLe0">When comparing images, a cross shows on the other image where your mouse is, to compare the same pixels.</p></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2024-q3#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">The tuning form has a bigger editor, a nicer layout, and defaults to the <code>linux</code> platform.</li>
<li class="">The web app checks your session with the server instead of trusting what the browser remembers.</li>
<li class="">Errors about missing project permissions are shown on the commits list.</li>
<li class="">Better contrast, and tooltips are back.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2024-q3#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class=""><code>qa</code> starts faster: imports are delayed, and it no longer makes a network request on every call to check for updates.</li>
<li class=""><code>qa batch</code> accepts several <code>--tuning</code> and <code>--tuning-filepath</code> options, merged together. String or list values go into a <code>_config</code> key whose items are appended to <code>context.configs</code>.</li>
<li class="">Batch YAML files can set default <code>platform</code> and <code>configurations</code> for all their batches, like <code>database</code>.</li>
<li class="">Batches without an <code>inputs</code> key match more inputs, including the database folder itself, and empty batch definitions now get a warning.</li>
<li class="">Fixed duplicated inputs in batches.</li>
<li class="">Fixed unstable output directories when redoing runs started from the web app.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2024-q3#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">The docs explain how to develop with docker, and <code>/docs</code> on the server now leads to the docs.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="documentation">Documentation<a href="https://samsung.github.io/qaboard/release-notes/2024-q3#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class="">The docs website moved to Docusaurus 3, and search results link correctly when the docs are served by the web app.</li>
<li class="">The <a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/user-management">user management</a> page documents project access restrictions.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2024-q2]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2024-q2</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2024-q2"/>
        <updated>2024-06-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A quiet quarter: image comparisons fall back to BMP references when a PNG is missing, the image viewer shows when it is still loading, and tuning from the web app handles single quotes.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">A quiet quarter: image comparisons fall back to BMP references when a PNG is missing, the image viewer shows when it is still loading, and tuning from the web app handles single quotes.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Compare PNG outputs with older BMP references</h3><p class="text_FLe0">When a run outputs a PNG image but the reference only has the same image as BMP, the file and image viewers now compare the two, and label which file is shown on each side.</p></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2024-q2#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">The image viewer shows a spinner until both images are fully loaded.</li>
<li class="">Plotly figures are shown side by side with the reference by default.</li>
<li class="">Integrations can use the reference commit as a variable (<code>ref_commit</code>).</li>
<li class="">Fixed the histogram when there is no reference, with clearer legends.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2024-q2#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class="">Tuning parameters and configurations containing single quotes now work when tuning from the web app.</li>
<li class="">In batch matrices, values that are valid JSON (lists, objects...) are now parsed instead of being kept as strings.</li>
<li class="">GitLab commit statuses are retried a few times before giving up.</li>
<li class=""><code>qa check-bit-accuracy</code> stops early when nothing was compared.</li>
<li class="">Fixed <code>--reference-label</code> in some cases, and Windows UNC paths when computing output directories.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2024-q1]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2024-q1</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2024-q1"/>
        <updated>2024-03-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The integrations menu got nested items, per-batch configurations and more variables, and webhooks can open a page in response. The file viewer can filter on differing or matching files, and the web app moved to Blueprint 5.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">The integrations menu got nested items, per-batch configurations and more variables, and webhooks can open a page in response. The file viewer can filter on differing or matching files, and the web app moved to Blueprint 5.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q project-integration_Ky7h">Project integration</span><h3 class="title_hdm3">Richer integrations menu</h3><p class="text_FLe0">Integrations in qaboard.yaml can nest items with sub, appear directly in the sidebar with in_menu: false, and use variables for the selected batches, filters and logged-in user. Webhooks can return a url to show, and open it automatically with open: true.</p><a href="https://samsung.github.io/qaboard/docs/triggering-third-party-tools">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Filter files by comparison status</h3><p class="text_FLe0">In the file and bit-accuracy viewer, filter with diff:name or match:name to only show files that differ from, or match, the reference. A new "Hide runs without files" switch hides runs where every file is filtered out.</p></div><div class="card_ukht"><span class="audience_eP3Q project-integration_Ky7h">Project integration</span><h3 class="title_hdm3">Filter inputs by path</h3><p class="text_FLe0">The only and exclude filters of batches can match the absolute input path with an input_path key, alongside input metadata.</p><a href="https://samsung.github.io/qaboard/docs/metadata-integration-external-databases">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2024-q1#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">Upgraded the UI toolkit to Blueprint 5, with refreshed tooltips, popovers and notifications.</li>
<li class="">Integrations now come from the selected batch's configuration when it has its own, show their errors more clearly, and appear on the commit index page again.</li>
<li class="">Metric tags are clearer, shown as compound tags.</li>
<li class="">Configuration differences with nested items are now displayed correctly.</li>
<li class="">The file viewer has an icon for PNG files, says when there is no reference, and collapsing/expanding/selecting files works again.</li>
<li class="">Disabled the image viewer's buggy full-page button.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2024-q1#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class="">Input metadata keys starting with <code>_</code> are no longer stored with runs.</li>
<li class="">Fixed bit-accuracy checks wrongly falling back to plain file comparisons.</li>
<li class="">Fixed permissions of artifact folders created from Windows.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2024-q1#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">Backend workers no longer restart all at the same time.</li>
<li class="">Exports name crops better, and no longer strip more characters than intended from file names.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2024-q1#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">Fixed errors when users have no email.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2023-q4]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2023-q4</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2023-q4"/>
        <updated>2023-12-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Admins can restrict sign-in to a list of users or groups, and projects spread over many repositories can share one templated configuration. Runs are matched with the reference more accurately, and output menus show compute times and the reference's directory.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">Admins can restrict sign-in to a list of users or groups, and projects spread over many repositories can share one templated configuration. Runs are matched with the reference more accurately, and output menus show compute times and the reference's directory.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q admins_lbEZ">Admins</span><h3 class="title_hdm3">Restrict who can sign in</h3><p class="text_FLe0">With QABOARD_LOGIN_RESTRICTED=true and a YAML file set in QABOARD_LOGIN_RESTRICTED_YAML, only listed users can sign in, matched by user name, email or any attribute from the authentication provider. User details from the provider are now saved on each login.</p><a href="https://samsung.github.io/qaboard/docs/backend-admin/user-management">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q project-integration_Ky7h">Project integration</span><h3 class="title_hdm3">Shared configuration across repositories</h3><p class="text_FLe0">project.name and project.url can use {root_path} and {project_path} placeholders, so many repositories can include the same qaboard.yaml. Submodules can set storage.artifacts.subproject to keep their artifacts organized.</p><a href="https://samsung.github.io/qaboard/docs/monorepo-subprojects">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">More accurate run matching</h3><p class="text_FLe0">When comparing with a reference, runs are matched by input database and path, and still by input path alone when databases differ. Exports name files after the database when a batch mixes several.</p></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2023-q4#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">The output menu shows the run's compute time (for example "1h2min3s"), and offers to copy or open the reference's output directory, in titled sections.</li>
<li class="">The date range filter no longer needs both a start and an end date.</li>
<li class="">Deleting several batches skips milestones and batches that no longer exist.</li>
<li class="">Tuning warnings are shown as callouts, and more errors are displayed instead of failing silently.</li>
<li class="">Fixed state issues when the URL contains encoded characters.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2023-q4#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class=""><code>qa check-bit-accuracy</code> compares RAW and HEX images by their attributes and pixel data, and warns and falls back to file hashes when attributes are missing.</li>
<li class="">Batches can change labels while their runs are ongoing.</li>
<li class="">Fixed submodule projects that used their parent's repository, and errors when LSF jobs had already finished.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2023-q4#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">Git pushes no longer create commits ahead of time, which bloated the database of monorepos with hundreds of projects. Commits are recorded with their configuration and metrics when their first batch is posted.</li>
<li class="">New projects work whether their default branch is <code>main</code> or <code>master</code>.</li>
<li class="">Supports GitLab 16 sign-in.</li>
<li class="">Database JSON columns now use JSONB (with a migration).</li>
<li class="">The web app can report errors to Sentry with source maps and send product analytics to PostHog. Both are optional, enabled with build arguments.</li>
<li class="">pgAdmin is served under <code>/pgadmin4/</code>, and Flower can display pickled task data.</li>
<li class="">The docs and the dev setup now use <code>docker compose</code> instead of <code>docker-compose</code>.</li>
<li class="">Fixed race conditions in the image pixel API and when creating inputs, and errors when deleting the same run twice.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="documentation">Documentation<a href="https://samsung.github.io/qaboard/release-notes/2023-q4#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class="">New <a class="" href="https://samsung.github.io/qaboard/docs/backend-admin/user-management">user management</a> page.</li>
<li class="">Expanded <a class="" href="https://samsung.github.io/qaboard/docs/monorepo-subprojects">monorepo and multi-repo</a> docs, input types in <a class="" href="https://samsung.github.io/qaboard/docs/inputs">inputs</a>, and how to <a class="" href="https://samsung.github.io/qaboard/docs/debugging-runs-with-an-IDE">debug runs</a>.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2023-q3]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2023-q3</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2023-q3"/>
        <updated>2023-09-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[QA-Board servers can now authenticate users with single sign-on (SAML) and require a login to see projects. Interrupted runs show as failed, and comparisons prefer reference runs on the same input.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">QA-Board servers can now authenticate users with single sign-on (SAML) and require a login to see projects. Interrupted runs show as failed, and comparisons prefer reference runs on the same input.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q admins_lbEZ">Admins</span><h3 class="title_hdm3">Single sign-on with SAML</h3><p class="text_FLe0">Besides local accounts and LDAP, users can now sign in through a SAML identity provider. Choose the method with QABOARD_LOGIN_TYPE (LOCAL, LDAP or SAML) and configure SAML with the QABOARD_SAML_* variables.</p><a href="https://samsung.github.io/qaboard/docs/backend-admin/user-management">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q admins_lbEZ">Admins</span><h3 class="title_hdm3">Require a login</h3><p class="text_FLe0">Set QABOARD_LOGIN_REQUIRED=true to block anonymous users: they must sign in before opening a project.</p><a href="https://samsung.github.io/qaboard/docs/backend-admin/user-management">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2023-q3#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">When matching runs with the reference, the web app and exports now prefer reference runs with the same input path.</li>
<li class="">Stopped batches now mark their interrupted runs as failed, with finer-grained statuses.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2023-q3#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class=""><code>qa batch --action-on-existing skip</code> no longer skips runs that are still pending: it waits for them instead.</li>
<li class="">The LSF runner no longer uses <code>fast_queue</code>: jobs always go to the configured <code>queue</code>.</li>
<li class="">Absolute input paths are resolved through symlinks.</li>
<li class="">The package now depends on <code>scikit-learn</code> instead of the deprecated <code>sklearn</code> name.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2023-q3#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">The public sign-up API endpoint is disabled, to prevent unauthorized users from creating accounts.</li>
<li class="">The login settings are baked into the web app image when it is built.</li>
<li class="">nginx forwards the <code>X-Forwarded-*</code> headers that SAML needs, and the development setup can run over HTTPS.</li>
<li class="">The cleanup job falls back to deleting the whole output directory when a run has no file manifest.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="documentation">Documentation<a href="https://samsung.github.io/qaboard/release-notes/2023-q3#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class="">The <a class="" href="https://samsung.github.io/qaboard/docs/deploy">server setup</a> page documents user management, sign-in methods and the new login variables.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2023-q3#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">Fixed a directory traversal vulnerability in the nginx configuration for the docs.</li>
<li class="">Fixed regions of interest when the image is zoomed, and the text copied from the ROI viewer.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2023-q2]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2023-q2</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2023-q2"/>
        <updated>2023-06-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[qaboard.yaml files can include another file, bit-accuracy checks can compare two labels of the same batch, and a new page documents monorepos and subprojects.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">qaboard.yaml files can include another file, bit-accuracy checks can compare two labels of the same batch, and a new page documents monorepos and subprojects.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q project-integration_Ky7h">Project integration</span><h3 class="title_hdm3">Include other qaboard.yaml files</h3><p class="text_FLe0">A qaboard.yaml can now use a top-level include key to pull in another YAML file, to share settings between subprojects. Paths are relative to the root QA-Board directory.</p><a href="https://samsung.github.io/qaboard/docs/monorepo-subprojects">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Compare bit-accuracy across labels</h3><p class="text_FLe0">qa check-bit-accuracy has a new --reference-label option to compare a batch's outputs against the outputs of another batch label.</p><a href="https://samsung.github.io/qaboard/docs/bit-accuracy">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2023-q2#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">The output directory's copy button now offers both the Linux and the Windows path.</li>
<li class="">Images of different resolutions but the same aspect ratio now stay synced when zooming and panning.</li>
<li class="">Image views now always check the reference, so they can tell you when both images are identical.</li>
<li class="">Errors in the <code>path</code> of visualizations are now shown on the output card.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2023-q2#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class="">During auto-optimization, runs get <code>QA_OPTIM_DIR</code>, a directory to save data relevant to the whole optimization loop.</li>
<li class="">The LSF runner retries sending a job a few times before failing.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2023-q2#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">The backend image now includes the libraries needed for SAML login.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="documentation">Documentation<a href="https://samsung.github.io/qaboard/release-notes/2023-q2#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class="">New page on <a class="" href="https://samsung.github.io/qaboard/docs/monorepo-subprojects">monorepos and subprojects</a>: <code>root: true</code>, inheritance with <code>super</code>, and <code>include</code>.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2023-q2#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">Fixed copying the current region of interest in the image viewer.</li>
<li class="">Fixed spurious errors on output cards.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2023-q1]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2023-q1</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2023-q1"/>
        <updated>2023-03-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The image viewer has a new regions-of-interest menu, with automatic difference detection that is faster and offers several diff metrics. Text diffs can jump from one change to the next, and the backend moved to Python 3.11.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">The image viewer has a new regions-of-interest menu, with automatic difference detection that is faster and offers several diff metrics. Text diffs can jump from one change to the next, and the backend moved to Python 3.11.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">New regions-of-interest viewer</h3><p class="text_FLe0">A "View ROIs" menu in the image viewer switches between the full image, the ROI presets from your input metadata, and automatically detected differences with the reference. It always offers the full image and keeps a stable layout.</p><a href="https://samsung.github.io/qaboard/docs/visualizations">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Faster automatic diffs, with more metrics</h3><p class="text_FLe0">Finding regions of interest is faster and no longer runs out of memory on huge images. You can pick the difference metric (YIQ, SSIM, CIE 1976, CIE 1994 or CIE 2000), and the last one used is remembered.</p></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Navigate text diffs</h3><p class="text_FLe0">The text viewer jumps to the first difference with the reference, has a "Next Diff" button, and says when both files have the same content.</p></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2023-q1#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class=""><code>is_failed</code> metrics are now shown, including for failed runs.</li>
<li class="">Wider sections on wide screens, clearer error messages, and no more empty tooltips.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2023-q1#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class="">Runs now get the batch label as <code>QA_LABEL</code>, and their QA-Board ID as <code>context.id</code>.</li>
<li class="">Configurations can be <code>null</code>.</li>
<li class="">Redoing a run from the web app now reuses the original output directory.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2023-q1#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">The backend image now uses Python 3.11 on a newer OS.</li>
<li class="">The web app is built with a multi-stage Dockerfile, for faster builds and smaller images. Compose files pick the development or production target.</li>
<li class="">The bundled Cantaloupe image server is no longer started by the default docker compose setup, in favor of an image server running separately.</li>
<li class="">The backend trusts every git repository it clones (<code>safe.directory</code>), avoiding errors with recent git versions.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2023-q1#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">Fixed errors when the reference output was deleted.</li>
<li class="">Fixed "same data" being shown too often in the file viewers.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2022-q4]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2022-q4</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2022-q4"/>
        <updated>2022-12-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A quiet quarter: safer output directory names, Jenkins runners configurable from environment variables, a cap on the size of tuning batches, and backend stability tweaks.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><p class="description_UTc_">A quiet quarter: safer output directory names, Jenkins runners configurable from environment variables, a cap on the size of tuning batches, and backend stability tweaks.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q project-integration_Ky7h">Project integration</span><h3 class="title_hdm3">Jenkins runner configuration from the environment</h3><p class="text_FLe0">The Jenkins runner can now read its build URL and token from QA_RUNNERS_JENKINS_BUILD_URL and QA_RUNNERS_JENKINS_TOKEN, so they don't have to live in qaboard.yaml. The token is now optional.</p><a href="https://samsung.github.io/qaboard/docs/jenkins-integration">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2022-q4#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">Tuning from the web app is now limited to 5000 runs per batch, and the form says so.</li>
<li class="">The CI integrations menu refreshes statuses as soon as it opens, and links to Jenkins builds open the build page.</li>
<li class="">Runs aborted before writing their file manifest now get one when you open them.</li>
<li class="">Logs with stray <code>&lt;</code> characters are now displayed correctly.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2022-q4#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class="">Output directory names derived from input paths are now always slugified, avoiding characters that cause problems on some filesystems. New runs of inputs with such characters get a different output directory.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2022-q4#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">The backend recycles its workers after a number of requests, a maximum lifetime or too much memory use, and nginx waits up to 10 minutes for slow API calls.</li>
<li class="">Several API endpoints and webhooks read database rows in chunks to use less memory.</li>
<li class="">Exports to a folder now report when they fail to create symlinks.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[2022-q3]]></title>
        <id>https://samsung.github.io/qaboard/release-notes/2022-q3</id>
        <link href="https://samsung.github.io/qaboard/release-notes/2022-q3"/>
        <updated>2022-09-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[You can delete several batches at once and sort runs by storage. Auto-optimizations can resume from a checkpoint, and servers can report crashes to Sentry.]]></summary>
        <content type="html"><![CDATA[<div class="releaseNote_PSHz"><span class="version_NYcp">qaboard v<!-- -->1.0.2</span><p class="description_UTc_">You can delete several batches at once and sort runs by storage. Auto-optimizations can resume from a checkpoint, and servers can report crashes to Sentry.</p><div class="grid_sZjw"><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Delete multiple batches</h3><p class="text_FLe0">The commit page's batch menu has a new "Delete multiple batches" option to pick and delete several batches in one go. Milestones are skipped.</p></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Resumable auto-optimization</h3><p class="text_FLe0">qa optimize has a new --checkpoint option to save its progress and restart interrupted optimizations. Tunings started from the web app use it automatically, and show accurate iteration counts.</p><a href="https://samsung.github.io/qaboard/docs/auto-optimization">Learn more →</a></div><div class="card_ukht"><span class="audience_eP3Q">Users</span><h3 class="title_hdm3">Storage per batch</h3><p class="text_FLe0">The Output Files view shows the total storage used by the selected runs, and runs can be sorted by storage.</p></div><div class="card_ukht"><span class="audience_eP3Q admins_lbEZ">Admins</span><h3 class="title_hdm3">Crash monitoring with Sentry</h3><p class="text_FLe0">The backend and the web app can report errors and performance traces to Sentry. Set SENTRY_DSN (and optionally SENTRY_SAMPLE_RATE) on the backend to enable it.</p><a href="https://samsung.github.io/qaboard/docs/deploy">Learn more →</a></div></div></div><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="web-app">Web app<a href="https://samsung.github.io/qaboard/release-notes/2022-q3#web-app" class="hash-link" aria-label="Direct link to Web app" title="Direct link to Web app" translate="no">​</a></h2>
<ul>
<li class="">The image, video and bit-accuracy viewers can now compare raw/hex images by their image metadata and pixel-data hash, when the manifest has them, instead of the file hash.</li>
<li class="">Layout tweaks for small and wide screens.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cli-and-project-setup">CLI and project setup<a href="https://samsung.github.io/qaboard/release-notes/2022-q3#cli-and-project-setup" class="hash-link" aria-label="Direct link to CLI and project setup" title="Direct link to CLI and project setup" translate="no">​</a></h2>
<ul>
<li class="">The <code>qaboard</code> package is now version 1.0.2.</li>
<li class="">Auto-optimization: clearer errors when the objective cannot be computed, logs reachable from the web app even when the first iteration fails, and a <code>QA_SEED</code> that now seeds every random generator.</li>
<li class=""><code>qa check-bit-accuracy</code> prints clearer logs, with links to the failing comparisons.</li>
<li class="">Windows paths are now converted case-insensitively and with forward slashes.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="server-and-administration">Server and administration<a href="https://samsung.github.io/qaboard/release-notes/2022-q3#server-and-administration" class="hash-link" aria-label="Direct link to Server and administration" title="Direct link to Server and administration" translate="no">​</a></h2>
<ul>
<li class="">Upgraded the Cantaloupe image server from 4.1 to 5.0.</li>
<li class="">PostgreSQL now allows 200 connections, with more working memory per query.</li>
<li class="">The backend has configurable memory limits and <code>UWSGI_CHEAPER_OVERLOAD</code> to tune how quickly workers are spawned.</li>
<li class="">The cleanup job reads commits in chunks, using much less memory on large databases.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fixes">Fixes<a href="https://samsung.github.io/qaboard/release-notes/2022-q3#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes" translate="no">​</a></h2>
<ul>
<li class="">Fixed crashes when the reference lacks a metric present in the new run.</li>
<li class="">Fixed crashes of the history page and of some project index pages.</li>
<li class="">Fixed the detection of raw and hex image files.</li>
<li class="">Fixed tuning forms that were sometimes disabled for no reason.</li>
</ul>]]></content>
    </entry>
</feed>