FAQ
Common questions about getting SeqDesk installed, signed in to, and kept running. Every answer here is checked against the code that produces the behaviour. For step-by-step guides, start with Installation and Getting Started.
Requirements & Dependencies
What do I need to run SeqDesk?
Node.js 22.13.0 through 22.x or Node.js 24.x (recommended), PostgreSQL 14+, and
a Linux host or local macOS application environment. Node.js 23, 25 and later
majors are rejected outright rather than warned about. The installer also uses
Bash, curl, tar, npm, and a SHA-256 checksum tool (sha256sum or shasum).
The install target needs free space of at least the larger of 2 GB or three
times the release archive; the installer refuses to start otherwise. A
SeqDesk-managed PostgreSQL cluster is created separately under
$SEQDESK_PG_HOME and does not consume that budget, and neither does your
sequencing data, which SeqDesk references by path rather than copying.
Native Windows is not supported — the launcher exits immediately on win32 and
tells you to use WSL. WSL is guidance rather than a currently tested
installation target. See Prerequisites for
the required-versus-extended CI matrix.
Does SeqDesk work with SQLite?
No — SeqDesk is PostgreSQL-only, and the Prisma datasource names postgresql
directly. The installer rejects file: URLs outright. An existing SQLite
instance must stay on its last SQLite-compatible release until it is manually
migrated to PostgreSQL.
Can I run it on Windows?
Not natively. Run it under WSL, or on a Linux VM or server. The seqdesk
launcher stops on process.platform === "win32" before doing anything.
Do I need Conda, Nextflow, or SLURM?
Only if you run pipelines, and pipeline support is off by default. The core application — sequencing orders, samples, sequencing runs, studies, file discovery and assignment, support tickets, and ENA submission — runs without Conda, Nextflow, Java, or a scheduler installed anywhere.
With --with-pipelines, the installer reuses a compatible Conda base or
provisions Miniconda, then creates or updates the seqdesk-pipelines
environment with Python 3.11, Java 17, Nextflow, nf-core, and supporting
command-line tools. SLURM is optional on top of that — add it when pipeline
jobs should be submitted to a cluster scheduler rather than run on the SeqDesk
host itself.
Leaving pipelines off is the right default for a facility that only needs order and sample management, or that runs its analyses elsewhere. See Pipelines & Analysis.
Can I add pipelines to an install that does not have them?
Yes. Re-run the installer against the same directory with --with-pipelines,
adding --reconfigure so it keeps the installed release instead of downloading
one:
npx -y seqdesk@latest -y --reconfigure --with-pipelines --dir "$HOME/seqdesk"In reconfigure mode the installer loads the existing installation’s values
first, so an install that already had pipelines keeps them without repeating
the flag; an explicit --with-pipelines or --without-pipelines on the command
line always wins over the remembered value.
Installation & Quickstart
How do I install SeqDesk?
Download the installer and run it from a terminal:
curl -fsSLo /tmp/seqdesk-install.sh https://seqdesk.org/install.sh &&
bash /tmp/seqdesk-install.sh --interactive --dir "$HOME/seqdesk"Downloading to a file rather than piping matters: piping occupies standard
input, so there is no TTY for the wizard’s prompts and the installer refuses
interactive mode with No interactive TTY detected. Node.js and npm are still
required by the release installation. The npm launcher
(npm i -g seqdesk@latest, then seqdesk --interactive) remains an equivalent
alternative. See the Quickstart and
Linux install guides.
Do I need root or sudo?
No, and you should not use it. Run the installer as your normal user account.
- The installer refuses to create a PostgreSQL cluster owned by root — the
server would never start — and tells you to rerun as a normal user or pass
--database-urlfor a database you already manage. - On macOS, PostgreSQL setup never uses
sudoat all.sudo brew services startis specifically the wrong thing to do. - On Linux,
sudois needed only in two narrow cases: installing the PostgreSQL server package when it is absent (sudo apt-get install postgresql/sudo dnf install postgresql-server), or administering a pre-existing system PostgreSQL, whose role and database the installer creates throughsudo -n -u postgres psql. Because those usesudo -n, they need a cached credential — runsudo -vbeforehand if they apply. - If
npm i -gfails withEACCES, that is an npm prefix permission problem, not a reason to install SeqDesk as root. Usenpx -y seqdesk@latest …or a Node.js version manager instead; see npm launcher permissions.
The application itself should run as a non-root service account.
Where does it install, and what port does it use?
The default target is ./seqdesk relative to your current directory. For
predictable installs, set an absolute path with --dir (for example
bash /tmp/seqdesk-install.sh --interactive --dir "$HOME/seqdesk"). The listen
port comes from your configuration (app.port or --port); installed instances
default to port 8000, while a development npm run dev server uses 3000.
For a production Linux target, prepare a service-owned parent first rather than
assuming /opt is writable.
Inside the install directory, settings.json holds the runtime configuration
(written chmod 600), start.sh launches the app, and current/ is a symlink
to the release that is actually running. Updates and rollbacks re-point that
symlink; your configuration lives at the root and is not part of a release.
The installer aborts because the target directory already exists.
A fresh install refuses to overwrite an existing directory. In interactive mode
it asks “Backup and replace?”; with -y it aborts instead. Pass
--overwrite-existing to move the old directory to <dir>.backup.<timestamp>
and replace it.
Read what that does not cover before answering yes: it moves the install
directory and nothing else. The PostgreSQL database is a separate object with a
separate lifetime — it is not backed up, not dropped, not reset, and its user
accounts keep their passwords. To start from an empty database, install against
a different one with --database-url. See
Unattended + Reconfigure.
What happens if I install a second time against the same database?
The database is reused: the schema is migrated forward and every account, sequencing order and record in it is kept. Crucially, the seed never overwrites an account that already exists — if it did, anyone who could run the installer against a connection string could reset that database’s administrator password.
So the installer reports The selected database already contains SeqDesk accounts, names them, and prints
existing password (unchanged) in the closing Login block instead of a
password. Any password it would otherwise have shown you does not open that
installation. Sign in with the credentials the database was originally set up
with; if they are lost, see
Reset a password. The full walkthrough,
including the two narrower variants of the message, is in
the install attached to a database that already had accounts.
How do I install on macOS?
Install Node.js with Homebrew, then use the guided installer:
brew install node@24
export PATH="$(brew --prefix node@24)/bin:$PATH"
curl -fsSLo /tmp/seqdesk-install.sh https://seqdesk.org/install.sh
SEQDESK_BIND_HOST=127.0.0.1 bash /tmp/seqdesk-install.sh --interactive \
--dir "$HOME/seqdesk"You do not install or start PostgreSQL yourself. The guided installer resolves
it for you: it reuses an already-running PostgreSQL 14+ server, an adoptable
Unix socket, or a non-root Homebrew service. If none is available it creates a
cluster it owns under $HOME/.seqdesk/postgres (override with
SEQDESK_PG_HOME; macOS caps Unix socket paths, so the cluster’s socket/
subdirectory must be at most 85 characters — keep SEQDESK_PG_HOME to 78 or
fewer), initialized and started as your macOS login user with initdb/pg_ctl.
That cluster listens on a private Unix socket only — no TCP port, no launchd
service — and <dir>/start.sh starts it before the app. PostgreSQL setup must
run as your normal macOS login user: never use sudo, including
sudo brew services start. See
Prerequisites and the dedicated
macOS guide.
Database & Migrations
Can the installer set up PostgreSQL for me?
Yes — and in most cases you do not have to supply a database at all. Run the
guided installer as a normal, non-root user: SeqDesk first reuses a healthy
local PostgreSQL 14+ server (or a Unix socket) it can administer, and otherwise
creates and owns a private cluster under $HOME/.seqdesk/postgres (override
with SEQDESK_PG_HOME; the cluster’s socket/ subdirectory must be at most 85
characters, so keep the path short). That cluster is socket-only — it opens no
TCP port, is not registered with launchd or systemd, and <dir>/start.sh starts
it before the app on every boot.
A local socket owned by a different operating-system user (typically a
distribution PostgreSQL on /var/run/postgresql owned by postgres) is skipped
with a warning rather than used: SeqDesk declines to send generated credentials
to a server it does not own. No action is needed — it continues down the ladder
and normally creates its own cluster.
--prepare-postgres remains available as a separate administrator bootstrap
step, operating on a DATABASE_URL that already exists — the
Prerequisites page includes a ready-to-send
SQL template for locked-down servers where an admin must prepare the role and
database first.
What is DIRECT_URL for?
DATABASE_URL is the runtime connection the app uses; DIRECT_URL is the
connection Prisma uses for schema migrations. They can be the same string for a
direct database. For cloud databases that put a pooler in front, set DIRECT_URL
to the unpooled connection so migrations bypass the pooler. See the
config file reference.
Migrations hang or time out (advisory-lock error on a pooled database).
migrate deploy takes a session-level Postgres advisory lock, which a
transaction-mode connection pooler cannot hold — so on a pooled endpoint (such as
Neon’s -pooler host) it hangs and fails with P1002. Point DIRECT_URL at the
unpooled endpoint for migrations. For Neon-style hosts SeqDesk also strips the
-pooler label automatically as a safety net, so a misconfigured pooled URL still
works; other poolers (for example a standalone PgBouncer on its own hostname)
have no such fallback and must be pointed at the direct endpoint yourself.
Where does my sequencing data actually live?
Not in the database and not in the install directory. SeqDesk records the
path of each FASTQ file and reads it in place; the files stay wherever your
sequencer or storage puts them, under the base path configured at
Settings → Infrastructure → Open Data Storage (site.dataBasePath, also
settable at install time as sequencingDataDir). That is why moving or
unmounting that storage breaks file access even though the database is
untouched, and why the database backup you take is small. See
Sequencing Files and
Data Storage.
Accounts, First Login & Security
How do I log in the first time?
Open the Browser URL from the installer’s closing summary and use the
administrator account from the Login block printed just above the success
banner. The packaged install defaults to port 8000, so that URL is normally
http://127.0.0.1:8000. If you left the wizard’s password prompt blank, the
installer generated a password and prints it there once — it is kept out of the
install log, so copy it before closing the terminal.
An unattended install that configures nothing at all, against a genuinely empty
database, creates admin@example.com / admin (facility admin) and
user@example.com / user (researcher). These defaults are published and exist
only for bootstrap — change or remove them immediately on any shared or
network-reachable instance. The seed deliberately refuses to create an account
with that built-in password in the two cases where it would be dangerous: when
the install named an account but no password for it, and when the database was
already configured by something before. In those cases the account is simply not
created, which is visible at the login screen and explained in the application
log.
If installation-time seeding could not finish, the app redirects to /setup and
retries it. See First Login & Setup.
I forgot the administrator password. What now?
Use seqdesk reset-password from a shell on the host:
npx -y seqdesk@latest reset-password admin@example.com --dir "$HOME/seqdesk"It resets exactly one account, shows you what it is about to change and asks for
confirmation, and prints the new password once — it is stored nowhere else,
because SeqDesk keeps only the bcrypt hash. It reads the database connection
from the install directory’s settings.json, so you do not need the connection
string yourself. It requires SeqDesk 1.1.125 or newer installed in that
directory. Full reference, including the JSON mode and every error it can
produce: Reset a password.
Can users reset their own passwords?
No. There is no “forgot password” email flow, no reset link on the login page,
and no change-password screen for a signed-in user. seqdesk reset-password is
currently the only way to change the password of an existing account; the only
route in the application that hashes a password is POST /api/register, which
creates a new account.
Plan around that: give the administrator account an address a real person still controls, and store its password where your facility already stores credentials. Note also that sessions are JWTs, so resetting a password does not sign out a browser that is already logged in as that account.
Who can create an account?
Two different paths, with two different guards:
- Researchers self-register at
/register. The request must supply an email, password, first and last name, and the roleRESEARCHER. If the optional account validation module is enabled, an email domain outside the configured allow-list is either rejected (Registration is restricted to email addresses from: …) or merely warned about, depending onenforceValidation. - Facility admins cannot self-register.
role: "FACILITY_ADMIN"requires a valid invite code that has not been used and has not expired; if the invite was issued for a specific address, the registering email must match it. Invites are created by an existing admin.
SeqDesk has exactly these two roles. There is no finer-grained permission model:
a facility admin sees and can change everything, a researcher sees their own
sequencing orders (plus their department’s, when access.departmentSharing is
on). See User Management.
Can I expose SeqDesk to the public internet?
No. SeqDesk assumes a closed, trusted network — behind a VPN or on an
institutional intranet. Convenience defaults such as open researcher
self-registration and bootstrap accounts assume that context. Note that the app
binds to 0.0.0.0 (all interfaces) by default, so it is reachable from anything
that can route to the host: set SEQDESK_BIND_HOST=127.0.0.1 at install time
(it is persisted in <dir>/.seqdesk-bind-host and reapplied by start.sh) if
the instance should only answer on the loopback interface. The public demo at
demo.seqdesk.org is the only intentional exception.
Is there SSO or OAuth?
Not built in. Authentication is email + password via the NextAuth credentials provider, with JWT sessions. For single sign-on, run SeqDesk behind an identity-aware proxy (for example Cloudflare Access or Pomerium) and trust its forwarded headers.
Updates & Health
How do I update or roll back?
Use the sidebar’s Settings → Info page (titled “Platform Info”, at
/admin/settings) and its Software Updates section to check for and install
an application release. Upgrading the npm launcher updates the seqdesk
command, not an already-installed application. Likewise, --reconfigure
reapplies settings and deliberately skips the release download; it is not an
update. Use the Software Updates rollback action, or re-point the active release
symlink manually if the app cannot start. See
Manual Update & Rollback.
How do I check that an install is healthy?
Run npx -y seqdesk@latest doctor --dir "$HOME/seqdesk" --url http://127.0.0.1:8000
— it is read-only and safe to run as often as you like. Without --dir it checks
the current working directory. It verifies the install layout, that the
configuration parses and carries the required secrets, that the database host
accepts a TCP connection, and that the app answers over HTTP. Exit code 0
means no failures (warnings are allowed); exit code 1 means at least one check
failed (and 2 means the options themselves were invalid).
What does the health check not cover?
More than people expect, so do not read a clean report as “ready for production”. Doctor never authenticates to the database (the PostgreSQL check is a bare TCP connect, not a query), never inspects the schema, and never proves that a usable account exists. It checks nothing at all about your sequencing data path, the Conda/Nextflow/SLURM toolchain, ENA credentials, TLS, the bind address, or backups. It is also strictly read-only: it never repairs anything it finds. The complete list is on the doctor page.
On a default install the database also listens on a Unix socket, and this
release’s health check only probes TCP — so it reports the PostgreSQL check as
unreachable and exits 1 even when the database is fine. Confirm the database
separately with pg_isready -h ~/.seqdesk/postgres/socket and read
the known limitation
before treating that failure as real. For the same reason, do not gate CI on
doctor’s exit code for socket-based installs.
Where are the logs?
Three different places, for three different failures:
- The install itself —
/tmp/seqdesk-install-<timestamp>.log(or wherever you pointedSEQDESK_LOG). Re-run with--verboseto promote the diagnostic narration to the terminal as well. Strip database URLs, passwords and tokens before sharing one. - The running application —
pm2 logs seqdesk --lines 100under PM2, or the file you redirectedstart.shinto for a manual start (the installer suggestsnohup <dir>/start.sh > <dir>/seqdesk.out 2>&1 &). A manual start does not come back after a reboot. - A SeqDesk-managed database —
server.loginside${SEQDESK_PG_HOME:-$HOME/.seqdesk/postgres}.
Pipeline runs keep their own logs/pipeline.out and logs/pipeline.err inside
the run directory; see Monitoring.
Still stuck? Common problems is a symptom-to-fix table for installer failures, Support & Messages covers the in-app ticket system, and bugs belong on GitHub .