Skip to content

v0.1.0

Choose a tag to compare

@syafa-bot syafa-bot released this 02 Nov 11:34
Immutable release. Only release title and notes can be modified.
1d03a26

0.1.0 (2026-11-02)

Features

  • api: keep the code and the wait time of an API error (1dbc9bb)
  • api: send the X-Requested-With header on every request that changes data (7274549)
  • api: send the X-Requested-With header on every request that changes data (#52) (fa112f1)
  • app: add Storybook with the accessibility add-on (e6a1f0f)
  • app: add the Alat list, device detail and rename screens (c256fcb)
  • app: add the Alat list, the detail of a device and the form to rename it (0ac4d1f)
  • app: add the API client and the query client (5013f78)
  • app: add the API client and the query client (30f3126)
  • app: add the app shell, router and Rubik text styles (a0e8278)
  • app: add the Beranda screen (d07c01c)
  • app: add the Beranda screen with its loading, error, empty, offline and collecting states (a09e796)
  • app: add the data hooks of the home screen (fa12dd4)
  • app: add the date picker, typing in the number stepper and the Produksi screen (3157bd3)
  • app: add the device data hooks and the power formats (51932b0)
  • app: add the Figma design tokens as CSS variables (e268aad)
  • app: add the Figma design tokens as CSS variables with Light and Dark themes (124d690)
  • app: add the Lainnya menu and the Pengaturan screens (328f2cf)
  • app: add the Lainnya menu and the Pengaturan screens (efed0ca)
  • app: add the Laporan screen with the period, the savings and the PDF download (8b64801)
  • app: add the Laporan screen with the savings, the period and the PDF download (5799a48)
  • app: add the Masuk and Daftar screens with the forms disabled (6c1d22c)
  • app: add the Masuk and Daftar screens with the forms disabled until the login exists (3515444)
  • app: add the number and date formats and the connection hook (1277a86)
  • app: add the Produksi screen, the date picker and typing in the number stepper (3267750)
  • app: add the Saran data hooks, the section card and the media query hook (9848d24)
  • app: add the Saran list, the detail of a tip and the question before a record is removed (9b53d23)
  • app: add the Saran screens (64ec405)
  • app: add the Tambah alat steps from the kind of device to the search (f8b2b75)
  • app: add the Tambah alat steps from the kind of device to the search (a2c73f6)
  • app: add the text styles, the app shell and a not found page (e4af0df)
  • app: call the app WATTLINK in the titles, the menu and the sign-in screens (da08f27)
  • app: call the app WATTLINK in the titles, the menu and the sign-in screens (#47) (66446f2)
  • app: configure Storybook and add a story for the app (e15ba8f)
  • app: link the empty states and the lists to Tambah alat, Catat produksi and the tariff (4e875b5)
  • app: link the empty states and the lists to Tambah alat, Catat produksi and the tariff setting (1266cbc)
  • app: load the Sentry SDK on demand and read the environment name from the build settings (6bbb584)
  • app: report errors to Sentry and show an error page when a route throws (#44) (84ff8e1)
  • app: scaffold the React app (a6e6564)
  • app: scaffold the React app with Vite, Tailwind and Vitest (3933264)
  • app: show a loading bar and a live note while the next page loads (d2dd48d)
  • app: show a loading bar while the next page loads (#40) (bd7feb9)
  • app: show an error page when a route throws and report the error (ba7b5e4)
  • app: tell a plug user to keep the machine under the rating of the plug (16807c1)
  • app: tell a plug user to keep the machine under the rating of the plug (#39) (16ced7b)
  • auth: add forgot and reset password screens (#57) (7755e08)
  • auth: add sign in, sign up and email verification screens (ce77e95)
  • auth: add sign in, sign up and email verification screens (#55) (a14cb10)
  • auth: add the screens to ask for a reset link and to set a new password (d63f999)
  • auth: add the session query, sign out and the rule for a 401 (7d39d8b)
  • auth: guard the screens of the app and add sign out (#56) (828f32a)
  • auth: guard the screens of the app and add the Keluar screen (4a41cab)
  • docker: add the app image with nginx and check it in CI (b74fe9d)
  • docker: add the image with nginx, the web server config and a compose file (82cd83d)
  • hosting: add the Cloudflare Pages redirect and security headers (350106e)
  • ui: add the bar chart, the power chart and the forecast chart (f8d2c4a)
  • ui: add the basic components (1d9cc6b)
  • ui: add the button, tag, status dot, card, banner, list row and empty state components (710e9fa)
  • ui: add the chart components (41a7fc4)
  • ui: add the form components (166f050)
  • ui: add the page header, the recommendation card and the before and after block (27b04ea)
  • ui: add the text input, select, checkbox, segmented control and number stepper (e55f351)
  • ui: let the recommendation card link to a detail and take its own buttons (a6554f5)

Bug Fixes

  • api: word the header rule as the contract does and keep the comment under 120 characters (a947f0a)
  • app: add the Indonesian words of the backend device labels to the spell check (819f42e)
  • app: add the status words of the devices to the spelling words (983e524)
  • app: allow the EU ingest host of Sentry in the content security policy (65b6f48)
  • app: announce the stepper value, show the limit at once, wrap the sheet and keep one save at a time (113ed4a)
  • app: call the plug and the clamp WATTLINK Plug and WATTLINK Clamp (74dc350)
  • app: call the plug and the clamp WATTLINK Plug and WATTLINK Clamp (#58) (6f402ba)
  • app: check that a downloaded report starts like a PDF (5a23868)
  • app: check the asked month, stop a download that was left and refuse a file that is not a PDF (887013e)
  • app: check values in the token test, add color-scheme and two words for cspell (892a17a)
  • app: create the router once, move the focus after a navigation and list the menu items (6ddf732)
  • app: delay the note, keep the delay for reduced motion and show the indicator on the auth screens (031ffa9)
  • app: detect an abort by its name so that an error from another realm passes (62ac6df)
  • app: drop the null checks that the Node config does not need (5b7de9e)
  • app: focus the error page, offer plain links, ask for the connection and skip responses such as a 404 (e807f67)
  • app: import the filter options again and type the matchMedia stub (d37cbce)
  • app: keep build and body errors out of the lost connection and skip a retry of a bad shape (73a56b9)
  • app: keep real room under the floating button, put it last in the tab order and show Tambah alat once (baeac6c)
  • app: keep the Alat filter, wrap long names, link back from the banners and refocus after a failed save (df8df63)
  • app: keep the filter when a tip opens, guard the cancel page and say when a decision fails (354a20a)
  • app: keep the matchMedia stub inside the window guard and wait for the loading state (380ec9f)
  • app: keep the product name link inside the menu landmark (6091d60)
  • app: keep the production button on the wide Alat screen while a device is open (d46ffb9)
  • app: keep the setup of the tests off the window in the node tests and drop the arrow key test that jsdom cannot run (71cc1af)
  • app: keep the spelling skips on one line and cover templates and JSX expressions (91b4287)
  • app: keep the wizard context out of the layout file and read the request body as text in the test (2f29bfe)
  • app: link the auth notice to the disabled controls and the brand to the home page (020f6aa)
  • app: list the flag letters of the regular expression pattern as a word (b295a46)
  • app: list the Storybook files by pattern so the linter finds them (e4ec508)
  • app: move the pending hook out of the component file for fast refresh (cc8f2ff)
  • app: move the Saran filter helpers out of the view file and drop the deprecated media query listeners (fae3e0d)
  • app: name the tip in its buttons, read the day of the business, show 4 devices and keep the page within its width (459cb8e)
  • app: narrow the anomaly of the chart, move the Alat filter helpers and fix the Alat tests (8ae239d)
  • app: pass the telemetry flag in the Storybook scripts (dda7625)
  • app: point the production API at aethera-api.syafahadyan.com (bcd01b8)
  • app: point the production API at aethera-api.syafahadyan.com (5e58d1e)
  • app: read the last day of the Laporan month by the clock of the business (db7eef0)
  • app: read the moments of the devices by the clock of the business (11ab8d0)
  • app: read the tokens file in a Node test because Vitest does not return raw CSS (d397174)
  • app: read today by the clock of the business in the Alat detail (decc820)
  • app: refuse a decimal tariff, keep the default tariff on an unchanged save and wrap long row values (76255b5)
  • app: replace the name step, keep the search on a failed poll and say when a new search fails (2895bdb)
  • app: report every error the route boundary shows, because a render error is never a response (602104b)
  • app: satisfy lint and the unit tests, and look for the heading that the Beranda page shows (f036e95)
  • app: say when a decision fails, when the page opens offline and fit the charts to a narrow screen (07f98e6)
  • app: send Kembali on the Produksi page to the home page until the Lainnya menu exists (698fb7b)
  • app: send Kembali on the Produksi page to the Lainnya menu that now exists (cb1d580)
  • app: show the heading of Catat produksi when the records cannot load (22b32f7)
  • app: skip escaped templates and regular expression literals and narrow the JSX text patterns (7083569)
  • app: skip plain Indonesian text lines and add the Indonesian words to the spelling check (5170d48)
  • app: skip the Indonesian screen text in code when checking the spelling (15997e0)
  • app: skip the reload while offline, reload once a minute and leave other errors alone (0e268cc)
  • app: stub the ResizeObserver and the network before each test again (32ab07c)
  • app: turn off the data the Sentry SDK collects by default and keep its code in a chunk of its own (16f04fa)
  • app: turn off the Storybook telemetry and name the docgen plugin in the audit note (74d6868)
  • app: type the form event of the edit screens and read the saved state without an any (29f16a5)
  • app: use an interface and the error option in the env check (eeb0bf5)
  • app: use an optional chain to compare the saved values with the screen (057fc28)
  • app: use the narrowed anomaly in the legend and import the device filter options (4e1e69d)
  • app: use the product name in the plug consent text and the offline banner (ee74ed0)
  • app: use the query method of the client in the connection test (eefd222)
  • app: use the renamed staging API host in the CSP and the compose default (5820230)
  • app: use the renamed staging API host in the CSP and the compose default (#43) (baaccfd)
  • app: wait for the digits below the minimum and confirm only the values that were saved (2a636c5)
  • assert the median Lighthouse score of the three runs (28d4084)
  • auth: clear the session from the hook and raise the all chunks limit to 260 kB (748bd25)
  • auth: fix the spell check, the lazy route test, the e2e label match and the wait of a negative value (8b7d894)
  • auth: keep the focus while a call runs and cover the cases that the review named (5caa007)
  • auth: keep the sign out running after Batal and restart the session read on a 401 (0b18d30)
  • auth: move the focus after the reset, confirm a resent link and drop the cached session (6b32c28)
  • auth: read the open screens again after a reset instead of removing their queries (caeb7e3)
  • auth: remount the screens when the session names another user (8abd9f6)
  • auth: reset the queries of the first user and keep the fragment of the address (fe5499c)
  • auth: sign out in the right order and handle another user in the session, plus the review findings (6fde71c)
  • auth: treat every 429 of a resend as a wait and keep the retry button for a limited verification (ea119a0)
  • ci: add the awk function toupper to the cspell words (4e8ee59)
  • ci: add the release tags only after both SBOMs are attested (fcf0b4f)
  • ci: add the software dictionaries and the remaining names to cspell (c73157c)
  • ci: add the tags only after the signature is verified, attest an SBOM for each platform and refuse tags off main (bec50f6)
  • ci: build the performance jobs with the placeholder API address and warn on a missing report (14d8a70)
  • ci: correct a comment in the commit message workflow (fc40bd3)
  • ci: count only tags on main for the floating tags and say what the tag check guards against (20733b0)
  • ci: fail on every semicolon, spell check Dockerfiles and nginx files, correct the Vale docs (b93cf25)
  • ci: keep pull request runs out of the mirror group and copy a tag only when its commit is on main (522e46b)
  • ci: list the names and the few Indonesian words for cspell (e225a1d)
  • ci: move a floating tag only for the newest release of its line (a6c6425)
  • ci: sign the image before the scans and skip the major tag of a 0.x release (29e4d45)
  • ci: spell check the hidden folders and list the two header terms (92d0a67)
  • ci: stop the mirror plan when the tag lookup fails (db0a497)
  • docker: accept the root user of the upgrade step in Hadolint (f184ffd)
  • docker: do not cache a missing asset as immutable and hide the headers file (47f545e)
  • docker: refresh the package upgrade layer every day instead of reusing the cache (75837dd)
  • docker: upgrade the Alpine packages that Trivy flags in the base image (2d2be7e)
  • docker: use the numeric id of root instead of a Hadolint ignore (932563a)
  • e2e: wait for the page to render and read ALL_DEVICES as exactly 1 (c1c4c53)
  • hosting: drop _redirects because Pages already serves the single page app (96d046c)
  • lint: load the react-refresh config from its named export (3f69bd8)
  • name Brotli as the compression of the size budget (0945162)
  • test: drop the null checks that the regex match types make unnecessary (549fcbf)
  • ui: cap the digits of a step at the 100 that toFixed accepts (fb73b60)
  • ui: do not accept a type on a button that renders its child (cef7436)
  • ui: keep chart labels inside the chart, draw a one point anomaly and ignore bad values (d23d424)
  • ui: keep Indonesian out of a comment of the decision buttons (8834586)
  • ui: let a long value without spaces wrap inside the row (de370a6)
  • ui: let the power chart draw past its edge so a dot on the last point is whole (ef9ebe8)
  • ui: name each tip card as an article (6526383)
  • ui: read the digits of a step that is written with an exponent (c18ef7d)
  • ui: show focus on an invalid field, announce errors, keep the digits of a step and let a select start with a value (92c40ef)
  • ui: step to the limit when a whole step does not fit and keep the digits of the value (bdad732)
  • ui: style links like buttons, forbid disabled with asChild, drop aria-busy from the skeleton and pin the tag height (d9880d0)

Performance Improvements

  • app: load each page as its own chunk (44e8563)
  • app: load each page as its own chunk and reload once when a chunk is gone after a release (0e6f57c)