{% extends layout|default('base.html', true) %} {% block style %} {% endblock %} {% block content %} Plexora - Settings {# The rail is rendered from settings_routes.SECTIONS and the panels are written by hand below, keyed by the same id. That split is deliberate: a section's NAME and ORDER are one line of Python, so adding one never means editing three places to keep a list in step, while its CONTENT is markup and belongs in a template rather than in a string in a route module. Panels are all present in the DOM and shown one at a time. With one section that is indistinguishable from rendering only the active one; with six it is what keeps switching tabs instant, and it is the arrangement the CSS and the JS below are written for. #}

Settings

Preferences for this copy of Plexora.

Data directory

Every project you import, and every figure you build, is written here. Plexora reads this once when it starts, so a change takes effect the next time it is launched.

{# Filled by settingsPage.js from /settings/data. Rendered empty rather than server-side because the same markup has to be redrawn after a save, and one renderer beats a Jinja copy and a JS copy that drift. #}
Current location
Loading…
{# Shown only when the settings file and the running process disagree -- i.e. a change was saved and nothing has restarted yet. Both paths are named, because "pending" is meaningless without saying pending FROM what. #} {# An environment variable beats the settings file (see paths._candidate_data_root), so when one is set the form is not merely disabled -- the server refuses the write too. Two places, because a disabled control is a hint and the 409 is the rule. #}
{% if not data.notebook_mode %} {# Opens a picker on the SERVER's machine, which is why it is not offered in notebook/hosted mode -- /browse_path refuses it there for the same reason. #} {% endif %}

Existing projects stay where they are unless you choose to bring them along on the next step.

{# The review step. Nothing is written until the button in here is pressed, so this is the only place the consequences of the choice are stated -- what is already in the target, whether a move would be a rename or an hour of copying, and what would collide. #} {# Migration progress. Counted in projects rather than bytes -- see data_migration's module docstring for why a byte total would cost a full tree walk before anything visibly starts. #}
{# Remote servers. The same job `plexora connect` does, with the ssh command lines replaced by a saved profile and a button. There is no form here: adding a server means answering questions about somebody else's cluster, and those answers are properties of the SITE -- so the page offers the sites instead, and the questions that genuinely differ are asked on the preset's own form. See settingsPage.js's drawCatalogue for what used to be here. #}

Remote servers

{# The one sentence this panel needs before either box: which machine Plexora is, and which machines these are. Running Plexora ITSELF somewhere else is a launch decision made on that machine, not a setting inside a running Plexora, and the panel says so rather than leaving somebody to look for the field that would do it. #}

Plexora runs on one machine and reaches every other one over SSH.

{# The other half of that sentence, and the half people come here looking for. The note above says the panel tells them where the launch decision is made; saying it takes the command, because "start it there" with no example is not an instruction anybody can act on. #}

To run Plexora itself on one of them, start it there rather than from here — plexora connect you@login.cluster.edu in a terminal, or Open OnDemand, or a Jupyter session. From that Plexora the cluster is Local, and these same saved servers are what plexora connect reads.

{# Two things, boxed apart. What you have saved and what you can add were a run of cards and a heading on one flat background, so the presets read as more saved servers with the wrong buttons on them. The saved half gets a container with its own title; the catalogue below stays on the page's own ground, which is the whole of the distinction. #}

Saved connections

Save a remote connection once, then reconnect by name.

Loading…
{# The catalogue, drawn by settingsPage.js from the same cards the connection dialog uses. Empty in the markup on purpose: this list is a static description of other people's clusters and is fetched once, by whichever surface asks first, rather than being rendered into every page that has a Settings link. What stood here was a hand-written form of twelve boxes and a "Use preset..." button beside it. Seven of those boxes asked what a preset asks, with a second set of defaults to keep in step; the three that were genuinely its own -- the data directory, extra port forwarding, and forwarding from the login node -- moved into the preset form's Advanced section, which is where the rest of that question already lived. Two grids, not one: the five kinds of machine anyone can have, and then the named institutions behind "Additional presets". See connectionModal.js's recipeGrid. #}

Add a New Connection

Start from the kind of machine you use. Plexora fills in what it knows; you can change any of it afterwards. If your institution's cluster is one Plexora already knows, it is under Additional presets.

Loading…
{# Data nodes: what is CURRENTLY reachable, which is a different question from which servers are saved next door. Most entries here now appear and disappear on their own -- a data field's Remote option opens one, `plexora connect` opens one on the user's laptop -- so this section reads as a status board first and an address book second. The manual form stays because a node somebody started by hand is still a thing that exists, but it is behind a disclosure: it is now the exception. #}

Data nodes

Machines that are handing this Plexora data right now. Most of them arrive by themselves: choosing Remote on a data field opens one on a saved server, and plexora connect opens one on your own computer. Nothing here needs setting up before you import.

Which files a project reads from a node is chosen on that project’s own page. This is only the address book.

Loading…
Add a node by hand

For a node you started yourself with plexora node serve on a machine this one can already reach. A node opened from a data field or by plexora connect registers itself.

{# Web data: the on-disk chunk cache behind an image opened from https / s3 / gs / az, and the address book of per-bucket options a private one needs. See server/models/remote_sources.py and server/utils/remote_store.py -- this panel is the whole of what those two keep, drawn by settingsPage.js's WebDataSection from `GET /settings/webdata`. #}

Web data

An image opened straight from a web address is read through a cache on this disk, one chunk at a time, so the same bytes are not fetched twice. This is where that cache is, how big it may get, and what is in it right now.

Cache location
Loading…

Kept inside the data directory. Moving the data directory in the Data section above takes this cache with it, and clearing it never touches the images themselves, only this copy of their bytes.

Budget
GB
{# The used/budget meter. Two fills over one track rather than a stacked bar -- see settings.css -- because what is kept offline is a SUBSET of what is cached, not a second quantity beside it. #}

Stores

Loading…
{# The address book: options.py per URL prefix, for a bucket that needs an endpoint, an anonymous read or a named profile. The import dialog can add an entry here too, from the moment a bucket is first picked -- this is the same list, read back. #}

Address book

Options for private buckets or S3-compatible servers, saved once per web address prefix. Keys are never stored here — Plexora uses your AWS/Google/Azure credentials from the environment.

Loading…
Add an entry
{# Updates: the same answers as Help > Check for Updates, and the two preferences it keeps (update_routes.py, `updates` in the settings file). The dialog does the updating; this panel only says what is installed and sets whether to look. #}

Updates

Plexora looks for a newer release once a day and puts a dot on the Help menu when there is one. It never installs anything until you ask.

Installed version
Loading…
{# Usage data: the telemetry mode (plexora/telemetry, `telemetry` in the settings file) and a look at exactly what would be sent. The radios are disabled, with the reason, when an environment variable or the service decides instead. #}

Usage data

Plexora can send anonymous usage counts — which features are used, how long tiles take to draw, which kinds of errors occur — so we know what to improve. It never sends file names, project names, marker or gene names, cell data, coordinates, usernames, machine names or anything typed into a tool. Everything is queued on this machine first, and nothing in Plexora waits for it or depends on it.

What to send

Also off with plexora telemetry off or DO_NOT_TRACK=1.

This installation
—
{# License: the plan (plexora/licensing) from /license/status, and the three ways to get Paid -- a trial, a seat key or token, an offline licence file. Nothing here is needed for Free, and the page never asks the licence service anything until a button does. #}

License

Plexora Free is everything Plexora does without a licence: every image, table and modality, every tool's manual features, remote and HPC viewing, notebooks and export — with no account and no network. Paid adds AI features: guided gating sessions and the evidence an agent gathers, with more to come.

Plan
Free

For a computer with no internet access. Run plexora license fingerprint --out fp.json there, upload it in the licence portal, then choose or paste the .plexora file here.

Your data never leaves this machine: a licence check sends the certificate and a hash that identifies this environment, nothing else. When a licence ends, everything Free keeps working and everything you made with Paid features stays yours.

{# remoteState.js is loaded by base.html, above and deferred, so it is parsed before this file runs -- the Remote servers section is one of its subscribers rather than a poller of its own. #} {% endblock %}