Shioaji Pro
為 agent 交易鋪路:交易終端全程由 coding agent 打造,介面 100% 開源、桌面版內建 AI Agent 與全套專業下單面板 — 這個終端就是能力證明。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Lön med OB-tillägg för butiksanställda med timlön. Ladda upp schemat, se vad månaden ger. OB-regler enligt Detaljhandelsavtalet §8.1. Helt klientsida.
翻譯準備中
正在載入完整 README。 以下為已儲存的摘錄。
A web app for hourly-paid retail workers in Sweden. Upload your schedule, get what the month actually pays — OB (obekväm arbetstid) supplements, tax and net pay, with every hour attributed to the rule that paid for it. Detaljhandelsavtalet §7.3 settles the pay form: a heltidsanställd is always on månadslön, while a deltidsanställd is on timlön by default, moving to månadslön only if their hours are averaged over 11+ weeks or they agree to it.檢視完整 README ↗
A web app for hourly-paid retail workers in Sweden. Upload your schedule, get what the month actually pays — OB (obekväm arbetstid) supplements, tax and net pay, with every hour attributed to the rule that paid for it.
Detaljhandelsavtalet §7.3 settles the pay form: a heltidsanställd is always on månadslön, while a deltidsanställd is on timlön by default, moving to månadslön only if their hours are averaged over 11+ weeks or they agree to it.
Someone on a monthly salary already knows roughly what lands in their account. Someone paid by the hour, on a schedule that shifts week to week with OB spread unevenly across it, does not. That second group is who this is for — part-time store staff, which is most of Swedish retail.
.csv/.xlsx export, text pasted from a PDF
or email, or shifts typed in by handEvery employer runs a different scheduling system, and a parser can only be written for a format someone has actually seen. So there are three routes in, and the last one always works:
.csv or .xlsx. Columns are found by their headings, in
Swedish or English. If the headings are unfamiliar the file is not rejected —
the columns are listed with sample values and you point out which is the
date, the start and the end.sjuk or semester becomes that kind of leave;
a semester line needs no times. Dates are parsed strictly, since guessing
day-versus-month would move a whole month onto the wrong weekdays, and
weekday is what decides OB.A date is work or leave, never both: adding one removes the other on that date and says so. Any shift in the list can be marked sick or semester, and back.
Taken verbatim from §8.1 of Detaljhandelsavtalet, 1 April 2025 – 31 March 2027 (Svensk Handel / Handelsanställdas förbund):
| When | Pays |
|---|---|
| måndag–fredag kl. 18.15 – 20.00 | 50 % |
| måndag–fredag efter kl. 20.00 | 70 % |
| lördagar efter kl. 12.00 | 100 % |
| söndagar och helgdagar | 100 % |
Med lördagar jämställs jul-, nyårs- och midsommarafton.
Supplements are paid on top of the base rate: an hour at OB 50% with a base of 177.44 kr/h pays 177.44 + 88.72 kr.
A rule set is a list of tiers (a name and a supplement percentage) and a list of time windows (day types, a start and end time, and the tier they pay). Any hour not covered by a window pays the base rate only. The preset is just the starting point — a different agreement, or a local addition like Coop's extra 05.00–06.00 tier, can be entered by hand.
A window targets day types, which is what makes "söndagar och helgdagar" work. Beyond the seven weekdays there are two more:
Detaljhandelsavtalet sets no minimum or maximum length for a rast — the schedule decides. What it does settle is whether the time is paid:
Arbetstidslagen §15 entitles you to a rast after at most five hours of work, so any shift longer than that with no break in the file is flagged — usually it means the export left the break out.
Leave days sit in the export with their scheduled hours intact, so they have to be told apart from work — and from each other, since each is paid differently. A day counts as leave only when the absence columns cover the whole shift; those columns routinely carry a minute or two on ordinary days, meaning someone arrived late.
Checked against three real Bestseller time exports and the payslips they produced. June and August 2026 match the payslip to the öre on gross, and to the krona on tax and on what was paid out; July is 1,77 kr under on gross, which is the payslip splitting one month over two stores and rounding each half on its own — something the export does not show. Every OB tier is exact. August is the sick month: two separate sick days, two karens periods, 4,16 h of sjuklön to the öre, and two days of approved mertid read from the Godkänd column.
The app rounds the way payroll does — the month's hours per row to two decimals, the rate to the öre, each row to the öre, the payout to whole kronor — because a krona's difference can cross a skattetabell bracket edge and move the tax by fifty.
There is no backend, no account, and no analytics. The schedule is parsed in the browser and the results never leave it.
Agreement periods change. If you are reading this after April 2027, re-check the figures against the current avtal.
Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS 4. Every route is statically prerendered — the app is entirely client-side.
The .xlsx reader is hand-rolled: it walks the zip's central directory and
inflates the entries with the browser's built-in DecompressionStream, so the
app ships no spreadsheet dependency. Persisted state is exposed to React through
useSyncExternalStore, which also picks up changes from other open tabs.
lib/
rules.ts tiers, windows, preset, day classification, validation
holidays.ts svenska helgdagar, incl. Easter-derived dates
calc.ts shift splitting and pay totals
parse.ts csv + xlsx readers, schedule column detection
storage.ts localStorage load/save
store.ts useSyncExternalStore bindings
i18n.ts sv/en strings
time.ts time parsing and formatting
npm install
npm run dev
Then open http://localhost:3000.
e2e/