Necessary to consistent with changes introduced when adding import support so that the top level form key is `design` instead of `template`.
Milestone: patch
Necessary to import an exported (zip file) design. The full implementation is included as a single commit to capture the details of how this works. Here's the breakdown:
* *Import Action*: Creates a new screen template based on the model ID and associated zip file content that is uploaded.
* *Import Partial*: The `_import` partial provides the form within a popover via the index page to collect details from the user. This is also why the `index` template has been updated to link to the popover and also why the index view supplies the models.
In the future, reduce the responsibility of loading the models on the index view and use a import new action instead.
Milestone: minor
This reverts commit 5e9ab0cf02 (Removed screen and firmware struct attachment replace behavior, 2026-08-03) because you can't reliably have link:https://shrinerb.com[Shrine] upload a replacable image. We still need to have distinct methods for `#replace` and `#upload`.
This also prevents duplicate images being created.
Milestone: patch
We can safely remove the `#remove` method in favor of using `#upload` for everything now that we conditionally destroy the record only if found and the `*_data` key exists. This also updates firmware attachment behavior to mimic screen attachment behavior in order to improve consistency.
Milestone: minor
Naming of these objects continues to be challenging but this refactors the renderers as generators because they are producing HTML content for building images. The actual rendering of content to HTML is handled by the Liquid renderer.
Issue: 352
Milestone: patch
link:https://github.com/simplecov-ruby/simplecov/blob/main/CHANGELOG.md#100-2026-07-12[Details]. This includes the following:
* My long standing bug has been fixed which allows for implicit elses to be ignored. This cleans up code related to using monads with pattern matching which is nice to see.
* We still can't enable ERB code coverage (this is why the templates are skipped). I've logged a few more new bugs on the SimpleCov side to tackle. This might take a while because I noticed Erik Berlin logged issues with Ruby core in order to make this possible.
* Use of the *strict* profile ensures all code committed to this project must be 100%. This also cleans up having to be explicit about this.
Milestone: patch
When header information is invalid or missing, we'll emphasize that the device's API key must be used. This helps clear up any ambiguity when resolving the issue.
Milestone: minor
Now that the model (payload) knows how to incorporate the device's API key, we'll use the API key in the response to ensure the response is always the same (especially when the device can be found).
Milestone: minor
No longer necessary now that we can use the Setup API to set the API key for a device. This means you can use either the model ID or, soon, the API key.
Issue: 347
Milestone: minor
As with done with the Display API, we'll delegate to the model to compute the MAC address when provisioning a device. This required refactoring the action to use a private provision device method.
The `HTTP_ID` missing header spec was deleted since this header is optional now.
Milestone: minor
Necessary to make the UI more responsive since we don't need to wait for the screen to be updated when saving content since the existing Server Sent Event will do this for us.
Milestone: minor
Necessary to edit an existing design. The associated screen is updated, in real-time, as changes are saved using Server Sent Events.
Issue: 321
Milestone: minor
We no longer need to update the associated screen as that'll soon be handled by the update action instead. So the changes applied here simplify this action to only focus on updating (or reporting errors) for the associated screen template.
Issue: 321
Milestone: minor
Necessary to create new designs. The welcome code is sourced from the welcome partial using an inline struct since Hanami doesn't provide a way to new up a database struct (which would be ideal).
Issue: 321
Milestone: minor