Skip to content

Add it-toolbox extension - #31252

Open
zhanghuid wants to merge 4 commits into
raycast:mainfrom
zhanghuid:ext/it-toolbox
Open

zhanghuid wants to merge 4 commits into
raycast:mainfrom
zhanghuid:ext/it-toolbox

Conversation

@zhanghuid

@zhanghuid zhanghuid commented Sep 18, 2026 •

Copy link
Copy Markdown

Description

IT Toolbox collects sixteen small utilities that come up every day into a single extension,
so you don't have to open a browser tab for "online timestamp converter" or "md5 online".

Command What it does
Timestamp Timestamps ↔ dates, seconds/milliseconds auto-detected, ISO 8601 / UTC / RFC 2822 output
URL Encode / Decode encodeURIComponent or encodeURI, plus a query-parameter breakdown
Base64 Encode / Decode Text ↔ Base64, URL-safe Base64, hex and binary
Hash (MD5/SHA) MD5, SHA-1, SHA-256, SHA-512 and CRC32 for the same input in one pass
UUID / ULID Generator 1–50 UUID v4, UUID v7, ULID or NanoID values
JSON Format / Validate Format, minify, sort keys, validate, and generate TypeScript interfaces
JWT Decoder Reads the header and payload and flags expiry (decoding only, no signature check)
Radix Convert Binary, octal, decimal, hex, Base32 and Base36, BigInt-based so nothing is lost to float precision
Text Diff Line-by-line comparison, optionally ignoring case/whitespace, copyable as diff output
Random / Password Generator Configurable character set and length, optional exclusion of ambiguous characters, estimated entropy
Case Convert camelCase, PascalCase, snake_case, SCREAMING_SNAKE_CASE, kebab-case, dot.case
IP / CIDR Tool IPv4 ↔ integer ↔ binary, CIDR subnet details, private vs public detection
Cron Parser Explains a 5-field expression in plain English and predicts the next 10 run times
QR Code Generator Text or URL → QR code, copyable/openable
Color Convert HEX, RGB, HSL, CMYK with a swatch preview and WCAG AA contrast checks
Text Toolkit Change case, reverse, dedupe, drop empty lines, sort, convert to a SQL IN list or CSV row, plus character/word/line counts

