Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @xand0dev
66 changes: 66 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Bug report
description: Report a reproducible problem in VoidBar
title: "[Bug]: "
labels: [bug]
body:
- type: markdown
attributes:
value: |
Thanks for helping improve VoidBar. Search existing issues first. For a security vulnerability, stop here and follow `SECURITY.md` instead.
- type: input
id: version
attributes:
label: VoidBar version or commit
description: Use the app version from the menu bar or a commit SHA for a source build.
placeholder: v0.5.1 or 3ee37ac
validations:
required: true
- type: input
id: macos
attributes:
label: macOS and Mac model
placeholder: macOS 15.6, MacBook Pro 14-inch (M3 Pro)
validations:
required: true
- type: dropdown
id: build
attributes:
label: Installation method
options:
- Built from source
- GitHub release
- Other
validations:
required: true
- type: textarea
id: problem
attributes:
label: What happened?
description: Describe the problem and what you expected instead.
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Steps to reproduce
placeholder: |
1. Open …
2. Select …
3. Observe …
validations:
required: true
- type: textarea
id: evidence
attributes:
label: Logs, screenshots, or recordings
description: Remove private clipboard, calendar, file path, and TickTick URL data before uploading.
render: shell
- type: checkboxes
id: checks
attributes:
label: Checklist
options:
- label: I searched for an existing issue.
required: true
- label: This report does not disclose a security vulnerability or private data.
required: true
8 changes: 8 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Security vulnerability
url: https://github.com/xand0dev/VoidBar/security/advisories/new
about: Report security issues privately; do not open a public issue.
- name: Usage question or idea
url: https://github.com/xand0dev/VoidBar/discussions
about: Ask for help or discuss an idea before turning it into an issue.
41 changes: 41 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Feature request
description: Propose an improvement to VoidBar
title: "[Feature]: "
labels: [enhancement]
body:
- type: markdown
attributes:
value: Thanks for the idea. Please describe the problem before prescribing an implementation.
- type: textarea
id: problem
attributes:
label: Problem
description: What workflow is difficult today, and who experiences it?
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Proposed solution
description: Describe the smallest useful outcome.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives considered
description: Mention workarounds or different approaches you considered.
- type: textarea
id: impact
attributes:
label: Privacy, permissions, and performance
description: Would this add a network service, permission, background work, or stored data?
- type: checkboxes
id: checks
attributes:
label: Checklist
options:
- label: I searched for an existing issue or discussion.
required: true
- label: I am willing to help implement or test this feature.
required: false
24 changes: 24 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
## Summary

<!-- What changed, and why? Keep this focused on the user or contributor problem. -->

Fixes #

## Validation

<!-- List automated tests and manual checks. Include screenshots or recordings for visible UI changes. -->

- [ ] `swift test`
- [ ] `./Scripts/bundle.sh release`
- [ ] Tested the affected flow on macOS 15+

## Impact

- [ ] No new network request, permission, or persisted data
- [ ] Privacy/security documentation updated if behavior changed
- [ ] English and Ukrainian localization updated if user-facing text changed
- [ ] No unrelated changes are included

## Notes

<!-- Tradeoffs, follow-up work, migration notes, or anything reviewers should know. -->
79 changes: 52 additions & 27 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,58 +1,83 @@
name: build

# Тестов в проекте нет, поэтому проверка ровно одна и честно названа: собирается
# ли то, что лежит в main. Половина поломок в таком приложении — это сломанный
# скрипт сборки бандла, а не код, поэтому гоняется весь путь до .app, а не
# только swift build.
on:
push:
branches: [main]
paths-ignore: ['**.md', 'docs/**']
paths-ignore:
- "**.md"
- "docs/**"
pull_request:
branches: [main]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: build-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
# macOS 15 — минимум приложения: Translation.framework младше не бывает.
test-and-build:
name: Test and build app
runs-on: macos-15
timeout-minutes: 20

steps:
- uses: actions/checkout@v5
- name: Check out repository
uses: actions/checkout@v5

- name: Версия Swift
- name: Show Swift version
run: swift --version

- name: Сборка приложения
- name: Run unit tests
run: swift test

- name: Build release app bundle
run: ./Scripts/bundle.sh release

- name: Проверить, что в бандле лежит то, что нужно
- name: Validate app bundle
shell: bash
run: |
APP=build/VoidBar.app
set -euo pipefail
APP="build/VoidBar.app"
VERSION="$(sed -n 's/^VERSION=//p' Scripts/version)"

