datatug-cli

command module
v0.58.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 5, 2026 License: Apache-2.0 Imports: 19 Imported by: 0

README

DataTug CLI & agent for web UI

DataTug is an open-source, CLI-first data exploration platform with a Web UI, designed to help you explore, query, and connect data across multiple sources without losing context. It automatically surfaces related data — even across different systems — so you can move naturally between datasets, queries, and results.

Free for personal use, DataTug keeps your workflows transparent, versioned, and portable, whether you work locally, in GitHub, or in the cloud.

datatug-cli-employees-2.png

Our approach to development

We build with our own tooling:

  • SpecScore — specify requirements as SpecScore.md artifacts
  • SpecStudio — author & manage specs across their lifecycle
  • inGitDB — store structured data in Git where applicable
  • DALgo — data access layer for Go
  • cover100.dev — drive toward 100% test coverage
  • DataTug — query & explore data

♺ Continuous Integration — Build and Test Go Report Card GoDoc Coverage Status

Help wanted to get test coverage to 100%.

Installation

macOS / Linux — curl
(p=$(mktemp) && trap 'rm -f "$p"' EXIT && curl -fsSL https://datatug.io/install/get-cli -o "$p" && sh "$p")

Environment overrides: DATATUG_VERSION (default: latest release), DATATUG_INSTALL_DIR (default: ~/.local/bin).

Windows — PowerShell
$p=Join-Path $env:TEMP ("datatug-"+[guid]::NewGuid()+".ps1"); try { irm https://datatug.io/install/get-cli.ps1 -OutFile $p -EA Stop; & $p } finally { Remove-Item $p -EA SilentlyContinue }

Environment overrides: DATATUG_VERSION, DATATUG_INSTALL_DIR (default: %LOCALAPPDATA%\DataTug\bin). Current Windows releases support amd64.

macOS / Linux — Homebrew (tap)
brew install --cask datatug/tap/datatug

Homebrew gets a release only when the maintainers promote it, so it can be behind the direct installers (curl and PowerShell, which always take the latest release). brew list --cask --versions datatug shows the version installed.

The direct installers and Homebrew package do not require Go. See the full installation guide or the official AI-agent instructions.

Updating
datatug self-update
datatug self-update --check  # report whether a newer release exists, without applying it

Homebrew installs run brew update && brew upgrade --yes --cask -- datatug; direct installs from curl or PowerShell download and checksum-verify the latest release and swap the binary in place. See spec/features/cli/self-update.

datatug install                # list ingitdb, ovdb and specscore, with install status
datatug install ovdb           # show details and install it the same way datatug itself was installed
datatug install ovdb --dry-run # report the planned action without downloading or writing anything
datatug upgrade                # report current/latest/verdict for every installed fleet CLI plus datatug itself
datatug upgrade --all          # upgrade every installed fleet CLI plus datatug itself, after one confirmation

ingitdb validates and edits the inGitDB databases DataTug reads; ovdb runs a user-owned OpenVaultDB server DataTug can query as a catalog; specscore lints DataTug's own specifications. datatug upgrade is the fleet-wide counterpart to self-update: datatug self-update is exactly datatug upgrade datatug, built from the same catalog configuration, so the two never disagree. See spec/features/cli/install.

What you can do with DataTug

  • Explore data everywhere — SQL databases, cloud data sources, logs, and APIs (HTTP / REST)
  • CLI-first workflows with a Web UI — dashboards, charts, and shared views
  • Create parametrised queries and query sets for repeatable troubleshooting and investigation scenarios
  • Automatically navigate related data across tables, views, APIs, and different data sources
  • Build data pipelines to transform, combine, and enrich data
  • Document schemas and metadata with a built-in wiki
  • Version everything with Git — queries, dashboards, pipelines, and settings stored as readable project files
  • Choose where your project lives:
    • Local directory (fully offline)
    • GitHub repository
    • DataTug Cloud

DataTug turns scattered data into a connected, navigable workspace — combining the speed of the CLI with the clarity of a Web UI for exploration, troubleshooting, and collaboration.

datatug chat: table narrowing

datatug chat normally shows the AI model the definitions of all of a project's tables on every turn. Table narrowing decides, before each turn, which tables the model needs and shows it only those. Your own project rules are always on; the decision model is off until you turn it on.

What it does. Before the model is asked, the chat picks the tables for the question: first your project rules, then (if you turned it on) a decision model. Tables judged only possibly relevant stay in; so do the tables on the foreign-key path between selected tables (when the source's foreign keys are known) and, for a follow-up such as "and by genre?", the tables the previous turn used. The model is told the names of the tables that were left out and can read up to two of them per turn with the read-only describe_relation tool. The chat prints one line naming the tables the model was given, and the decision (engine, model, scores, tables before and after) is stored with the chat session.

What it costs and saves, honestly. Narrowing removes schema bytes from every request, but the model's request also holds fixed instructions and tool definitions, and a table the model was not shown can cost a describe_relation round trip, which re-sends the whole request. Measured on the 11-table Chinook sample, summed over every model call of a turn:

model calls input bytes vs no narrowing
no narrowing 2 22,059
narrowed to 3 of 11 tables 2 21,369 -3.1%
narrowed, and the model reads 1 omitted table 3 32,785 +48.6%

The schema context alone goes from 1,829 to 1,111 bytes (-39%, the note naming the omitted tables included). The saving grows with the schema (hundreds of tables, wide tables) and is small on a schema as small as Chinook's. Narrowing is applied only when the narrowed context is at least 25% smaller than the full one; otherwise the full schema is kept. It is not a guarantee of a better answer: a wrong narrowing is possible, which is why the omitted tables are named and readable.

When it cannot decide, the chat sends the full schema, exactly as it did without narrowing: the decision model is off, slow (more than 1.5 s by default), failing, refused (allowance spent, wrong endpoint), unsure, incomplete, the schema is larger than 255 tables, or the narrowing would save less than 25%. After a failure the decision model is not asked again for five minutes.

Project rules (local, always on). <project>/ai/table-rules.yaml (the format is provisional, until the decision layer is specified):

decision: auto            # a REQUEST for the decision model; see below. disabled (default) | auto | cloud
rules:
  - phrase: Which countries buy the most music?   # exact question; case, spacing, trailing ?!. ignored
    tables: [Invoice, Customer]                   # exact table names

A matching rule decides on its own and nothing leaves your machine. A rule that names a table the schema does not have, or has an unknown key, is reported as a warning when the chat starts and never fires. A malformed file, a symbolic link, a directory in its place or a file over 64 KiB is ignored with a warning; the chat starts anyway.

The decision model (off until you turn it on). With --model cloud the chat can ask the DataTug AI cloud, which relays to TypeSafe AI's Jev decision model (an external model, not an LLM: it scores each table's relevance). When it is on, this is sent to the DataTug cloud and from there to TypeSafe AI:

  • your question, and up to the three earlier questions of the session that were asked while it was on (verbatim);
  • every table name, with its column names (no column types, no rows, no values);
  • the usual identifiers the cloud client already sends: an interaction id, your installation id and client version, and your sign-in token, which authenticates you to the DataTug cloud.

Only you can turn it on, so that opening a cloned repository never starts forwarding your questions:

  • DATATUG_AI_DECISION_PROVIDER=auto (or cloud, the same plus a warning when the chat is not using --model cloud) turns it on for that session. DATATUG_AI_DECISION_PROVIDER=disabled always wins over everything below.
  • datatug chat --cloud-decision allow records your consent for this project (identified by its directory, so a copy elsewhere does not inherit it, and a project you move or rename needs consent again) in datatug/decision-consent.json in your user config directory, outside the project. --cloud-decision refuse records a refusal; --cloud-decision forget removes the record.
  • A project's own decision: auto|cloud only requests it. Without your consent it is ignored, and the chat prints one line at start saying so, what would be sent and to whom, and the commands above.

Whenever it is on, the chat shows one line at start, as a system line at the top of the chat (the terminal UI hides anything printed before it starts) and on stderr for non-interactive runs, naming where the setting came from, what is sent to whom, and how to turn it off. Rule and configuration warnings appear the same way. These lines are not messages: they are not stored in the session and never sent to the model. DATATUG_AI_DECISION_TIMEOUT (a Go duration, default 1500ms) sets how long it may take per turn. It is off by default pending a decision on how TypeSafe AI may handle this data.

Telemetry for a decision carries counts and the engine and model ids only (for example narrowed:before=11:after=3), never table names or question text, and is sent only when a decision was actually made.

What it is and why?

This is an agent service for https://datatug.app that you can run on your local machine, or some server to allow DataTug app to scan databases & execute SQL requests.

It can be run with your user account credentials (e.g. trusted connection) or under some service account.

Would you steal my data?

No, we won't.

The project is free and open source codes available at https://github.com/datatug/datatug. You are welcome to check - we do not look into your data.

The CLI does send a small amount of anonymous usage telemetry, which you can switch off: see Telemetry.

Telemetry

What is sent. The CLI sends anonymous usage events and crash reports to PostHog (eu.i.posthog.com), through pkg/dtlog, the only code in this repository that can send them. We use them to learn how often the CLI is run, which screens are opened and where it crashes, so we can fix what people hit. With telemetry on the CLI also fetches its PostHog project key from raw.githubusercontent.com, once a day when that succeeds (it is retried on each run until it does): that request carries no data of yours (GitHub sees the IP address it comes from, as any web server does), and it is not made when telemetry is off.

Event When Fields it carries
DataTug CLI started a command starts the common fields below
DataTug CLI exited a command ends the common fields below
Screen opened a screen of the terminal UI opens the common fields, $app_name (DataTug), $app_version, $screen_id and $screen_name (fixed labels of DataTug's own screens, such as viewers/sqlite and SQLite Viewer)
$exception (crash report) the CLI crashes with a panic distinct_id, the SDK and system fields below, and one exception: its type (panic), its value (the Go type of the panic value, such as string or *errors.errorString; for a crash of the Go runtime itself, such as an index out of range, its message, which names numbers and types only) and its stack: function names, source file names (no directory), line numbers and code addresses; and $debug_images: the type, build id, load address, link address, size and architecture of the executable (not its path)

The common fields: uuid (a random id of the event), distinct_id (a random id of this install, kept in ~/datatug/.posthog.yaml), timestamp, the session ($session_id, $session_start_time, $session_duration), and what the PostHog Go SDK adds: $lib, $lib_version, $os, $os_version, $os_distro, $go_version, $geoip_disable and $is_server. $geoip_disable asks PostHog not to look up your location; as for any web request, PostHog's server still receives the IP address the request comes from.

What is not sent. No database content, no query text, no project or database name, no path, no host, no user name, no command-line argument and no credential. The text of a panic is not sent either, because it can hold a path or a host: it goes to stderr and to the local log only. A test builds each event as pkg/dtlog hands it to the PostHog client and fails when its fields change, so this list cannot drift from the code, and another test fails when any other package imports the PostHog client. The notice is checked by tests for the claims it makes about the fields (such as which event carries the DataTug version), and by a reader against this list when either changes.

The first run. The first time the CLI runs with telemetry on in a terminal (stderr is a terminal) it prints a notice on stderr (at most six lines) saying the above in brief, and nothing is sent on that run. Events start with the next run. The notice is printed once per user: the CLI records that it was shown in the file ~/datatug/.telemetry-notice-shown (delete it to see the notice again). If that file cannot be written the notice is printed again next time, and the run does not fail. A run whose stderr is not a terminal (a script, a service, shell completion with 2>/dev/null) tells nobody, so it prints nothing, writes no marker and sends nothing: the notice waits for the first run in a terminal. The same holds when the home folder cannot be resolved (a service without a home): nothing is created and nothing is sent.

Turn it off. Telemetry is on only when DATATUG_TELEMETRY is empty or one of 1, true, on, yes; any other value turns it off, so a typo never leaves you measured. Any one of these turns telemetry off completely: no notice, no client, no request, no file:

DATATUG_TELEMETRY=0     # 0, false, off, no, or any value other than 1, true, on, yes
DO_NOT_TRACK=1          # any value but empty or 0 (https://consoledonottrack.com)
CI=true                 # any value but empty or false: set by most CI systems

A variable set in one terminal is gone in the next. To turn telemetry off for good, add export DATATUG_TELEMETRY=0 to your shell profile (~/.zshrc, ~/.bashrc), or on Windows run setx DATATUG_TELEMETRY 0 once. datatug --help names the variable too. datatug version --json never sends telemetry, whatever you set.

Chat with the DataTug cloud AI. datatug chat --model cloud is your choice to use the DataTug cloud AI service: your questions go to it to be answered, whatever the switch says, because that is what the command does. It also sends a metadata report of each turn (the length of your message in characters and words, its status and outcome, the names of the actions that ran, the conversation id, a random id of the turn, the client type and feature labels, and your install id, OS, CPU architecture and DataTug version; not the text of your question and not your rows). That report is usage telemetry and follows the same switch: with DATATUG_TELEMETRY, DO_NOT_TRACK or CI turning telemetry off, or on the first run, it is not sent. Its install id is a different random id from the one above, kept in datatug/installation_id in your user configuration folder (os.UserConfigDir). Chat with your own AI profile reports nowhere.

Where are metadata stored?

When DataTug agent scans or compare your database it stores meta information in a datatug project as set of simple to understand & easy to compare JSON files.

We recommend to check-in the project to some source versioning control system like GIT.

You can run commands for different projects by passing path to DataTugProject folder. E.g.:

> datatug show --project ~/my-datatug-projects/DemoProject

Paths to the DataTug project files, and their names are stored in ~/datatug.yaml in the root of your user's home directory. This allows you to address a DataTug project in a console using a short alias. Like this:

> datatug show -p DemoProject

If the current directory is a DataTug project folder you don't need to specify project name or path.

> datatug show

How to get the DataTug CLI?

Use one of the supported methods in Installation. None requires Go.

Then verify the installed CLI:

> datatug --help

How to run?

Check the CLI section on how to run DataTug agent.

Supported databases

At the moment we any DB supported by DALgo. Like:

Supported sql Databases:

Datatug can work with sql DBs if a relevant driver has been linked into datatug

  • SQLite - via github.com/mattn/go-sqlite3
  • Microsoft SQL Server - via go-mssqldb
  • PostgreSQL - via dalgo2postgres. datatug scan -D postgres --dsn-env DATATUG_SHOP_PG_URL --db shop --env local reads the connection URL from the environment variable (it is never written to the project) and saves every schema the role can use, the system schemas apart: tables, views and materialized views (as views), columns with their defaults (the text of the SQL expression) and primary keys, a folder for each schema. The scan does not save foreign keys or indexes yet.

We are open for pull requests to support other sql DBs.

For developers

Read README-dev.md for details on how to setup, debug, and contribute; the terminal UI architecture (shell, widgets, grid, navtest) is summarised there and explained in tui-screens.md.

Sample Databases

By Database Platform
Northwind Database

Open Source Libraries we use

Contributing

We welcome contributions to DataTug! Please read our contributing guidelines for more information on how to contribute to the project.

Download

http://datatug.app/download

License

Apache License

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
datatugapp/datatugui
Package datatugui is the application layer of the DataTug terminal UI: the registry of root modules, the shared main menu, the Bubble Tea app model that hosts the tuigoff navigation shell, and the helpers every screen uses.
Package datatugui is the application layer of the DataTug terminal UI: the registry of root modules, the shared main menu, the Bubble Tea app model that hosts the tuigoff navigation shell, and the helpers every screen uses.
datatugapp/datatugui/dtapiservice
Package dtapiservice is the API Monitor screen of the DataTug terminal UI.
Package dtapiservice is the API Monitor screen of the DataTug terminal UI.
datatugapp/datatugui/dtproject
Package dtproject is the Projects module of the DataTug terminal UI: the list of local and GitHub projects, the screens of an open project, the wizard that creates a project and the flow that adds DataTug to an existing GitHub repository.
Package dtproject is the Projects module of the DataTug terminal UI: the list of local and GitHub projects, the screens of an open project, the wizard that creates a project and the flow that adds DataTug to an existing GitHub repository.
datatugapp/datatugui/dtsettings
Package dtsettings is the Settings screen of the DataTug terminal UI: the config file, syntax highlighted.
Package dtsettings is the Settings screen of the DataTug terminal UI: the config file, syntax highlighted.
datatugapp/datatugui/dtviewers/clouds
Package clouds holds what the cloud viewers (Google Cloud, AWS, Azure) share.
Package clouds holds what the cloud viewers (Google Cloud, AWS, Azure) share.
datatugapp/datatugui/dtviewers/clouds/aws/awsui
Package awsui is the Amazon Web Services viewer.
Package awsui is the Amazon Web Services viewer.
datatugapp/datatugui/dtviewers/clouds/azure/azureui
Package azureui is the Microsoft Azure viewer.
Package azureui is the Microsoft Azure viewer.
datatugapp/datatugui/dtviewers/clouds/gcloud/gcloudui
Package gcloudui is the Google Cloud viewer: projects, credentials and the Firestore databases of a project.
Package gcloudui is the Google Cloud viewer: projects, credentials and the Firestore databases of a project.
datatugapp/datatugui/dtviewers/dbviewer
Package dbviewer is the DB viewer of the Viewers module: a chooser of database kinds, the SQLite and inGitDB home screens, and the browser of one database (tables and views, their columns, foreign keys, referrers and content).
Package dbviewer is the DB viewer of the Viewers module: a chooser of database kinds, the SQLite and inGitDB home screens, and the browser of one database (tables and views, their columns, foreign keys, referrers and content).
internal
hermetictest
Package hermetictest gives every test binary in this module the same guarantee: nothing a test runs can read or write the real developer's home, XDG config, or XDG cache directories.
Package hermetictest gives every test binary in this module the same guarantee: nothing a test runs can read or write the real developer's home, XDG config, or XDG cache directories.
pgstandin
Package pgstandin gives the tests of this module a PostgreSQL database that has no server: a real *dalgo2postgres.Database whose connection pool lost its server, so that every call that needs a connection fails the way a read fails when the server was restarted, the password was changed or the connection limit was reached: with the error pgx writes, which names the user and holds the whole configuration.
Package pgstandin gives the tests of this module a PostgreSQL database that has no server: a real *dalgo2postgres.Database whose connection pool lost its server, so that every call that needs a connection fails the way a read fails when the server was restarted, the password was changed or the connection limit was reached: with the error pgx writes, which names the user and holds the whole configuration.
plainfs
Package plainfs writes, reads, renames and removes files and folders inside a project folder only as plain files in plain folders.
Package plainfs writes, reads, renames and removes files and folders inside a project folder only as plain files in plain folders.
sourcecases
Package sourcecases generates the source strings the DT-0C property test feeds to every command path that takes a source: every scheme the CLI knows, in lower, upper and mixed case, bare and wrapped in another scheme, with a generated secret in each position a parser can read as userinfo or a user can put one: userinfo (with and without a user name), a token standing alone as the user name, the position a parser misreads as userinfo ("alice:42/secret@"), a token or a user name that holds a slash (so no colon or "@" comes before a slash), userinfo after a UNC start ("\\alice:secret@"), a user name with a slash after a UNC start, a token as the user name straight after a UNC start and after a UNC start and one more separator (a backslash or a slash), a second URL written after an explicit path start ("/" or "./") that holds the userinfo, the query string and the fragment.
Package sourcecases generates the source strings the DT-0C property test feeds to every command path that takes a source: every scheme the CLI knows, in lower, upper and mixed case, bare and wrapped in another scheme, with a generated secret in each position a parser can read as userinfo or a user can put one: userinfo (with and without a user name), a token standing alone as the user name, the position a parser misreads as userinfo ("alice:42/secret@"), a token or a user name that holds a slash (so no colon or "@" comes before a slash), userinfo after a UNC start ("\\alice:secret@"), a user name with a slash after a UNC start, a token as the user name straight after a UNC start and after a UNC start and one more separator (a backslash or a slash), a second URL written after an explicit path start ("/" or "./") that holds the userinfo, the query string and the fragment.
pkg
accesspolicies
Package accesspolicies discovers and decodes the DALgo access policies a DataTug user keeps on disk, runs a query through them as a secured application would, and explains what the policies did to that query.
Package accesspolicies discovers and decodes the DALgo access policies a DataTug user keeps on disk, runs a query through them as a secured application would, and explains what the policies did to that query.
api
auth/device
Package device provides DataTug's shared auth.sneat.co device-login command.
Package device provides DataTug's shared auth.sneat.co device-login command.
chat
Package chat implements DataTug Chat: an aichat agent loop produces DTQL, DataTug executes it into structured results, and session-owned RecordSets persist those results independently of the model provider's memory.
Package chat implements DataTug Chat: an aichat agent loop produces DTQL, DataTug executes it into structured results, and session-owned RecordSets persist those results independently of the model provider's memory.
chat/narrowing
Package narrowing decides, before a chat turn reaches the AI model, which of a project's tables the model needs to see.
Package narrowing decides, before a chat turn reaches the AI model, which of a project's tables the model needs to see.
chat/narrowing/narrowingtest
Package narrowingtest holds the fixtures the narrowing tests share: the Chinook schema (11 tables) and a fake decision engine standing in for Jev (Scorer).
Package narrowingtest holds the fixtures the narrowing tests share: the Chinook schema (11 tables) and a fake decision engine standing in for Jev (Scorer).
dbcopy
Package dbcopy implements the `datatug db copy` cross-engine database copy primitive.
Package dbcopy implements the `datatug db copy` cross-engine database copy primitive.
dbcopy/filter
Package filter — CLI mini-syntax parsers.
Package filter — CLI mini-syntax parsers.
dtentity
Package dtentity provides JSON encode/decode for *datatug.Entity that correctly round-trips Tables (the "generated mapping copy") - see TableKeyDoc for why the model's own JSON tags can't do this in datatug-core v0.17.0.
Package dtentity provides JSON encode/decode for *datatug.Entity that correctly round-trips Tables (the "generated mapping copy") - see TableKeyDoc for why the model's own JSON tags can't do this in datatug-core v0.17.0.
dtroot
Package dtroot resolves the CLI-local data directory (~/datatug), used for CLI-only state and the "clone GitHub projects under here" convention.
Package dtroot resolves the CLI-local data directory (~/datatug), used for CLI-only state and the "clone GitHub projects under here" convention.
executionstore
Package executionstore composes immutable repository-backed execution receipts with server-private SQLite snapshot bytes and lifecycle state.
Package executionstore composes immutable repository-backed execution receipts with server-private SQLite snapshot bytes and lifecycle state.
httpsource
Package httpsource translates a datatug project's HTTP-type QueryDefs into a dalgo2http-backed dal.DB: one dalgo2http.Collection per query (see BuildCollection for the translation and its sensible-default policy for RowsPath/KeyField, since the QueryDef JSON schema does not yet carry those explicitly), snapshot fallback wired to the project's fixtures/http/ directory (see fixtureFS for how its flatly-named fixture files are bridged to dalgo2http's per-request snapshot keying), live-then-snapshot mode.
Package httpsource translates a datatug project's HTTP-type QueryDefs into a dalgo2http-backed dal.DB: one dalgo2http.Collection per query (see BuildCollection for the translation and its sensible-default policy for RowsPath/KeyField, since the QueryDef JSON schema does not yet carry those explicitly), snapshot fallback wired to the project's fixtures/http/ directory (see fixtureFS for how its flatly-named fixture files are bridged to dalgo2http's per-request snapshot keying), live-then-snapshot mode.
incidentstore
Package incidentstore persists the Incidentius event stream in a repository.
Package incidentstore persists the Incidentius event stream in a repository.
personalqueries
Package personalqueries resolves the on-disk directory a principal's personal (never-shared) queries live under for `datatug serve` — see ResolveProjectDir.
Package personalqueries resolves the on-disk directory a principal's personal (never-shared) queries live under for `datatug serve` — see ResolveProjectDir.
querywrite
Package querywrite holds the guards every saved-query write path of this agent shares - the legacy queries/create_query, update_query and delete_query routes and queries/capture - so each check has one definition, whichever route a write takes.
Package querywrite holds the guards every saved-query write path of this agent shares - the legacy queries/create_query, update_query and delete_query routes and queries/capture - so each check has one definition, whichever route a write takes.
schemers/dalgoschema
Package dalgoschema is a schemer.SchemaProvider built on DALgo's dbschema.SchemaReader, so one scanner serves every database whose DALgo adapter can read its own schema.
Package dalgoschema is a schemer.SchemaProvider built on DALgo's dbschema.SchemaReader, so one scanner serves every database whose DALgo adapter can read its own schema.
secureread
Package secureread is the policy-enforced read executor for the DataTug agent server (`datatug serve`).
Package secureread is the policy-enforced read executor for the DataTug agent server (`datatug serve`).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL