Skip to main content

shinyhub-bookmarks

Selective view links for Python Shiny apps running in ShinyHub, built on Shiny's URL-bookmarking API.

The package registers the filters an app author considers meaningful. ShinyHub then adds a Link to this view control to its app switcher. Visitors can copy the exact view immediately or use Change to choose which registered values follow the link. Unselected values return to the app's defaults when the link opens. The visible UI says “link”; package and API names retain “bookmark” to match Shiny's native lifecycle.

from shiny import App, render, ui
from shinyhub_bookmarks import ChoiceRestore, Field, bookmarking_dependency, register


def app_ui(request):
    return ui.page_fluid(
        bookmarking_dependency(),
        ui.input_select("region", "Region", ["Europe", "Americas", "Asia"]),
        ui.input_slider("year", "Year", 2020, 2026, 2026),
        ui.output_text_verbatim("summary"),
    )


def server(input, output, session):
    register(
        session=session,
        input=input,
        fields={
            "region": Field("Region"),
            "year": Field("Year"),
        },
    )

    @render.text
    def summary():
        return f"{input.region()} · {input.year()}"


app = App(app_ui, server, bookmark_store="url")

Both pieces are required: bookmarking_dependency() installs the tiny browser bridge, and register() publishes the allow-list and creates links through Shiny's native bookmarking API. The UI must be a function accepting request so Shiny can restore URL state before rendering it. Call register() exactly once from the top-level server session. Module inputs can be included by their resolved IDs in that top-level field mapping; module-scoped registration is rejected because selective exclusion is owned by the root bookmark session.

After a registered filter changes, the bridge also updates the current address after a short debounce. It replaces the current browser-history entry, so a refresh or ordinary browser bookmark reopens the same view without filling the Back button with every intermediate slider or text-input value. The explicit Link to this view action remains the place to exclude selected fields before sharing.

View links that outlive the app

Native Shiny restoration ignores a removed input, but a retired choice can otherwise become empty or fall back differently across widgets. Declare current choices when a bookmark should remain dependable across app releases:

register(
    session=session,
    input=input,
    legacy_fields={"segment": "Market segment"},
    fields={
        "region": Field(
            "Region",
            restore=ChoiceRestore(choices=REGIONS, default="Europe"),
            renamed_from={"territory": "Territory"},
        ),
        "product": Field(
            "Product",
            restore=ChoiceRestore(
                choices=lambda: PRODUCTS,
                default="All products",
                aliases={"Legacy planning": "Planning"},
                control="select",
            ),
        ),
    },
)

ChoiceRestore validates the saved value, applies aliases, and updates the current Shiny choice input. Supported controls are select, selectize, and radio. Multiple selections retain every choice that still exists, use the current display order, and preserve an empty selection. A missing declared default falls back to the valid value Shiny already selected.

renamed_from maps an old input ID to its former label and requires a ChoiceRestore policy so the saved value can actually be applied to the new control. legacy_fields names removed inputs that should be reported as ignored. The helper adds no package-specific schema or version metadata to the URL. Shiny may still include application-owned bookmark values when an app adds them through its own callbacks.

For a custom input whose live Python value differs from its JSON bookmark representation, pass an idempotent normalizer= to Field. It is applied to both sides before comparison; it does not change the value Shiny serializes or restores.

When anything changes, the switcher marks the link action and presents a plain-language Opened with changes receipt. It labels saved and opened values for migrated, unavailable, renamed, and removed fields, then offers Copy link to current view. The app still opens; stale state is never promoted into a blocking error.

An input that is neither registered nor declared as renamed or removed is shown with its URL-provided ID and saved value, labelled Not recognized. Both are rendered as bounded plain text. At most three unknown inputs are listed before a compact overflow summary. Copying the updated link drops every unknown setting, so the warning clears on the next visit.

Privacy and behaviour

  • The browser-local ShinyHub switcher receives the registered display values and generated URL so it can show the receipt and copy the link. After a registered value changes, all registered values also become part of the current browser URL so refresh works. The ShinyHub server neither receives nor persists bookmark state; selected values stay in Shiny's URL.
  • Every registered field is selected by default, including values equal to the app's current defaults. The receipt makes that scope explicit before copying.
  • App inputs not registered here are always excluded.
  • A view link with no selected fields cannot be created.
  • URLs over 8 KiB are rejected by default. Raise max_url_length only when the complete delivery path is known to accept longer URLs.
  • The control stays absent when the bridge is not installed, so unsupported apps never show a dead action.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

shinyhub_bookmarks-0.4.0.tar.gz (21.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

shinyhub_bookmarks-0.4.0-py3-none-any.whl (16.2 kB view details)

Uploaded Python 3

File details

Details for the file shinyhub_bookmarks-0.4.0.tar.gz.

File metadata

  • Download URL: shinyhub_bookmarks-0.4.0.tar.gz
  • Upload date:
  • Size: 21.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for shinyhub_bookmarks-0.4.0.tar.gz
Algorithm Hash digest
SHA256 4ac28e064d305b674e652c541ee700b9a1001cb52a76dcef6607e95b446fb3a5
MD5 9f7572647b39f5fe97233a3cce9d0687
BLAKE2b-256 8a7d38fa83a34d47209dc984eecb674c4a14c25b69cc29a29ca0a9573a9ecc04

See more details on using hashes here.

Provenance

The following attestation bundles were made for shinyhub_bookmarks-0.4.0.tar.gz:

Publisher: publish-bookmarks.yml on rvben/shinyhub

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file shinyhub_bookmarks-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: shinyhub_bookmarks-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 16.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for shinyhub_bookmarks-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 27b1ca6b9654cdb4b3cdb380a67bd74b1a51d9cdff72f3e5812b016b375703b5
MD5 5e480ecaf3f60cef69767a4909068a54
BLAKE2b-256 26f50fc90ee2d39147d317fa2e7b1ceaa10f52a1d7dd72ebeec8efdcf09593ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for shinyhub_bookmarks-0.4.0-py3-none-any.whl:

Publisher: publish-bookmarks.yml on rvben/shinyhub

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.5.1

2 files

0.5.0

2 files

This release

0.4.0 This release

2 files

0.3.0

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page