Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
39fb106
Docker image is now based on debian base. Removed old testing docker …
semohr Oct 14, 2025
0bb5516
Updated docs where applicable.
semohr Oct 14, 2025
e09d417
source not available in dev entrypoint
semohr Oct 14, 2025
c4a99b9
Workflows should also run on release branches
semohr Dec 19, 2025
3502981
A number of small tooling enhancements (prod only):
semohr Dec 19, 2025
b9e038f
Enhanced dev setup
semohr Dec 19, 2025
62a9d87
Tweaks to Dockerfile: ffmpeg Architecture dependence, and fixed cache…
pSpitzner Dec 20, 2025
f118326
Updated sh scripts in doc sections, no more alpine references.
pSpitzner Dec 21, 2025
8c8353a
UV can't use link mode inside docker
semohr Dec 23, 2025
20216e7
Adapted ci to use uv.
semohr Dec 28, 2025
a94eaf8
Added changelog entry for uv and ffmpeg. Also adjusted contribution
semohr Dec 28, 2025
67afd94
Merge pull request #219 from pSpitzner/debian_image
pSpitzner Dec 29, 2025
18dcbdd
Replaced pandas with polars in artists endpoint.
semohr Dec 23, 2025
0aa6e97
Merge pull request #248 from pSpitzner/refactor_artists_endpoint_polars
pSpitzner Dec 29, 2025
6262ffa
Config schema validation (#224)
pSpitzner Dec 29, 2025
40383c8
fixed a few config loading issues
pSpitzner Dec 29, 2025
b8e07fd
File upload (#102)
semohr Dec 29, 2025
6f57510
Version bump, Changelog, Readme, Docs
pSpitzner Dec 29, 2025
1359896
Add a feature flag for the terminal.
bendardenne Jan 6, 2026
8c3fac2
Fix tsc inferring restrictive type for navItems.
bendardenne Jan 6, 2026
dbe426a
Apply prettier.json
bendardenne Jan 6, 2026
08c59b2
Fixing ESLint unhappy with imports
bendardenne Jan 6, 2026
2fbb8ac
Show a placeholder at /terminal when disabled.
bendardenne Jan 6, 2026
e23e4d9
Added UV to the base image, so that we can use `uv pip install` in pr…
pSpitzner Jan 7, 2026
2614830
using `uv pip install` for user installs on startup
pSpitzner Jan 7, 2026
2675464
Added a note to the docs about uv and pip, and also removed native pi…
pSpitzner Jan 7, 2026
5eb2e9a
make sure permissions are sensible on the pip mock script
pSpitzner Jan 8, 2026
e75effc
Merge pull request #257 from pSpitzner/docker_tweaks
pSpitzner Jan 8, 2026
3994db4
Show a placeholder at /terminal when disabled.
bendardenne Jan 10, 2026
634228b
Don't crash the backend for configuration errors during init.
bendardenne Jan 10, 2026
0964ec5
Fix typo
bendardenne Jan 11, 2026
bc077ec
Closes #264
pSpitzner Jan 12, 2026
a2bdc05
Updated Changelog
pSpitzner Jan 11, 2026
eda7f54
Merge pull request #265 from pSpitzner/fix_264
pSpitzner Jan 12, 2026
11724e4
Reworked folder structure around the default config.
pSpitzner Jan 11, 2026
57ee9b9
Fix for unit tests
pSpitzner Jan 12, 2026
1477d25
Renamed config option from `enable` to `enabled` for consistency with…
pSpitzner Jan 12, 2026
a8789b9
Renamed Option in frontend, added Changelog entry
pSpitzner Jan 12, 2026
c1532d3
Merge pull request #254 from bendardenne/terminal-feature-flag
pSpitzner Jan 25, 2026
80d234e
Merge pull request #266 from pSpitzner/fix_demo_statup
pSpitzner Jan 25, 2026
a8d3031
Version Bump (rc2)
pSpitzner Jan 25, 2026
40d5478
Closes #260 and added docs for our other env variables
pSpitzner Jan 25, 2026
6100656
Merge pull request #271 from pSpitzner/puid_envvar
pSpitzner Feb 6, 2026
54cdd9f
make redis server configurable through $REDIS_URL
lina-bh Feb 2, 2026
d8e35bc
add configurable redis to changelog
lina-bh Feb 25, 2026
467d3c5
add an explanation about REDIS_URL to the documentation
lina-bh Feb 25, 2026
0bb07c7
Changed heuristic for archive checks to only use file extensions (#285)
semohr Mar 9, 2026
c120faa
Added shell to fix issue with /sbin/nologin
semohr Mar 9, 2026
e8aff4b
Added changelog entry.
semohr Mar 9, 2026
76817d0
Adjusted url and default port in docs.
semohr Mar 11, 2026
f18e565
Merge pull request #277 from lina-bh/redis-url
semohr Mar 11, 2026
0810c72
Merge pull request #286 from pSpitzner/tmux_shell
pSpitzner Mar 13, 2026
b5d4124
Docker container now inherits from debian directly instead of
semohr Mar 10, 2026
085bbb9
Let's be a bit more explicit when and how we activate the virtual
semohr Mar 13, 2026
607d892
Consistent use of python:3.12-slim-trixie so we have less different i…
pSpitzner Mar 13, 2026
46049ee
Merge pull request #287 from pSpitzner/removed_python_container_inherit
pSpitzner Mar 13, 2026
07cd41b
Version increment.
semohr Mar 17, 2026
473d163
Package upgrades python.
semohr Mar 17, 2026
b6492ce
Package upgrades typescript.
semohr Mar 17, 2026
4fd89b3
Added type ignore for mypy error (new as confuse is typed now).
semohr Mar 17, 2026
c53212f
Merge pull request #292 from pSpitzner/2.0.0-rc4
semohr Mar 17, 2026
e645697
Added alembic migration system.
semohr Apr 8, 2026
6d8cda3
Removed unused with_db_session decorator
semohr Apr 8, 2026
5acff2c
Added initial migration
semohr Apr 8, 2026
c445595
Added runtime validation for migration:
semohr Apr 8, 2026
f40d836
Fixed minor circular FK issue
semohr Apr 8, 2026
83898ca
Removed old db init scripts in favor for inline migration scripts.
semohr Apr 8, 2026
cf82961
Fixed minor formatting issues and added docs around the migrations.
semohr Apr 8, 2026
571e60d
Added unittests for migration.
semohr Apr 8, 2026
9221e40
Fixed typing issue in new _reset_database function
semohr Apr 9, 2026
1dd6ff5
Changelog entry
semohr Apr 9, 2026
0183c36
added a comment
pSpitzner Apr 13, 2026
a10cff8
Added a small backup and integrity step to the migration run.
semohr Apr 14, 2026
f080cf8
skip backup if no migration required.
semohr Apr 14, 2026
62e63bd
Merge pull request #294 from pSpitzner/db_migrations
semohr Apr 14, 2026
13dbf6c
Migrated items in taskStateDB to proper dict schema. No more pickle
semohr Apr 12, 2026
ecf3103
Added some comments / restructured.
pSpitzner Apr 13, 2026
4b875fd
Enhanced comment.
semohr Apr 14, 2026
4939602
Minor fixes
semohr Apr 16, 2026
0435ef7
Merge pull request #296 from pSpitzner/items_to_json
semohr Apr 18, 2026
e7b8386
Moved items to separate table.
semohr Apr 19, 2026
ac692f9
Some renames
semohr Apr 19, 2026
d7113de
Merge pull request #301 from pSpitzner/item_to_table
semohr Apr 19, 2026
42acb77
Added match models.
semohr Apr 14, 2026
67b1194
Added mappers to convert between models and beets objects.
semohr Apr 14, 2026
4fd2ec4
Added migration.
semohr Apr 14, 2026
89233d3
Number of fixes to schema and added data migration.
semohr Apr 14, 2026
30a751a
Added TrackInfoMapper tests.
semohr Apr 16, 2026
adaf73a
Added ER Diagrams to Docs, and a dependency to create them from our S…
pSpitzner Apr 18, 2026
1a67e6e
Moved database schema docs into backend specific docs.
semohr Apr 18, 2026
5826fff
Adjusted readthedocs file
semohr Apr 18, 2026
753bcf3
Added Classes overview to documentation
pSpitzner Apr 18, 2026
a756ba9
More consistent use of BeetsPrefix, added PR279 mermaid
pSpitzner Apr 19, 2026
4b0e945
Added notes on notation.
semohr Apr 19, 2026
5fc236a
Introduced item mapper and adjusted logic to make "new" items table
semohr Apr 19, 2026
030e00e
Fixed test.
semohr Apr 20, 2026
ca3c5b2
Add Tasks diagram
pSpitzner Apr 20, 2026
8cc544f
Merge pull request #297 from pSpitzner/match_db_schema
semohr Jun 1, 2026
0cd826d
Rename search_album to search_name.
semohr Apr 18, 2026
fbdde37
Moved register for pickled files into temp folder.
semohr Apr 18, 2026
15fb583
Removed error handling as this is now catched by beets and should not
semohr Apr 18, 2026
cba3f44
Import changed for show_change.
semohr Apr 18, 2026
b464211
Fixed a few issues with our tag_albums caching for tests.
semohr Apr 18, 2026
35cd50d
Beets update to 2.6.1
semohr Apr 18, 2026
1c1e82f
Removed now unused imports
semohr Apr 18, 2026
300aabf
Merge pull request #299 from pSpitzner/beets_2_6_1
semohr Jun 1, 2026
65bb5a3
Seems like a straight forward upgrade.
semohr Apr 19, 2026
58fb5ec
Merge pull request #300 from pSpitzner/beets_2_7_1
semohr Jun 1, 2026
3fc8279
chore: backend package update
semohr Jun 1, 2026
af231f4
Merge pull request #313 from pSpitzner/chore_package_upgrades
semohr Jun 1, 2026
3ddad29
Removed nest_asyncio, it should not be needed anymore.
semohr May 29, 2026
e0805ab
Merge pull request #314 from pSpitzner/remove_nest_asyncio
pSpitzner Jun 2, 2026
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
5 changes: 5 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,15 @@

!backend/beets_flask
!backend/pyproject.toml
!backend/uv.lock
!backend/main.py
!backend/launch_*.py
!backend/generate_types.py

# DB migrations
!backend/alembic
!backend/alembic.ini

!configs/

!frontend/src/
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/changelog_reminder.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5

- name: Get all updated Python files
id: changed-files
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/docker_hub.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
type=raw,value=latest,enable=true

- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Set up QEMU
uses: docker/setup-qemu-action@v3
Expand Down
11 changes: 7 additions & 4 deletions .github/workflows/javascript.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@ name: Javascript checks

on:
push:
branches: ["main"]
branches:
- main
- release/** # all release branches
paths:
- frontend/**
pull_request:
# The branches below must be a subset of the branches above
branches: ["main"]
branches:
- main
- release/** # all release branches
workflow_dispatch:

jobs:
Expand All @@ -23,7 +26,7 @@ jobs:
node-version: ["22.20.0"]
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
Expand Down
28 changes: 15 additions & 13 deletions .github/workflows/python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,47 +2,49 @@ name: Python checks

on:
push:
branches: ["main"]
branches:
- main
- release/**
paths:
- backend/**
pull_request:
# The branches below must be a subset of the branches above
branches: ["main"]
branches:
- main
- release/**

jobs:
python:
name: Python checks
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Python
uses: actions/setup-python@v5
- uses: actions/checkout@v5

- name: Install uv
uses: astral-sh/setup-uv@v7
with:
python-version: "3.11"
python-version: "3.12"
- name: Install dependencies
run: |
cd ./backend
python -m pip install --upgrade pip
pip install ruff
pip install .[typed,test]
uv sync --all-extras --dev
- name: Check style with Ruff
continue-on-error: true
id: ruff
run: |
cd ./backend
ruff check --output-format=github .
uv run ruff check --output-format=github .
- name: Check type hints with mypy
continue-on-error: true
id: mypy
run: |
cd ./backend
mypy --show-error-codes --check-untyped-defs --config-file ./pyproject.toml .
uv run mypy --show-error-codes --check-untyped-defs --config-file ./pyproject.toml .
- name: Test with pytest
env:
PYTEST_ADDOPTS: "--color=yes"
run: |
cd ./backend
coverage run -m pytest -v
uv run coverage run -m pytest -v --benchmark-skip -W ignore::ResourceWarning
- name: Check for failures
if: steps.ruff.outcome == 'failure' || steps.mypy.outcome == 'failure'
run: |
Expand Down
176 changes: 101 additions & 75 deletions CHANGELOG.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
- Undo imports
- Web-Terminal
- Monitor multiple inboxes
- Drag-and-drop files to upload into inboxes
- Library view and search

<!-- end features -->
Expand Down
14 changes: 14 additions & 0 deletions backend/alembic.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Alembic Configuration
# Docs: https://alembic.sqlalchemy.org/en/latest/index.html

[alembic]
script_location = %(here)s/alembic
file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s
prepend_sys_path = .
path_separator = os

[post_write_hooks]
hooks = ruff
ruff.type = module
ruff.module = ruff
ruff.options = check --fix REVISION_SCRIPT_FILENAME
95 changes: 95 additions & 0 deletions backend/alembic/env.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
"""Alembic environment configuration for beets-flask database migrations.

This module configures Alembic to use the beets-flask database configuration
for both autogenerate support and runtime migrations.
"""

from alembic import context

# Import beets_flask database components
from beets_flask.config.flask_config import get_flask_config
from beets_flask.database.models.base import Base

# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config


# add your model's MetaData object here
# for 'autogenerate' support
# This is crucial for autogenerate to detect model changes
target_metadata = Base.metadata


def get_url() -> str:
"""Get the database URL from beets-flask configuration.

Returns
-------
str: The database connection URI.

"""
flask_config = get_flask_config()
return flask_config["DATABASE_URI"]


def run_migrations_offline() -> None:
"""Run migrations in 'offline' mode.

This configures the context with just a URL
and not an Engine, though an Engine is acceptable
here as well. By skipping the Engine creation
we don't even need a DBAPI to be available.

Calls to context.execute() here emit the given string to the
script output.

"""
url = get_url()
context.configure(
url=url,
target_metadata=target_metadata,
literal_binds=True,
dialect_opts={"paramstyle": "named"},
)

with context.begin_transaction():
context.run_migrations()


def run_migrations_online() -> None:
"""Run migrations in 'online' mode.

In this scenario we need to create an Engine
and associate a connection with the context.

"""
from sqlalchemy import engine_from_config, pool

# Get the database URL from beets-flask config
url = get_url()

# Create engine configuration with our URL
configuration = config.get_section(config.config_ini_section) or {}
configuration["sqlalchemy.url"] = url

connectable = engine_from_config(
configuration,
prefix="sqlalchemy.",
poolclass=pool.NullPool,
)

with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=target_metadata,
)

with context.begin_transaction():
context.run_migrations()


if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()
31 changes: 31 additions & 0 deletions backend/alembic/script.py.mako
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
"""${message}

Revision ID: ${up_revision}
Revises: ${down_revision | comma,n}
Create Date: ${create_date}

"""

from collections.abc import Sequence

import sqlalchemy as sa

from alembic import op

${imports if imports else ""}

# revision identifiers, used by Alembic.
revision: str = ${repr(up_revision)}
down_revision: str | Sequence[str] | None = ${repr(down_revision)}
branch_labels: str | Sequence[str] | None = ${repr(branch_labels)}
depends_on: str | Sequence[str] | None = ${repr(depends_on)}


def upgrade() -> None:
"""Upgrade schema."""
${upgrades if upgrades else "pass"}


def downgrade() -> None:
"""Downgrade schema."""
${downgrades if downgrades else "pass"}
Loading