funoteka 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -9,6 +9,37 @@ The version lives in exactly one place — `package.json`.
9
9
 
10
10
  _(nothing yet)_
11
11
 
12
+ ## [0.1.2] — 2026-09-17
13
+
14
+ ### Fixed
15
+
16
+ - **The version the server reports is now the version it is.** `0.1.1`'s image and
17
+ package both answered `0.1.0` on `/health` and in every Subsonic envelope,
18
+ because the version lives in a constant (`SERVER_VERSION`) that a test pins to
19
+ `package.json` — and the bump to `0.1.1` raised the manifest and left the
20
+ constant behind. **That test failed, and `0.1.1` was tagged while CI was red**,
21
+ which is the more serious half of this: the pipeline was watching the artefacts
22
+ and nobody was watching the pipeline. The constant is corrected, and the release
23
+ job now fails when the image it pulls answers with a version other than the one
24
+ the release is about — a check that can fail is what would have caught it.
25
+ - Nothing else changed: the same program as `0.1.0` and `0.1.1`, and the same
26
+ schema.
27
+
28
+ ## [0.1.1] — 2026-09-17
29
+
30
+ ### Fixed
31
+
32
+ - **The release pipeline verifies the package from outside the checkout, and on
33
+ the Node the package asks for.** `npx funoteka@<version>` run in the repository
34
+ root resolves the bin from the project it happens to stand in — whose own name
35
+ is `funoteka` — and reported `funoteka: not found` about a package that
36
+ publishes and installs fine; and the check ran on whatever Node the runner
37
+ ships, while the CLI needs `node:sqlite`. **No server code changed in this
38
+ patch:** `0.1.0` and `0.1.1` are the same program, and the image and the package
39
+ of `0.1.0` are published and verified. This is the release that proves the
40
+ pipeline end to end, taken as a patch because a tag whose verification is red
41
+ is not a release.
42
+
12
43
  ## [0.1.0] — 2026-09-17
13
44
 
14
45
  First public release. A Subsonic-compatible server that reads whatever is on
@@ -88,14 +119,18 @@ folders happen to be laid out is not a question a client ever has to care about.
88
119
  funoteka, and the same package carries the CLI (`scan`, `serve`, `stop`, `status`).
89
120
  Node refuses to strip types from anything under `node_modules`, so the package ships
90
121
  the sources compiled once at release — the repository itself still needs no build.
122
+ - **A published container image**: `ghcr.io/kzntsv-dev/funoteka:0.1.0` and
123
+ `:latest` — `linux/amd64` and `linux/arm64` in one manifest, so the main
124
+ install path needs no checkout.
91
125
  - Daemon mode with `status` and `stop`, a pid file that is checked against the
92
126
  OS rather than believed, and `DEPLOY.md`.
93
127
 
94
128
  ### Known limitations
95
129
 
96
- - **No published container image and no cross-build.** The `Dockerfile` is
97
- built by the machine that runs it and comes out for that machine's
98
- architecture.
130
+ - **The `arm64` leg of the published image is built under emulation** on an
131
+ `amd64` machine, and the `Dockerfile` in this repository still builds on the
132
+ machine that runs it — the path taken where a published image is not wanted or
133
+ not reachable.
99
134
  - **ffmpeg is needed for one case only:** cue segments inside m4a/ALAC. Without
100
135
  it those tracks answer with error code 70 and everything else keeps working.
101
136
  - **Some Subsonic endpoints are stubs** and say so instead of inventing an
package/DEPLOY.md CHANGED
@@ -60,9 +60,29 @@ node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
60
60
 
61
61
  ## 3. Path A — Docker (main path)
62
62
 
63
- Works the same on a laptop, a NAS and a VDS. The image is built on the machine
64
- that runs it (`build: .`), so it comes out `amd64` or `arm64` to match that
65
- machinethere is no published image and no cross-build yet.
63
+ Works the same on a laptop, a NAS and a VDS. There is a **published image**
64
+ `ghcr.io/kzntsv-dev/funoteka:0.1.2`, `linux/amd64` and `linux/arm64` in one
65
+ manifestand `build: .` still builds on the machine that runs it (that is the
66
+ path where a published image is not wanted or not reachable).
67
+
68
+ With no checkout to build from, the image and four values are the whole
69
+ installation (verified by running exactly this against the published image):
70
+
71
+ ```sh
72
+ MUSIC=/absolute/path/to/your/music
73
+ docker run -d --name funoteka -p 4533:4533 -p 4534:4534 \
74
+ -e FUNOTEKA_USER=you -e FUNOTEKA_PASSWORD=change-me \
75
+ -e FUNOTEKA_ADMIN_TOKEN=<the token you generated> \
76
+ -e FUNOTEKA_SUPERVISED=1 -e FUNOTEKA_LOG_FILE=/data/funoteka.log \
77
+ -v "$MUSIC":/music:ro -v funoteka-data:/data \
78
+ --restart unless-stopped ghcr.io/kzntsv-dev/funoteka:0.1.2
79
+ ```
80
+
81
+ `FUNOTEKA_SUPERVISED=1` is what makes `POST /restart` a restart rather than a
82
+ stop, and the restart policy beside it is what supervises the process. The first
83
+ scan is still a command, not a startup side effect — see the end of this section.
84
+
85
+ From a checkout, the same installation is the compose file:
66
86
 
67
87
  ```sh
68
88
  git clone <this repository> funoteka
package/README.md CHANGED
@@ -125,8 +125,8 @@ classification and you edit that layer, not your music.
125
125
  and the music reaches you through the Subsonic client you already like.
126
126
  - **Not tag-driven.** It will not merge your pressings, rename your artists to match an online
127
127
  database, or call home. Nothing about your collection leaves the machine.
128
- - **Not overclaiming.** Where a thing does not exist yet — a published cross-build, say the docs
129
- say so instead of pretending.
128
+ - **Not overclaiming.** Where a thing does not exist yet — a Subsonic endpoint that is still a
129
+ stub, the `arm64` leg built under emulation — the docs say so instead of pretending.
130
130
 
131
131
  ## Documentation
132
132
 
@@ -30,7 +30,7 @@ export const API_VERSION = '1.16.1';
30
30
  * module every route depends on.
31
31
  */
32
32
  export const SERVER_TYPE = 'funoteka';
33
- export const SERVER_VERSION = '0.1.0';
33
+ export const SERVER_VERSION = '0.1.2';
34
34
  /**
35
35
  * The fields every answer carries, whatever the answer is.
36
36
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "funoteka",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Subsonic-compatible server: smart music library — scanner-classifier, cue splitting, meta layer, virtual tree",
5
5
  "license": "MIT",
6
6
  "type": "module",