shinyhub-bookmarks
Selective URL bookmarks for Python Shiny apps running in ShinyHub.
The package registers the filters an app author considers meaningful. ShinyHub then adds a Bookmark this view control to its app switcher. Visitors see a plain-language receipt, can copy the exact view immediately, or customise which registered filters follow the link. Unselected filters return to the app's defaults when the bookmark opens.
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.
Bookmarks 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,
schema_version=3,
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. Every new link records the app's schema_version; older links without
metadata remain supported.
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 bookmark action and presents a plain-language View adjusted receipt. It names migrated, unavailable, renamed, and removed filters and offers Copy updated link. 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 Unknown. 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. 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 custom bookmark with no selected fields cannot be created.
- URLs over 8 KiB are rejected by default. Raise
max_url_lengthonly 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file shinyhub_bookmarks-0.2.2.tar.gz.
File metadata
- Download URL: shinyhub_bookmarks-0.2.2.tar.gz
- Upload date:
- Size: 17.2 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b9f516e8323c875bc9d37da6c25c8c584c6655f12bd0123878ecc970995185e6
|
|
| MD5 |
b1cc705305f5229af5dc6f2d55c5428d
|
|
| BLAKE2b-256 |
91a6fef192ec744c8fbd2935d6b1d0caf21391b49794e406cf3d229a7e0d52ee
|
Provenance
The following attestation bundles were made for shinyhub_bookmarks-0.2.2.tar.gz:
Publisher:
publish-bookmarks.yml on rvben/shinyhub
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
shinyhub_bookmarks-0.2.2.tar.gz -
Subject digest:
b9f516e8323c875bc9d37da6c25c8c584c6655f12bd0123878ecc970995185e6 - Sigstore transparency entry: 2617893830
- Sigstore integration time:
-
Permalink:
rvben/shinyhub@a69fd7a342c49c78958252c5fbc2177f1f09b77c -
Branch / Tag:
refs/tags/shinyhub-bookmarks-v0.2.2 - Owner: https://github.com/rvben
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-bookmarks.yml@a69fd7a342c49c78958252c5fbc2177f1f09b77c -
Trigger Event:
push
-
Statement type:
File details
Details for the file shinyhub_bookmarks-0.2.2-py3-none-any.whl.
File metadata
- Download URL: shinyhub_bookmarks-0.2.2-py3-none-any.whl
- Upload date:
- Size: 13.3 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d8fdac507e37c2b1b9cfbc1333382fbec7395921439087571b38805ec49d29b
|
|
| MD5 |
a052fc3e8121e8fe84f49e7364899e05
|
|
| BLAKE2b-256 |
47d1b93789050f15bf86cf779fa887438875a5184eb6d2af3afd0e3d5f9998b2
|
Provenance
The following attestation bundles were made for shinyhub_bookmarks-0.2.2-py3-none-any.whl:
Publisher:
publish-bookmarks.yml on rvben/shinyhub
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
shinyhub_bookmarks-0.2.2-py3-none-any.whl -
Subject digest:
9d8fdac507e37c2b1b9cfbc1333382fbec7395921439087571b38805ec49d29b - Sigstore transparency entry: 2617893836
- Sigstore integration time:
-
Permalink:
rvben/shinyhub@a69fd7a342c49c78958252c5fbc2177f1f09b77c -
Branch / Tag:
refs/tags/shinyhub-bookmarks-v0.2.2 - Owner: https://github.com/rvben
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-bookmarks.yml@a69fd7a342c49c78958252c5fbc2177f1f09b77c -
Trigger Event:
push
-
Statement type: