11<p align =" center " >
22 <img src =" https://img.shields.io/badge/macOS-14%2B-000?logo=apple&logoColor=white " />
33 <img src =" https://img.shields.io/badge/Swift-5.9-F05138?logo=swift&logoColor=white " />
4- <img src =" https://img.shields.io/badge/tools-23 -FF8C42 " />
5- <img src =" https://img.shields.io/badge/tests-245 -4ADE80 " />
4+ <img src =" https://img.shields.io/badge/tools-33 -FF8C42 " />
5+ <img src =" https://img.shields.io/badge/tests-300 -4ADE80 " />
66 <img src =" https://img.shields.io/badge/dependencies-0-blue " />
7- <img src =" https://img.shields.io/badge/size-2. 3MB-purple " />
7+ <img src =" https://img.shields.io/badge/size-~ 3MB-purple " />
88 <img src =" https://img.shields.io/github/license/OpenStruct/dx-tools " />
9+ <img src =" https://img.shields.io/github/v/release/OpenStruct/dx-tools?color=FF8C42 " />
910</p >
1011
1112# ⚡ DX Tools
1213
13- ** 23 developer tools in one native macOS app.** JSON formatting, JWT decoding, port killing, DNS lookups, regex testing — all offline, instant, keyboard-first.
14+ ** 33 developer tools in one native macOS app.** JSON formatting, JWT decoding, port killing, QR codes, SQL formatting, API testing — all offline, instant, keyboard-first.
1415
15- > No Electron. No web wrapper. Pure SwiftUI. 2. 3 MB.
16+ > No Electron. No web wrapper. Pure SwiftUI. ~ 3 MB.
1617
1718---
1819
@@ -61,6 +62,7 @@ xcodebuild -project DXTools.xcodeproj -scheme DXTools -configuration Release bui
6162| ** JSON → Swift** | Convert JSON to Swift Codable models |
6263| ** JSON → TypeScript** | Convert JSON to TypeScript interfaces |
6364| ** JSON Diff** | Side-by-side structural diff with path tracking |
65+ | ** JSON Schema Validator** | Validate JSON against a schema — type, required, min/max, pattern |
6466
6567### Encoding
6668| Tool | Description |
@@ -69,32 +71,41 @@ xcodebuild -project DXTools.xcodeproj -scheme DXTools -configuration Release bui
6971| ** Base64** | Encode/decode, standard and URL-safe |
7072| ** Hash Generator** | MD5, SHA-1, SHA-256, SHA-512 |
7173| ** URL Encoder** | Percent-encode/decode, parse components |
74+ | ** Image Base64** | Encode images to base64/data URI, decode back to image |
7275
7376### Generators
7477| Tool | Description |
7578| ------| -------------|
7679| ** UUID Generator** | v4 UUIDs, bulk generation, one-click copy |
7780| ** Color Converter** | HEX ↔ RGB ↔ HSL, code gen for Swift/CSS/Flutter/Android/Tailwind |
78- | ** Epoch Converter** | Unix timestamp ↔ human date, 6 world clocks |
81+ | ** Epoch Converter** | Unix timestamp ↔ human date, 8 world clocks |
7982| ** Password Generator** | Secure passwords & passphrases, strength meter |
8083| ** Unix Permissions** | chmod calculator, numeric ↔ symbolic, interactive checkboxes |
8184| ** Cron Parser** | Human-readable descriptions, next 10 run times |
85+ | ** QR Code Generator** | Generate from text/URL, 4 error correction levels, copy/save PNG |
86+ | ** SSH Key Generator** | RSA, Ed25519, ECDSA with custom comments, copy/export |
87+ | ** Timestamp Converter** | Unix ↔ ISO 8601 ↔ RFC 2822, timezone support |
8288
8389### DevOps
8490| Tool | Description |
8591| ------| -------------|
8692| ** Port Manager** | List listening ports, kill processes, search & sort |
8793| ** Network Info** | Local/public IP, DNS lookup (A/AAAA/CNAME/MX/NS/TXT) |
88- | ** API Request Builder** | Send HTTP requests, headers, body, response viewer |
94+ | ** API Request Builder** | Send HTTP requests, headers, query params, body, response viewer |
8995| ** Env Manager** | Parse .env files, mask secrets, diff two envs |
9096| ** cURL → Code** | Paste cURL, get Swift/Go/Python/JS/Ruby |
97+ | ** Docker Manager** | Container list, start/stop/remove, image management |
98+ | ** Git Stats** | Repository stats, branch info, recent commits |
99+ | ** HTTP Status Codes** | Searchable reference, 35+ codes, color-coded categories |
91100
92101### Text
93102| Tool | Description |
94103| ------| -------------|
95104| ** Regex Tester** | Live matching, capture groups, replace mode |
96105| ** Markdown Preview** | Side-by-side editor and rendered preview |
97106| ** Lorem Generator** | Words, sentences, paragraphs, fake data, JSON |
107+ | ** Text Diff** | LCS-based diff, unified output, side-by-side view |
108+ | ** SQL Formatter** | Format & minify SQL, 3 indent styles, JOINs/subqueries |
98109
99110---
100111
@@ -140,10 +151,12 @@ dx env diff .env .env.production
140151- ** Menu Bar** — Quick UUID, Epoch, Password without opening the app
141152- ** Favorites** — Right-click to pin tools to sidebar
142153- ** Dark / Light / System** — Theme toggle in Settings
143- - ** Global Hotkey** — ⌘⇧Space to summon the app
154+ - ** Syntax Highlighting** — Live JSON/SQL coloring in editors
155+ - ** History** — Per-tool history of recent operations
156+ - ** URL Handler** — ` dx://tool-name ` opens app to specific tool
157+ - ** Auto-Update** — Checks GitHub Releases on launch
144158- ** Drag & Drop** — Drop files onto editors
145159- ** Export** — Save output to file (⌘S)
146- - ** History** — Per-tool history of recent operations
147160
148161### Keyboard Shortcuts
149162
@@ -165,16 +178,16 @@ dx env diff .env .env.production
165178```
166179DXTools/
167180├── Models/ # Tool enum, Theme
168- ├── Services/ # Pure logic (23 service files)
181+ ├── Services/ # Pure logic (28 service files)
169182├── ViewModels/ # @Observable view models
170183├── Views/
171- │ ├── Components/ # CodeEditor, SplitLayout, Toast
184+ │ ├── Components/ # CodeEditor, SplitLayout, ToolHeader, HistoryPanel
172185│ ├── Sidebar/ # Navigation, Welcome
173- │ └── Tools/ # 23 tool views
186+ │ └── Tools/ # 33 tool views
174187└── DXToolsApp.swift # App entry, menu bar, clipboard
175188
176189Sources/ # CLI (swift-argument-parser)
177- DXToolsTests/ # 245 tests across 21 suites
190+ DXToolsTests/ # 300 tests across 25 suites
178191```
179192
180193- ** SwiftUI** with ` @Observable ` (macOS 14+)
@@ -193,7 +206,7 @@ xcodegen generate
193206# Build & run
194207xcodebuild -project DXTools.xcodeproj -scheme DXTools build
195208
196- # Run tests (245 tests)
209+ # Run tests (300 tests)
197210xcodebuild -project DXTools.xcodeproj -scheme DXToolsTests test
198211
199212# Build CLI
@@ -205,6 +218,75 @@ swift build -c release
205218
206219---
207220
221+ ## Releasing
222+
223+ Releases follow a ` dev ` → ` main ` → tag workflow. CI builds, tests, and publishes automatically.
224+
225+ ### Quick Release
226+
227+ ``` bash
228+ # 1. Make sure you're on dev with everything committed
229+ git checkout dev
230+
231+ # 2. Bump version in project.yml
232+ # MARKETING_VERSION: "X.Y.Z"
233+
234+ # 3. Regenerate Xcode project
235+ xcodegen generate
236+
237+ # 4. Commit and push
238+ git add -A && git commit -m " chore: bump version to X.Y.Z"
239+ git push
240+
241+ # 5. Merge to main
242+ git checkout main
243+ git merge dev --no-ff -m " release: vX.Y.Z — description"
244+ git push
245+
246+ # 6. Tag and push — this triggers CI release
247+ git tag vX.Y.Z
248+ git push origin vX.Y.Z
249+
250+ # 7. Go back to dev
251+ git checkout dev
252+ ```
253+
254+ ### What CI Does on Tag Push
255+
256+ 1 . ** Builds CLI** — ` swift build -c release ` → uploads ` dx ` binary
257+ 2 . ** Builds macOS app** — XcodeGen → xcodebuild → ` DX Tools.app `
258+ 3 . ** Runs 300 tests** — all must pass
259+ 4 . ** Packages DMG** — app + Applications symlink + volume icon
260+ 5 . ** Creates GitHub Release** — attaches ` DXTools.dmg ` + ` dx ` CLI binary
261+ 6 . ** Deploys website** — if ` web/ ` changed, GitHub Pages updates automatically
262+
263+ ### Release Checklist
264+
265+ ```
266+ [ ] Version bumped in project.yml (MARKETING_VERSION)
267+ [ ] xcodegen generate ran
268+ [ ] All 300 tests pass locally
269+ [ ] Committed and pushed to dev
270+ [ ] Merged dev → main
271+ [ ] Tag pushed (vX.Y.Z)
272+ [ ] CI green — check https://github.com/OpenStruct/dx-tools/actions
273+ [ ] Release has both DXTools.dmg and dx assets
274+ [ ] Website updated (if web/ changed)
275+ ```
276+
277+ ### Hotfix
278+
279+ ``` bash
280+ # Fix directly on dev, then follow normal release flow
281+ git checkout dev
282+ # ... make fix ...
283+ git add -A && git commit -m " fix: description"
284+ git push
285+ # Then merge + tag as above
286+ ```
287+
288+ ---
289+
208290## License
209291
210292MIT — see [ LICENSE] ( LICENSE )
0 commit comments