TazHelper turns testers into precise bug reports. On a SliTaz cooking ISO it checks the hardware and the system on its own, asks the tester to try a few applications, then sends one short anonymous report to the SliTaz servers. Developers read the reports, fix what breaks and mark them as done.
- Overview
- For testers
- What a report contains
- For developers: triage
- Writing a test
- Command line
- Configuration
- Server
- Files
- Source and license
Overview
Random testing finds random bugs. TazHelper gives every tester the
same short list: what matters most for the next release, in the order
the developers need it. The answers come back in one plain text format,
so a developer can sort hundreds of them with grep.
| Part | Role |
|---|---|
tazhelper |
The engine, in POSIX shell: runs the tests, stores the answers, builds and sends the report. Also the command line interface. |
tazhelper-gtk |
The GTK3 window testers use. It holds no logic: every click
runs tazhelper. |
tests/ |
One file per test. Adding a test is dropping a file there. |
tazhelper.cgi |
Receives the reports on lab.slitaz.org and files them. |
tazhelper-reports |
Lets developers list, read, count and close the reports, on the server or on their own machine. |
Privacy is part of the design: no name, no network address, no serial number ever leaves the computer, the tester reads the whole report before sending it, and nothing is sent without a click on Send.
For testers
Start TazHelper from the menu (System Tools) or from a terminal:
$ tazhelper
A window opens with three steps, shown at the top. You can go back and forth between them at any time: every answer is kept as soon as you give it, even if you close the window and open it again later in the same session.
1. Checks
The automatic checks need nothing from you: network, screen, sound, hardware without a driver, crashed programs and kernel errors. Each line gets a green ✓ (works), an orange ! (works partly) or a red ✗ (problem found), with a short explanation. Everything shown here goes into the report: you do not need to describe it again. Check again runs them once more, for example after plugging in a network cable.
2. Applications
Each card asks you to try one application. Click Open, use it for a minute as the card suggests, then choose:
- Works: everything you tried was fine.
- Partly: it works, but something is wrong or ugly.
- Broken: it does not start, crashes, or cannot do its job.
After Partly or Broken, a text field opens: a few
words about what you saw help the developers a lot (the page stays
blank
, no sound in videos
). Click the chosen button again
to take your answer back. Skip what you cannot test: an untested
application is simply left out of the report.
The installer card only asks you to walk through the installer. Run a real installation only on a spare disk or in a virtual machine.
3. Send
Add a general comment if you like, read the report, then click
Send report. On success TazHelper thanks you and shows a
reference such as cooking/20261003-081512-3fa9c2d1: quote
it on the forum if you want to discuss your report.
No network? Save the report
A network that does not work is exactly the kind of problem worth reporting. If sending fails, click Save to file and choose a USB key. Later, on any SliTaz with a working network:
$ tazhelper send /media/usb/tazhelper-report-20261003-0815.txt
Without a graphical desktop
Without X, tazhelper runs the same steps in the
terminal: it shows the check results, asks about each application
(l to launch it, o, p or f for
works, partly or broken, Enter to skip), prints the report and asks
before sending it.
What a report contains
A report is plain text, one key=value per line, at most
16 KB. System lines come first, then one line per test result,
then the comments:
tazhelper_version=0.1 date=2026-10-03 release=cooking flavor=core arch=x86_64 kernel=6.12.89-slitaz boot=efi live=yes cpu=Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz cpu_cores=4 ram_mb=7841 gpu=8086:0166 i915 locale=fr_FR.UTF-8 test.network=ok test.network.info=wlan0 wireless iwlwifi, mirror reachable test.browser=partial test.browser.comment=Pages load, but fonts look blurry comment=Thanks for 5.1, boots fast on my old ThinkPad
| Key | Meaning |
|---|---|
date | Day of the test, UTC, no time |
release, flavor | From /etc/slitaz-release and /etc/slitaz/flavor (unknown if absent) |
boot, live | efi or bios; yes when running from the live CD |
gpu | PCI vendor:device of the display controller and its driver |
test.<id> | ok, partial or fail |
test.<id>.info | What an automatic test found |
test.<id>.comment | What the tester wrote about an application |
comment | The general comment |
triage.* | Added by developers when the report is dealt with (see below) |
New keys may appear in later versions: tools reading reports must ignore the keys they do not know.
Privacy
TazHelper never collects a MAC address, a hostname, a user name, an IP
address or a serial number. As a safety net, every value also goes
through a filter that blanks MAC and IPv4 addresses, /home/
paths, the user name and the host name, including in what the tester
types. The server does not store the IP address of the sender either,
and the web server does not log requests to the report address.
For developers: triage
Reports land on foyer, in
/home/slitaz/vhosts/lab.slitaz.org/tazhelper-reports/,
one directory per release. The state of a report is the directory it
sits in: no database, no lost update.
tazhelper-reports/
├── cooking/ ← inbox: reports to deal with
│ ├── 20261003-081512-3fa9c2d1.txt
│ ├── 20261003-094401-b71e0a44.txt
│ └── done/ ← reports dealt with
│ └── 20261002-230023-57db9d9d.txt
└── 5.1-rc1/
└── ...
A report name starts with the UTC date and time it was received, so a
plain listing is in chronological order. The files belong to the
devs group: every developer with an account on foyer can
read and triage them.
On foyer
$ ssh foyer-vps $ tazhelper-reports list 20261003-081512-3fa9c2d1 cooking x86_64 core fail:network "No wifi on my Dell..." 20261003-094401-b71e0a44 cooking i486 core partial:browser 2 report(s) $ tazhelper-reports show 20261003-0815 $ tazhelper-reports done 20261003-0815 rtw88 firmware added, wok r28600
An id can be shortened to any unique start. done moves the
report to done/ and appends who closed it, when, and your
note:
triage.date=2026-10-03 triage.by=pankso triage.note=rtw88 firmware added, wok r28600
Write the fix in the note (a wok or tool revision, a forum link): it is
what the next developer will look for. A report closed by mistake goes
back with reopen; spam or test reports go away with
delete.
On your own machine
For long sessions, work on a copy: pull brings every
report to ~/tazhelper-reports (private, mode 700) in one
ssh connection. Reading, counting and searching then happen locally;
done, reopen and delete are run
on foyer through ssh, then the copy is refreshed. This needs the
foyer-vps ssh alias, the one used to push to hg.
$ tazhelper-reports pull 12 report(s) to deal with in /home/tux/tazhelper-reports $ tazhelper-reports stats 12 report(s) Test ok partial fail browser 9 2 1 network 7 0 5 ... arch=i486 4 arch=x86_64 8 flavor=core 7 flavor=firefox 5 $ tazhelper-reports grep 'test.network=fail' $ tazhelper-reports grep 'gpu=10de:' --all
foyer blocks an address that opens many ssh connections in a short
time: prefer one pull and local reading over many remote
commands, or share one connection: open it with
ssh -fN -o ControlMaster=yes -o ControlPath=/tmp/fy.sock foyer-vps
and set TAZHELPER_SSH="ssh -o ControlPath=/tmp/fy.sock".
A triage routine
pull, thenstats: which test fails most, on which arch and flavor? Fix the biggest problem first.grep 'test.<id>=fail'to read all the reports of one problem together: the.infoand.commentlines usually point to the package.- Fix, cook, push as usual. Then close every report of that problem
with
doneand the revision in the note. - A report that needs no fix (user error, already known) is closed too, with a short note saying why.
Writing a test
A test is one small file in tests/auto/ (no user action)
or tests/manual/ (the tester tries an application). Drop a
file there and it shows up in the window, the command line and the
reports: no other change is needed. The file is a shell fragment,
sourced in a subshell:
| Variable | Meaning |
|---|---|
ID | Unique name, a-z 0-9 _ - only: it is the report key |
TITLE | Short name shown to the tester |
PRIORITY | 1 = most important. Tests are sorted by priority, then by ID |
DESC | One or two sentences: what to do, what to look at |
run() | Automatic test: prints one line, returns 0 (ok), 1 (fail) or 2 (partial) |
LAUNCH | Manual test: command started by the Open button |
An automatic test
# Sound: ALSA sees at least one sound card.
ID="sound"
TITLE="Sound card"
PRIORITY="2"
DESC="Checks that the kernel found a sound card (ALSA)."
run() {
if [ ! -f /proc/asound/cards ]; then
echo "no ALSA support in the kernel"
return 1
fi
cards="$(sed -n 's/^ *[0-9]* \[[^]]*\]: //p' /proc/asound/cards)"
if [ -z "$cards" ]; then
echo "no sound card found"
return 1
fi
echo "$cards"
}
A manual test
# Manual: the hard disk installer. Never install on the tester's disk. ID="installer" TITLE="Installer" PRIORITY="2" DESC="Walk through the installer up to the last step. Only run the installation on a spare disk or in a virtual machine." LAUNCH="subox tazinst-gtk"
Rules for a good test
- POSIX shell for busybox ash, no bash: the test must run on the oldest supported i486 machine.
run()runs as the tester, without root, in its own shell, and is stopped after 20 seconds. It must not change the system.- Only the first line printed is kept: make it say what was found,
not just
error
. Keep it under 500 characters. - Never print personal data. The privacy filter is a safety net, not a licence.
partialis forit works, but
: a fallback driver, a non fatal error. Keepfailfor what a user would call broken.- Check a new test with
tazhelper autoandmake checkbefore committing it.
Command line
tazhelper
| Command | Action |
|---|---|
tazhelper | Open the window, or the interactive mode without X |
tazhelper cli | Interactive mode in the terminal |
tazhelper auto | Run the automatic tests and print the results |
tazhelper list | List the available tests |
tazhelper mark <id> <ok|partial|fail|none> [comment] | Store the answer for a manual test (none takes it back) |
tazhelper comment <text> | Set the general comment |
tazhelper report | Print the report exactly as it will be sent |
tazhelper send [file] | Send the report, or a report saved earlier |
tazhelper save [file] | Save the report to a file |
tazhelper reset | Forget all answers of this session |
tazhelper launch <id> | Start the application of a manual test |
tazhelper tests, results | Machine readable lists used by the window |
tazhelper-reports
| Command | Action |
|---|---|
list [--done|--all] | Reports to deal with, oldest first: id, release, arch, flavor, failed and partial tests, comment |
show <id> | Print a report |
stats [--all] | Results per test, then reports per arch and flavor |
grep <regex> [--all] | Reports with a line matching the regex |
done <id> [note] | Close a report, with a note |
reopen <id> | Put a closed report back in the inbox |
delete <id> | Remove a report for good (spam, test) |
pull | Copy all reports from foyer to the local copy |
Configuration
/etc/slitaz/tazhelper.conf:
# Where reports are sent (HTTP POST, text/plain). URL="https://lab.slitaz.org/tazhelper/report.cgi" # Seconds before giving up on a test or on sending. TIMEOUT="20"
| Variable | Use |
|---|---|
TAZHELPER_URL, TAZHELPER_TIMEOUT | Override the configuration file |
TAZHELPER_STATE | Where answers of the session are kept (default ~/.cache/tazhelper, in RAM on a live CD) |
TESTS_DIR | Test directory (default /usr/share/tazhelper/tests) |
TAZHELPER_REPORTS | tazhelper-reports: the report directory to work on |
TAZHELPER_REMOTE | tazhelper-reports: ssh host of the server (default foyer-vps, empty for a standalone copy) |
TAZHELPER_SSH | tazhelper-reports: ssh command used for the server, to reuse a shared connection |
Run from a source checkout, ./tazhelper uses the
lib/, tests/ and etc/ of the
checkout, and the window built in gui/: handy to try a new
test before installing anything.
Server
tazhelper.cgi is a small shell CGI. It treats everything
it receives as hostile: the body is measured, checked with
grep and moved to a file, never sourced, evaluated or
executed. A report is refused when it is larger than 16 KB, holds
anything but key=value lines, a control character or a
line longer than 1024 bytes, or does not start with
tazhelper_version=. An unusual release name is filed under
unknown/. The answer is OK <release>/<id>
or ERROR <reason>.
On foyer
- The CGI is
lab/web/tazhelper/report.cgiin the slitaz-forge repository, a copy ofserver/tazhelper.cgifrom the tazhelper repository, deployed withfoyer up-lab. Copy it again when it changes. - lighttpd runs a CGI for this one address only (lab vhost in
vhosts.conf) and writes no access log for it. - Reports are kept outside the web directory, in
tazhelper-reports/(slitaz:devs, mode 2770), and saved every night byfoyer-backup.sh. They are never put in a repository. tazhelper-reportsis installed in/usr/binfrom the tazhelper repository.
Testing the CGI locally
make check feeds good and bad reports to the CGI without
any web server. To try the whole chain with busybox httpd (with an
empty configuration file: the SliTaz default one breaks CGI scripts
given by relative path):
$ mkdir -p www/cgi-bin && cp server/tazhelper.cgi www/cgi-bin/ $ : > httpd.conf $ TAZHELPER_REPORTS=$PWD/reports busybox httpd -f -c httpd.conf \ -p 127.0.0.1:8099 -h $PWD/www & $ TAZHELPER_URL=http://127.0.0.1:8099/cgi-bin/tazhelper.cgi tazhelper send
Files
| Path | Content |
|---|---|
/usr/bin/tazhelper | Engine and command line |
/usr/bin/tazhelper-gtk | GTK3 window |
/usr/lib/tazhelper/libtazhelper.sh | Tests, report, sending |
/usr/share/tazhelper/tests/{auto,manual}/ | Test files |
/etc/slitaz/tazhelper.conf | Configuration |
~/.cache/tazhelper/ | Answers of the session, last report sent |
/usr/share/doc/tazhelper/ | This manual |
Source and license
TazHelper is free software under the BSD license. Source: hg.slitaz.org/tazhelper. Questions and ideas are welcome on the SliTaz forum.