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
40 changes: 0 additions & 40 deletions .github/workflows/codeql.yml

This file was deleted.

4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,7 @@ testem.log
# System files
.DS_Store
Thumbs.db

# Platform directories
android/*
ios/*
.vscode/*
111 changes: 111 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
# Changelog

## [0.2.1] - 2025-08-01

### Added
- Add changelog

## [0.2.0] - 2025-07-23

### Added
- Add group, server and stream requests
- Add client mutation functions
- Connect to state in app component, add triggers for foreground and background events
- Handle mobile page lifecycles
- Add client name to selectors and list
- Add client detail page
- Add indicator fab logic
- Add first version of github workflows
- Add user preference hostname
- Key value store for user peferences, variable hostname, menu page, settings page
- Add preview screen
- Add basic readme
- Add device details page
- Add devices page
- Extend snapcast service with group functions
- Add haptic feedback
- Add capacitor and compile iOS POC
- Add font
- Add icons

### Changed
- Update docker-compose.yml
- Improve readme
- Update readme with docker setup
- Standardize server naming
- Rename project
- Shift snapcast server url to env
- Improve change detection
- Decrease playertoolbar size
- Refactoring state management
- Handling states
- Setting up snapcast connection
- First hacky version of services and ui
- Tab routing
- Handle websocket notifications
- Improve realtiminess
- Clean up naming
- Routing
- Player toolbar formatting

### Fixed
- Fix desktop slider issues
- Fix broken link
- Fix title
- Fix disappearing range
- Hacky fix for overlapping tabbar

### Removed
- Remove double linting
- Remove old user preference service
- Remove deprecated service impor
- Remove old server stauts
- Remove old imports
- Clean up old service
- Remove auto generated assets, pages and components
- Removed over-engineered "desired" and "reported" state logic

## [0.1.0] - 2025-07-14

### Added
- Add contributing and app compile infos
- Add docker installation guide
- Add docker setup
- Add favicon

### Changed
- Update readme

## [0.0.3] - 2025-07-13

### Added
- User preferences in dashboard, loading and error handling

### Changed
- Clean up naming
- Routing

### Fixed
- Prevent range jitter if multiple apps are connected

## [0.0.2] - 2025-06-22

### Added
- Create LICENSE

### Changed
- Rename project
- Shift snapcast server url to env

### Removed
- Clean up old service
- Remove auto generated assets, pages and components

### Changed
- Refactored state management
- Use base64 for art data
- Add android platform to gitignore configuration

### Added
- Add mock server for testing
- Add proof-of-concept for speaker selection
42 changes: 42 additions & 0 deletions PRIVACY_POLICY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Privacy Policy for Beatnik Controller

**Last Updated:** August 1, 2025

This Privacy Policy describes how Beatnik Controller ("we," "us," or "our") handles your information when you use our web application and mobile applications (the "App").

## Introduction

Your privacy is important to us. Beatnik Controller is designed to be a local remote control for your Snapcast server. Our policy is simple: we do not collect, store, or share any of your personal information. All data required for the app to function is stored locally on your device.

## Information We Collect

Beatnik Controller does **not** collect any personally identifiable information. The App handles the following data, which is stored exclusively on your device (e.g., in your browser's local storage or on your mobile device):

* **Snapcast Server Address:** The hostname or IP address of your Snapcast server that you provide to connect the App to your server.
* **Application Settings:** User-specific settings such as client names, group configurations, and other preferences you set within the App.

This information is necessary for the core functionality of the App and is never transmitted to us or any third party.

## How We Use Your Information

The data stored by the App is used solely to:

* Establish and maintain a connection with your Snapcast server.
* Remember your settings and preferences for a better user experience.
* Allow the App to function as a remote control for your audio system.

## Data Storage and Security

All data entered into the App is stored locally on your device. We do not have access to this data. You are in full control of your information, and you can clear it at any time by clearing your browser's cache or the App's data on your mobile device.

## Third-Party Services

Beatnik Controller does not use any third-party services for analytics, advertising, or data collection.

## Changes to This Privacy Policy

We may update this Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page. You are advised to review this Privacy Policy periodically for any changes.

## Contact Us

If you have any questions about this Privacy Policy, please open an issue on our [GitHub repository](https://github.com/byrdsandbytes/beatnik-controller/issues).
45 changes: 45 additions & 0 deletions TERMS_OF_SERVICE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Terms of Service for Beatnik Controller

**Last Updated:** August 1, 2025

Please read these Terms of Service ("Terms", "Terms of Service") carefully before using the Beatnik Controller web application and mobile applications (the "Service") operated by the Beatnik Controller project contributors ("us", "we", or "our").

Your access to and use of the Service is conditioned on your acceptance of and compliance with these Terms. These Terms apply to all visitors, users, and others who access or use the Service.

By accessing or using the Service, you agree to be bound by these Terms. If you disagree with any part of the terms, then you may not access the Service.

## 1. License

The Beatnik Controller application is free and open-source software licensed under the [AGPL v3 License](https://www.gnu.org/licenses/agpl-3.0.en.html). Your use of the software is subject to the terms of this license.

## 2. Use of the Service

You are responsible for your use of the Service and for any consequences thereof. The Service is a tool to control a [Snapcast](https://github.com/badaix/snapcast) server that you operate. You are responsible for the setup, configuration, and maintenance of your own Snapcast server.

You agree not to use the Service for any purpose that is illegal or prohibited by these Terms.

## 3. Disclaimer of Warranties

The Service is provided on an "AS IS" and "AS AVAILABLE" basis. The Service is provided without warranties of any kind, whether express or implied, including, but not limited to, implied warranties of merchantability, fitness for a particular purpose, non-infringement, or course of performance.

We do not warrant that the Service will function uninterrupted, secure, or available at any particular time or location; that any errors or defects will be corrected; or that the Service is free of viruses or other harmful components.

## 4. Limitation of Liability

In no event shall the project contributors, nor its directors, employees, partners, agents, suppliers, or affiliates, be liable for any indirect, incidental, special, consequential, or punitive damages, including without limitation, loss of profits, data, use, goodwill, or other intangible losses, resulting from (i) your access to or use of or inability to access or use the Service; (ii) any conduct or content of any third party on the Service; (iii) any content obtained from the Service; and (iv) unauthorized access, use, or alteration of your transmissions or content, whether based on warranty, contract, tort (including negligence), or any other legal theory, whether or not we have been informed of the possibility of such damage, and even if a remedy set forth herein is found to have failed of its essential purpose.

## 5. Governing Law

These Terms shall be governed and construed in accordance with the laws of Switzerland, without regard to its conflict of law provisions.

Our failure to enforce any right or provision of these Terms will not be considered a waiver of those rights. If any provision of these Terms is held to be invalid or unenforceable by a court, the remaining provisions of these Terms will remain in effect.

## 6. Changes

We reserve the right, at our sole discretion, to modify or replace these Terms at any time. We will try to provide at least 30 days' notice prior to any new terms taking effect. What constitutes a material change will be determined at our sole discretion.

By continuing to access or use our Service after those revisions become effective, you agree to be bound by the revised terms. If you do not agree to the new terms, please stop using the Service.

## 7. Contact Us

If you have any questions about these Terms, please open an issue on our [GitHub repository](https://github.com/byrdsandbytes/beatnik-controller/issues).
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "beatnik",
"version": "0.1.0",
"version": "0.2.1",
"author": "byrds & bytes gmbh",
"homepage": "https://beatnik.ch",
"scripts": {
Expand Down
32 changes: 32 additions & 0 deletions src/app/components/choose-speakers/choose-speakers.component.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@


<ion-header>
<ion-toolbar>
<ion-title>Choose Speakers</ion-title>
<ion-buttons slot="end">
<ion-button (click)="closeModal()">
<ion-icon name="close"></ion-icon>
</ion-button>
</ion-buttons>
</ion-toolbar>
</ion-header>

<ion-content>
<div class="choose-speakers-container">
<p>Select the speakers you want to use:</p>
<!-- Add your speaker selection logic here -->
<div class="row">
<div class="col-6" *ngFor="let speaker of speakers">
<img [src]="speaker.image" alt="{{ speaker.manufacturer }} {{ speaker.model }}" class="speaker-image">
<ion-item lines="none" (click)="selectSpeaker(speaker.id)">
<ion-icon slot="end" [name]="'checkmark-circle'" *ngIf="selectedId === speaker.id"></ion-icon>
<ion-label> <h2>{{ speaker.manufacturer }} {{ speaker.model }}</h2></ion-label>
</ion-item>
</div>
</div>

<ion-button expand="full" color="primary" (click)="saveSelection()">
Save Selection
</ion-button>
</div>
</ion-content>
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { IonicModule } from '@ionic/angular';

import { ChooseSpeakersComponent } from './choose-speakers.component';

describe('ChooseSpeakersComponent', () => {
let component: ChooseSpeakersComponent;
let fixture: ComponentFixture<ChooseSpeakersComponent>;

beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ ChooseSpeakersComponent ],
imports: [IonicModule.forRoot()]
}).compileComponents();

fixture = TestBed.createComponent(ChooseSpeakersComponent);
component = fixture.componentInstance;
fixture.detectChanges();
}));

it('should create', () => {
expect(component).toBeTruthy();
});
});
Loading