diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..1915346 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,42 @@ +# Code of Conduct + +## Our Standard + +This project expects contributors and maintainers to keep discussion technical, +respectful, and free of harassment. + +In this repository: + +- be direct, but do not be abusive +- criticize code and decisions, not people +- avoid insults, intimidation, and personal attacks +- assume good faith until there is a concrete reason not to +- keep public threads useful for maintainers and contributors + +## Unacceptable Behavior + +Examples include: + +- harassment or discrimination +- sexualized language or imagery +- threats or intimidation +- sustained personal attacks +- doxxing or publishing private information without consent +- deliberately disruptive or hostile communication + +## Maintainer Enforcement + +Project maintainers may remove, edit, or reject comments, issues, pull +requests, or other contributions that violate this code of conduct. + +Depending on severity, maintainers may: + +- ask for a correction +- lock or moderate a discussion +- reject a contribution +- temporarily or permanently block further participation + +## Reporting + +If someone is violating this code of conduct, contact the maintainer through +the repository owner profile instead of escalating the situation publicly. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..385dcea --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +BearWave for macOS +Copyright (C) 2026 Sebastian + +SPDX-License-Identifier: GPL-3.0-or-later + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see: + +https://www.gnu.org/licenses/gpl-3.0.txt diff --git a/README.md b/README.md index 91d0d0b..047708a 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ same product idea as the Linux version: quick station discovery, lightweight playback, favorites, recents, and native desktop integration without turning the app into a general-purpose audio suite. +Current release target: `v0.1.0-alpha.1` + ## Screenshots ![Main station browser](screens/screen1.png) @@ -45,6 +47,13 @@ That means: - native macOS behavior is preferred over KDE/Qt parity - podcast features are intentionally out of scope +## License + +This project follows the upstream BearWave licensing direction and is licensed +under **GPL-3.0-or-later**. + +See [LICENSE](LICENSE). + ## Build ```bash @@ -122,6 +131,8 @@ Still pragmatic rather than release-ready: - debug-oriented signing and packaging - custom app-bundle staging script +This repository is currently in an **early alpha** state. + ## Roadmap - improve release packaging, signing, and notarization diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..3f55497 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,40 @@ +# Security Policy + +## Supported Versions + +This repository is currently in an early alpha stage. + +Security fixes are expected on: + +- the current `main` branch +- the newest tagged pre-release, when one exists + +Older snapshots may not receive backported fixes. + +## Reporting a Vulnerability + +Please do **not** open a public issue for a suspected security problem before +the maintainer has had a chance to assess it. + +Preferred process: + +1. Report the issue privately through your forge's private reporting workflow, if available. +2. If private reporting is not available, contact the maintainer through the repository owner profile first. +3. Include: + - affected version or commit + - reproduction steps + - impact + - any workaround, if known + +## Scope + +Relevant security reports include: + +- credential or token leakage +- unsafe network handling +- update or packaging integrity issues +- sandbox, entitlement, or macOS permission mistakes +- malicious or unintended code execution paths + +Reports that are only stream-quality, broken station metadata, or ordinary +playback bugs should go through the normal issue tracker. diff --git a/Sources/BearWaveApp/BearWaveApp.swift b/Sources/BearWaveApp/BearWaveApp.swift index b6d596f..e1d8a58 100644 --- a/Sources/BearWaveApp/BearWaveApp.swift +++ b/Sources/BearWaveApp/BearWaveApp.swift @@ -4,6 +4,8 @@ import SwiftUI @main struct BearWaveApp: App { + private static let releaseVersion = "v0.1.0-alpha.1" + private static let buildVersion = "1" @NSApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate @State private var model = AppModel() @State private var isMiniPlayer = false @@ -32,6 +34,11 @@ struct BearWaveApp: App { } .defaultSize(width: Self.windowWidth, height: 720) .commands { + CommandGroup(replacing: .appInfo) { + Button("About BearWave") { + showAboutPanel() + } + } CommandGroup(after: .appTermination) { Button("Play/Pause") { model.playback.togglePlayPause() @@ -58,6 +65,22 @@ struct BearWaveApp: App { } } + private func showAboutPanel() { + var options: [NSApplication.AboutPanelOptionKey: Any] = [ + .applicationName: "BearWave", + .applicationVersion: Self.releaseVersion, + .version: "Build \(Self.buildVersion)" + ] + + if let iconURL = Bundle.main.url(forResource: "bearwave_about", withExtension: "png"), + let icon = NSImage(contentsOf: iconURL) { + options[.applicationIcon] = icon + } + + NSApp.orderFrontStandardAboutPanel(options: options) + NSApp.activate(ignoringOtherApps: true) + } + private func resizeWindow(toMini: Bool) { let targetSize = toMini ? CGSize(width: 555, height: 110) : CGSize(width: Self.windowWidth, height: 720) Task { @MainActor in diff --git a/Sources/BearWaveCore/Resources/Assets/bearwave_about.png b/Sources/BearWaveCore/Resources/Assets/bearwave_about.png new file mode 100755 index 0000000..9c05731 Binary files /dev/null and b/Sources/BearWaveCore/Resources/Assets/bearwave_about.png differ diff --git a/script/build_and_run.sh b/script/build_and_run.sh index 3aec544..171dfe7 100755 --- a/script/build_and_run.sh +++ b/script/build_and_run.sh @@ -5,6 +5,8 @@ MODE="${1:-run}" APP_NAME="BearWave" BUNDLE_ID="com.spalencsar.BearWave" MIN_SYSTEM_VERSION="26.0" +APP_VERSION="0.1.0-alpha.1" +APP_BUILD="1" ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" DIST_DIR="$ROOT_DIR/dist" @@ -29,6 +31,7 @@ chmod +x "$APP_BINARY" cp "$ROOT_DIR/Sources/BearWaveCore/Resources/Assets/bearwave.png" "$APP_RESOURCES/BearWave.png" cp "$ROOT_DIR/Sources/BearWaveCore/Resources/Assets/bearwave.png" "$APP_RESOURCES/bearwave.png" +cp "$ROOT_DIR/Sources/BearWaveCore/Resources/Assets/bearwave_about.png" "$APP_RESOURCES/bearwave_about.png" cp "$ROOT_DIR/Sources/BearWaveCore/Resources/Assets/bearwave_line.png" "$APP_RESOURCES/bearwave_line.png" cp "$ROOT_DIR/AppIcon.icns" "$APP_RESOURCES/AppIcon.icns" for lproj in "$ROOT_DIR"/Sources/BearWaveCore/Resources/*.lproj; do @@ -56,9 +59,9 @@ cat >"$INFO_PLIST" <CFBundlePackageType APPL CFBundleShortVersionString - 1.0.0 + $APP_VERSION CFBundleVersion - 1 + $APP_BUILD LSMinimumSystemVersion $MIN_SYSTEM_VERSION NSPrincipalClass