test -x "$APP/Contents/MacOS/VoidBar"
# Локализации кладет тот же скрипт, и молча потерять их проще всего:
# приложение с пропавшей таблицей запускается и выглядит целым.
test -f "$APP/Contents/Resources/AppIcon.icns"
test -f "$APP/Contents/Resources/en.lproj/Localizable.strings"
test -f "$APP/Contents/Resources/uk.lproj/Localizable.strings"

INSIDE="$(/usr/libexec/PlistBuddy -c 'Print CFBundleShortVersionString' "$APP/Contents/Info.plist")"
test "$INSIDE" = "$VERSION" || { echo "версия в бандле $INSIDE, в Scripts/version $VERSION"; exit 1; }
test "$INSIDE" = "$VERSION" || {
echo "Bundle version $INSIDE does not match Scripts/version $VERSION"
exit 1
}

- name: Ключи перевода совпадают с кодом
# Строка, для которой нет ключа, не ломает сборку — она просто
# показывается идентификатором тому, у кого этот язык.
- name: Validate localization keys
run: |
python3 - <<'PY'
import re, io, pathlib, sys
import io
import pathlib
import re
import sys

code = set()
for p in pathlib.Path("Sources").rglob("*.swift"):
code |= set(re.findall(r'localized\("([^"]+)"', io.open(p, encoding="utf-8").read()))
bad = False
for path in pathlib.Path("Sources").rglob("*.swift"):
source = io.open(path, encoding="utf-8").read()
code |= set(re.findall(r'localized\("([^"]+)"', source))

invalid = False
for table in pathlib.Path("Resources").glob("*.lproj/Localizable.strings"):
text = io.open(table, encoding="utf-8").read()
keys = {k.replace("\\n", "\n") for k in re.findall(r'^"((?:[^"\\]|\\.)*)"\s*=', text, re.M)}
source = io.open(table, encoding="utf-8").read()
keys = {
key.replace("\\n", "\n")
for key in re.findall(r'^"((?:[^"\\]|\\.)*)"\s*=', source, re.M)
}
missing = code - keys
if missing:
bad = True
print(f"{table}: нет ключей: {sorted(missing)}")
sys.exit(1 if bad else 0)
invalid = True
print(f"{table}: missing keys: {sorted(missing)}")

sys.exit(1 if invalid else 0)
PY
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ build/
*.xcworkspace
.swiftpm/

# Чтобы секрет не уехал в публичный репозиторий по случайности
# Common local secrets and signing material
.env
.env.*
*.pem
Expand Down
61 changes: 61 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Changelog

All notable changes to VoidBar are documented in this file. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

- Customizable tab visibility and ordering in Preferences.
- English and Ukrainian open-source documentation and community templates.

### Changed

- CI now runs unit tests as well as the full application bundle build.
- Privacy documentation now describes every intentional remote request, persisted data category, and system permission.

## [0.5.1] - 2026-08-05

### Fixed

- A newly created or selected note now receives keyboard focus immediately.

## [0.5.0] - 2026-08-05

### Added

- Persistent scratch notes with automatic focus and cleanup of empty notes.

### Fixed

- File-shelf removal controls now remain visible as cards move under the pointer.

## [0.4.0] - 2026-08-05

### Added

- Menu bar controls for viewing and moving saved screenshots to Trash.

### Changed

- Background work is reduced while the panel is collapsed.

### Fixed

- The panel now closes reliably after leaving text-entry tabs, switching spaces, or sleeping the display.

## [0.3.0] - 2026-08-05

### Added

- First installable disk image.
- Snippets, Calendar, and Translation tabs.
- Hover-based tab switching with a dwell threshold.
- Copied-image handoff to the shelf through the macOS pasteboard.
- English and Russian localization (Ukrainian replaced Russian in a later development version).

[Unreleased]: https://github.com/xand0dev/VoidBar/compare/v0.5.1...HEAD
[0.5.1]: https://github.com/xand0dev/VoidBar/compare/v0.5.0...v0.5.1
[0.5.0]: https://github.com/xand0dev/VoidBar/compare/v0.4.0...v0.5.0
[0.4.0]: https://github.com/xand0dev/VoidBar/compare/v0.3.0...v0.4.0
[0.3.0]: https://github.com/xand0dev/VoidBar/releases/tag/v0.3.0
Loading