- Swift 97.9%
- Shell 2.1%
|
|
||
|---|---|---|
| .github/workflows | ||
| docs | ||
| scripts | ||
| Sources | ||
| Tests | ||
| .gitignore | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| lokalise.yml.example | ||
| project.yml | ||
| README.md | ||
Itsypad for iOS
The iOS companion to Itsypad – a tiny, fast scratchpad and clipboard manager. Syncs your scratch tabs and clipboard history across all your devices via iCloud.
Features
- Multi-tab scratchpad with session persistence
- Clipboard history (up to 1,000 entries) with search
- iCloud sync with the macOS version (last-modified-wins conflict resolution)
- Syntax highlighting via highlight.js (26+ languages)
- 9 colour themes with light/dark variants
- Bullet lists, numbered lists, and checklists with auto-continuation
- Checkbox tap-to-toggle
- Tab grid expose view
- Configurable indentation (spaces/tabs, width)
- Auto-language detection
- Hardware keyboard support on iPad (Cmd+D duplicate line, Cmd+Return toggle checkbox, Cmd+Shift+L toggle checklist, Cmd+S save, Cmd+Shift+S save as)
- 12 languages: English, Spanish, French, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Portuguese (Brazil), Italian, Polish
Requirements
- iOS 17.0+
- Xcode 16+
- XcodeGen for project generation
Setup
xcodegen generate
open itsypad-ios.xcodeproj
Localization
Itsypad uses a Swift String Catalog (Sources/Resources/Localizable.xcstrings) for localization. Translations are managed via Lokalise.
Languages: English (base), Spanish, French, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Portuguese (Brazil), Italian, Polish.
Setup
brew tap lokalise/cli-2
brew install lokalise2
cp lokalise.yml.example lokalise.yml
# Edit lokalise.yml and add your API token
Push source strings to Lokalise
Extracts English keys and values from the xcstrings file and uploads to Lokalise:
scripts/push-translations.sh
Pull translations from Lokalise
Downloads all translations from Lokalise and merges them into the xcstrings file:
scripts/pull-translations.sh
Adding new strings
All user-facing strings use String(localized:defaultValue:) with a structured key:
Toggle(String(localized: "settings.appearance.word_wrap", defaultValue: "Word wrap"), isOn: $store.wordWrap)
Section(String(localized: "settings.spacing.title", defaultValue: "Spacing")) { ... }
Key format: {area}.{context}.{name} – e.g. menu.file.*, alert.save_changes.*, settings.appearance.*, clipboard.*, tab.context.*.
Workflow after adding new strings
- Build the project – Xcode auto-populates new keys in
Localizable.xcstrings - Push source strings to Lokalise:
scripts/push-translations.sh - Translate in Lokalise (or let translators handle it)
- Pull translations back:
scripts/pull-translations.sh - Build and verify
Architecture
SwiftUI + UIKit hybrid. SwiftUI handles navigation and settings, UIKit's UITextView powers the editor for full control over text input, syntax highlighting, and keyboard interaction.
| Module | Purpose |
|---|---|
App/ |
App entry, main layout, tab store |
Editor/ |
Text editor, syntax highlighting, list handling |
Settings/ |
Settings UI and persistence |
TabGrid/ |
Tab grid expose view |
Clipboard/ |
Clipboard history and iCloud sync |