Things worth pointing out

  • Live values before you type anything. Commands anchored to "now" — starting with
    Timestamp — produce a result from an empty input, so ⌥ Space → Timestamp → ⏎ immediately
    shows the current time and current timestamp (seconds and milliseconds). ⌘ ⇧ R refreshes it.
  • One shared result convention across every command. List titles are folded at 220 characters
    with a note of how much was hidden; ⏎ copies, ⌘ ⇧ ⏎ copies the full value, ⌘ ⇧ C copies
    the detail, ⌘ ⇧ T copies the title, ⌘ ⇧ P pastes into the active app. Long values open in a
    scrollable detail page reporting character count, line count and longest line.
  • Light and dark icons. assets/icon.png and assets/icon@dark.png so the icon reads well in
    both themes.
  • Privacy. Every command computes locally, with one documented exception: QR Code Generator
    requests the image from the public QR Server API, so the submitted text
    is sent to that service. This is called out in the README as well.
  • Structure. All pure logic lives in src/utils/toolbox.ts with no UI dependency, wrapped by
    two shared components (InputForm for input → results, ResultList for folded previews and
    detail pages). Each command is a thin src/*.tsx entry point. npm test runs 48 self-tests
    (src/__tests__/toolbox.test.ts, a plain tsx script, no extra dependency) against those pure
    functions; npx tsc --noEmit and ray lint (ESLint 9 flat config) are clean.

Screencast

A screencast isn't attached — the five Store screenshots (metadata/, 2000×1250) are embedded
below and cover the main surfaces. Happy to record a walkthrough screencast if it would help.

Timestamp — live values

Hash (MD5/SHA)

Color Convert

Text Toolkit

Text Diff

Checklist

- chore: init
- first commit
@raycastbot raycastbot added new extension Label for PRs with new extensions platform: macOS labels Sep 18, 2026
@raycastbot

Copy link
Copy Markdown
Collaborator

Congratulations on your new Raycast extension! 🚀

We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 15 business days.

Once the PR is approved and merged, the extension will be available on our Store.

@greptile-apps

greptile-apps Bot commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

The PR appears safe to merge.

What we checked:

  • Stepped cron dates stay correct: No. nextCronRuns now treats day fields that start with * as wildcard fields, while ranges still use the restricted-field rule.

Summary

IT Toolbox adds sixteen everyday developer utilities as one Raycast extension. Each command uses shared input and result screens, while pure helper functions keep conversions, generators, and calculations reusable and testable.

  • Adds tools for timestamps, encoding, hashing, IDs, JSON, JWTs, networking, cron, colors, and text.
  • Gives every command the same copyable result and detail workflow.
  • Shows live timestamp values without input and documents the QR Server exception for QR images.

Reviews (3) · Last reviewed commit: "fix(cron): treat a stepped wildcard day ..."

Comment thread extensions/it-toolbox/src/components/InputForm.tsx Outdated
Comment thread extensions/it-toolbox/src/utils/toolbox.ts Outdated
Comment thread extensions/it-toolbox/src/utils/toolbox.ts Outdated
Comment thread extensions/it-toolbox/src/timestamp.tsx Outdated
Comment thread extensions/it-toolbox/src/utils/toolbox.ts Outdated
Comment thread extensions/it-toolbox/src/utils/toolbox.ts Outdated
Comment thread extensions/it-toolbox/src/utils/toolbox.ts Outdated
Comment thread extensions/it-toolbox/src/ip-tool.tsx Outdated
Comment thread extensions/it-toolbox/package.json Outdated
Comment thread extensions/it-toolbox/src/utils/toolbox.ts Outdated
@zhanghuid
zhanghuid marked this pull request as ready for review September 18, 2026 08:03
@zhanghuid

Copy link
Copy Markdown
Author

All nine findings from the AI review are addressed in e61c242e, each thread is replied to and resolved, and the required checks are green. Every one of them reproduced against the code, so thanks for the catches. Marking this ready for review — @pernielsentikaer.

# Where What was wrong What changed
1 src/components/InputForm.tsx ⌘⇧R Refresh Live Values pushed the defaultRows captured at mount, so the pushed page could never show a newer instant the rows are built when the action runs (computeLiveRows()); the tick state and the memo are gone
2 src/utils/toolbox.ts · parseDateFlexible 2024-02-30 was accepted — new Date(...) rolled it forward to Mar 1 the constructed date is compared field by field with the input and rejected if anything rolled over
3 src/utils/toolbox.ts · nextCronRuns five-field cron AND-ed day-of-month with day-of-week, so 0 0 1 * 1 never matched a Monday when both fields are restricted they are OR-ed, matching Vixie cron
4 src/timestamp.tsx week end was weekStart + 168h, which is an hour off in a week containing a daylight-saving change start and end are both derived from local calendar fields
5 src/utils/toolbox.ts · diffLines the LCS table was sized for the whole input, so pasting two large files could block Raycast or exhaust memory shared prefix and suffix are trimmed first and the remaining window is capped at 4,000,000 cells; beyond that we throw and diff-text.tsx shows a failure toast instead of taking the app down
6 src/utils/toolbox.ts · generatePassword two required character sets could draw the same index and overwrite each other, silently dropping a class each required set now gets a distinct reserved slot (Fisher–Yates over the slot list)
7 src/utils/toolbox.ts · parseColor rgb(300,0,0) was clamped for the HEX row while HSL/CMYK/contrast used the raw channel, so one page disagreed with itself channels above 255 are rejected outright, consistently
8 src/ip-tool.tsx the all-digits branch fell through, so an integer produced its binary form and a bogus "Invalid IP address" row made it else if
9 package.json @raycast/utils was declared but imported nowhere removed, and package-lock.json regenerated

7 regression tests cover the above; npm test is 47/47. npm run build, npx tsc --noEmit and npm run lint are all clean.

Two judgement calls worth flagging, in case you disagree:

  • Add gitlab extension #2 — parseDateFlexible now returns null for a date that does not exist, so 2024-02-30 shows no result rather than being silently corrected to Mar 1. Refusing felt righter than guessing for a converter, but I am happy to clamp instead if that is the preferred behaviour.
  • Add home assistant #5 — 4,000,000 cells is a heuristic (DIFF_CELL_LIMIT); it is a named constant if you want a different threshold.

The last checklist item (opening the distribution build in Raycast) is still in progress on my side; I will tick it once that pass is done.

@zhanghuid

Copy link
Copy Markdown
Author

Follow-up in 4c8ecf1b: the re-review flagged that my cron fix only recognised a plain *, so a stepped wildcard like */2 was wrongly treated as a restricted day field.

That was correct, and I verified it against the reference implementation rather than taking it on faith. cronie sets DOM_STAR / DOW_STAR from the first character of the day field (src/entry.c ~251 and ~271), and src/cron.c ~582 ANDs the two day fields whenever either flag is set — so */2 is a wildcard. The check now tests the leading character instead of equality with "*", and ? is handled the same way.

Reproduced before the change (0 0 */2 * 1 from 2026-09-17 returned Sep 19 Sat, Sep 21 Mon, Sep 23 Wed, Sep 25 Fri, Sep 27 Sun, Sep 28 Mon); after the change it returns only odd-date Mondays — Sep 21, Oct 5, Oct 19, Nov 9, Nov 23, Dec 7. A regression test covers both halves (stepped wildcard ANDs, genuinely restricted field ORs). 48 tests, npm run build / npx tsc --noEmit / npm run lint all clean.

Still ready for review.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new extension Label for PRs with new extensions platform: macOS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants