Skip to content

Commit 584bfcf

Browse files
authored
Merge pull request #13 from xand0dev/chore/open-source-prep
Prepare VoidBar for open-source release
2 parents ae0892d + d1a7e45 commit 584bfcf

36 files changed

Lines changed: 866 additions & 201 deletions

.github/CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* @xand0dev
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
name: Bug report
2+
description: Report a reproducible problem in VoidBar
3+
title: "[Bug]: "
4+
labels: [bug]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Thanks for helping improve VoidBar. Search existing issues first. For a security vulnerability, stop here and follow `SECURITY.md` instead.
10+
- type: input
11+
id: version
12+
attributes:
13+
label: VoidBar version or commit
14+
description: Use the app version from the menu bar or a commit SHA for a source build.
15+
placeholder: v0.5.1 or 3ee37ac
16+
validations:
17+
required: true
18+
- type: input
19+
id: macos
20+
attributes:
21+
label: macOS and Mac model
22+
placeholder: macOS 15.6, MacBook Pro 14-inch (M3 Pro)
23+
validations:
24+
required: true
25+
- type: dropdown
26+
id: build
27+
attributes:
28+
label: Installation method
29+
options:
30+
- Built from source
31+
- GitHub release
32+
- Other
33+
validations:
34+
required: true
35+
- type: textarea
36+
id: problem
37+
attributes:
38+
label: What happened?
39+
description: Describe the problem and what you expected instead.
40+
validations:
41+
required: true
42+
- type: textarea
43+
id: reproduction
44+
attributes:
45+
label: Steps to reproduce
46+
placeholder: |
47+
1. Open …
48+
2. Select …
49+
3. Observe …
50+
validations:
51+
required: true
52+
- type: textarea
53+
id: evidence
54+
attributes:
55+
label: Logs, screenshots, or recordings
56+
description: Remove private clipboard, calendar, file path, and TickTick URL data before uploading.
57+
render: shell
58+
- type: checkboxes
59+
id: checks
60+
attributes:
61+
label: Checklist
62+
options:
63+
- label: I searched for an existing issue.
64+
required: true
65+
- label: This report does not disclose a security vulnerability or private data.
66+
required: true

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
blank_issues_enabled: false
2+
contact_links:
3+
- name: Security vulnerability
4+
url: https://github.com/xand0dev/VoidBar/security/advisories/new
5+
about: Report security issues privately; do not open a public issue.
6+
- name: Usage question or idea
7+
url: https://github.com/xand0dev/VoidBar/discussions
8+
about: Ask for help or discuss an idea before turning it into an issue.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
name: Feature request
2+
description: Propose an improvement to VoidBar
3+
title: "[Feature]: "
4+
labels: [enhancement]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: Thanks for the idea. Please describe the problem before prescribing an implementation.
9+
- type: textarea
10+
id: problem
11+
attributes:
12+
label: Problem
13+
description: What workflow is difficult today, and who experiences it?
14+
validations:
15+
required: true
16+
- type: textarea
17+
id: proposal
18+
attributes:
19+
label: Proposed solution
20+
description: Describe the smallest useful outcome.
21+
validations:
22+
required: true
23+
- type: textarea
24+
id: alternatives
25+
attributes:
26+
label: Alternatives considered
27+
description: Mention workarounds or different approaches you considered.
28+
- type: textarea
29+
id: impact
30+
attributes:
31+
label: Privacy, permissions, and performance
32+
description: Would this add a network service, permission, background work, or stored data?
33+
- type: checkboxes
34+
id: checks
35+
attributes:
36+
label: Checklist
37+
options:
38+
- label: I searched for an existing issue or discussion.
39+
required: true
40+
- label: I am willing to help implement or test this feature.
41+
required: false

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
## Summary
2+
3+
<!-- What changed, and why? Keep this focused on the user or contributor problem. -->
4+
5+
Fixes #
6+
7+
## Validation
8+
9+
<!-- List automated tests and manual checks. Include screenshots or recordings for visible UI changes. -->
10+
11+
- [ ] `swift test`
12+
- [ ] `./Scripts/bundle.sh release`
13+
- [ ] Tested the affected flow on macOS 15+
14+
15+
## Impact
16+
17+
- [ ] No new network request, permission, or persisted data
18+
- [ ] Privacy/security documentation updated if behavior changed
19+
- [ ] English and Ukrainian localization updated if user-facing text changed
20+
- [ ] No unrelated changes are included
21+
22+
## Notes
23+
24+
<!-- Tradeoffs, follow-up work, migration notes, or anything reviewers should know. -->

.github/workflows/build.yml

Lines changed: 52 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,83 @@
11
name: build
22

3-
# Тестов в проекте нет, поэтому проверка ровно одна и честно названа: собирается
4-
# ли то, что лежит в main. Половина поломок в таком приложении — это сломанный
5-
# скрипт сборки бандла, а не код, поэтому гоняется весь путь до .app, а не
6-
# только swift build.
73
on:
84
push:
95
branches: [main]
10-
paths-ignore: ['**.md', 'docs/**']
6+
paths-ignore:
7+
- "**.md"
8+
- "docs/**"
119
pull_request:
1210
branches: [main]
1311
workflow_dispatch:
1412

13+
permissions:
14+
contents: read
15+
16+
concurrency:
17+
group: build-${{ github.workflow }}-${{ github.ref }}
18+
cancel-in-progress: true
19+
1520
jobs:
16-
build:
17-
# macOS 15 — минимум приложения: Translation.framework младше не бывает.
21+
test-and-build:
22+
name: Test and build app
1823
runs-on: macos-15
24+
timeout-minutes: 20
25+
1926
steps:
20-
- uses: actions/checkout@v5
27+
- name: Check out repository
28+
uses: actions/checkout@v5
2129

22-
- name: Версия Swift
30+
- name: Show Swift version
2331
run: swift --version
2432

25-
- name: Сборка приложения
33+
- name: Run unit tests
34+
run: swift test
35+
36+
- name: Build release app bundle
2637
run: ./Scripts/bundle.sh release
2738

28-
- name: Проверить, что в бандле лежит то, что нужно
39+
- name: Validate app bundle
40+
shell: bash
2941
run: |
30-
APP=build/VoidBar.app
42+
set -euo pipefail
43+
APP="build/VoidBar.app"
3144
VERSION="$(sed -n 's/^VERSION=//p' Scripts/version)"
45+
3246
test -x "$APP/Contents/MacOS/VoidBar"
33-
# Локализации кладет тот же скрипт, и молча потерять их проще всего:
34-
# приложение с пропавшей таблицей запускается и выглядит целым.
47+
test -f "$APP/Contents/Resources/AppIcon.icns"
3548
test -f "$APP/Contents/Resources/en.lproj/Localizable.strings"
3649
test -f "$APP/Contents/Resources/uk.lproj/Localizable.strings"
50+
3751
INSIDE="$(/usr/libexec/PlistBuddy -c 'Print CFBundleShortVersionString' "$APP/Contents/Info.plist")"
38-
test "$INSIDE" = "$VERSION" || { echo "версия в бандле $INSIDE, в Scripts/version $VERSION"; exit 1; }
52+
test "$INSIDE" = "$VERSION" || {
53+
echo "Bundle version $INSIDE does not match Scripts/version $VERSION"
54+
exit 1
55+
}
3956
40-
- name: Ключи перевода совпадают с кодом
41-
# Строка, для которой нет ключа, не ломает сборку — она просто
42-
# показывается идентификатором тому, у кого этот язык.
57+
- name: Validate localization keys
4358
run: |
4459
python3 - <<'PY'
45-
import re, io, pathlib, sys
60+
import io
61+
import pathlib
62+
import re
63+
import sys
64+
4665
code = set()
47-
for p in pathlib.Path("Sources").rglob("*.swift"):
48-
code |= set(re.findall(r'localized\("([^"]+)"', io.open(p, encoding="utf-8").read()))
49-
bad = False
66+
for path in pathlib.Path("Sources").rglob("*.swift"):
67+
source = io.open(path, encoding="utf-8").read()
68+
code |= set(re.findall(r'localized\("([^"]+)"', source))
69+
70+
invalid = False
5071
for table in pathlib.Path("Resources").glob("*.lproj/Localizable.strings"):
51-
text = io.open(table, encoding="utf-8").read()
52-
keys = {k.replace("\\n", "\n") for k in re.findall(r'^"((?:[^"\\]|\\.)*)"\s*=', text, re.M)}
72+
source = io.open(table, encoding="utf-8").read()
73+
keys = {
74+
key.replace("\\n", "\n")
75+
for key in re.findall(r'^"((?:[^"\\]|\\.)*)"\s*=', source, re.M)
76+
}
5377
missing = code - keys
5478
if missing:
55-
bad = True
56-
print(f"{table}: нет ключей: {sorted(missing)}")
57-
sys.exit(1 if bad else 0)
79+
invalid = True
80+
print(f"{table}: missing keys: {sorted(missing)}")
81+
82+
sys.exit(1 if invalid else 0)
5883
PY

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ build/
55
*.xcworkspace
66
.swiftpm/
77

