Motivation
The presigned URLs the backend rewrites into markdown media links and serves to the user's browser expire after a hardcoded 1 minute:
content_controller.py:124
url = content_store.get_presigned_url(object_key, expires=timedelta(minutes=1))
(inside _replace_with_presigned, invoked at content_controller.py:212).
1 minute is a reasonable secure default but too short for some deployments — large media still loading past expiry, slow client networks, and documents rendering many assets where later fetches race the TTL. Operators cannot tune it without editing source.
By contrast, the backend-internal tabular presigned TTL is already configurable: internal_presigned_ttl_seconds (default 3600s) at structures.py:878, exposed as storage.tabular_store.query.internal_presigned_ttl_seconds. The browser-facing TTL should follow the same established pattern.
Motivation
The presigned URLs the backend rewrites into markdown media links and serves to the user's browser expire after a hardcoded 1 minute:
content_controller.py:124
url = content_store.get_presigned_url(object_key, expires=timedelta(minutes=1))
(inside _replace_with_presigned, invoked at content_controller.py:212).
1 minute is a reasonable secure default but too short for some deployments — large media still loading past expiry, slow client networks, and documents rendering many assets where later fetches race the TTL. Operators cannot tune it without editing source.
By contrast, the backend-internal tabular presigned TTL is already configurable: internal_presigned_ttl_seconds (default 3600s) at structures.py:878, exposed as storage.tabular_store.query.internal_presigned_ttl_seconds. The browser-facing TTL should follow the same established pattern.