Skip to main content
Blinks

Making a Blink from inside a category

Open any Blink category and you will now see New Blink here in the header, beside Back, Edit and Delete. It opens the capture form with that category already chosen, so you can write the note and save without picking the category again.

Where it is

Blinks → Categories → any category. The button is in the same row as Back to Categories, Edit and Delete. On a phone it drops onto its own line rather than squeezing the others.

The category is pre-selected, not locked

It is filled in for you and you can still change it before saving, exactly as if you had chosen it by hand. Nothing is decided until you save the Blink.

Why it was added

From a bug report filed on a category page: "Right now I'm inside a specific category. Now I want to make a Blink under this category but I don't have the button right there. Make it easy to make a Blink under this category."

The header had every action except the one that page is actually for — you could go back, rename the category or delete it, but not add anything to it.

Goals, Projects and Businesses

Their category pages share the same header and do not have this button yet. That is deliberate rather than an oversight: the button only appears where there is a capture form that accepts a category, and a button that led nowhere would be worse than no button. Those modules can pick it up when they gain the same route.

They already have their own version of this, further down their detail pages: a "New Blink — will be linked to this project" form.

For developers

The link is ?open_blink_form=1&category=<pk> on the Blink dashboard, joining the existing ?calendar_date= prefill rather than adding a second capture path. The id is resolved by blink.services.owned_category_id(user, raw), which takes a user and a raw value rather than a request, so a native client can pre-select a category without an HTTP layer.

A pk that is not yours resolves to nothing. It arrives in a query string, so it is attacker-chosen; the form's own queryset is filtered by owner too, but the check lives beside the input so a later change to the form cannot remove it silently.

In the shared partial _shared/_category_detail.html, create_url and create_label are optional — omit them and the header renders exactly as before.

🪐 OrbitPilot