8-
# Чтобы секрет не уехал в публичный репозиторий по случайности
8+
# Common local secrets and signing material
99
.env
1010
.env.*
1111
*.pem

CHANGELOG.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Changelog
2+
3+
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).
4+
5+
## [Unreleased]
6+
7+
### Added
8+
9+
- Customizable tab visibility and ordering in Preferences.
10+
- English and Ukrainian open-source documentation and community templates.
11+
12+
### Changed
13+
14+
- CI now runs unit tests as well as the full application bundle build.
15+
- Privacy documentation now describes every intentional remote request, persisted data category, and system permission.
16+
17+
## [0.5.1] - 2026-08-05
18+
19+
### Fixed
20+
21+
- A newly created or selected note now receives keyboard focus immediately.
22+
23+
## [0.5.0] - 2026-08-05
24+
25+
### Added
26+
27+
- Persistent scratch notes with automatic focus and cleanup of empty notes.
28+
29+
### Fixed
30+
31+
- File-shelf removal controls now remain visible as cards move under the pointer.
32+
33+
## [0.4.0] - 2026-08-05
34+
35+
### Added
36+
37+
- Menu bar controls for viewing and moving saved screenshots to Trash.
38+
39+
### Changed
40+
41+
- Background work is reduced while the panel is collapsed.
42+
43+
### Fixed
44+
45+
- The panel now closes reliably after leaving text-entry tabs, switching spaces, or sleeping the display.
46+
47+
## [0.3.0] - 2026-08-05
48+
49+
### Added
50+
51+
- First installable disk image.
52+
- Snippets, Calendar, and Translation tabs.
53+
- Hover-based tab switching with a dwell threshold.
54+
- Copied-image handoff to the shelf through the macOS pasteboard.
55+
- English and Russian localization (Ukrainian replaced Russian in a later development version).
56+
57+
[Unreleased]: https://github.com/xand0dev/VoidBar/compare/v0.5.1...HEAD
58+
[0.5.1]: https://github.com/xand0dev/VoidBar/compare/v0.5.0...v0.5.1
59+
[0.5.0]: https://github.com/xand0dev/VoidBar/compare/v0.4.0...v0.5.0
60+
[0.4.0]: https://github.com/xand0dev/VoidBar/compare/v0.3.0...v0.4.0
61+
[0.3.0]: https://github.com/xand0dev/VoidBar/releases/tag/v0.3.0

0 commit comments

Comments
 (0)