This file is a working draft for contributors/agents. It summarizes project structure, core docs, and practical workflows for changes in FeelUOwn.
- Project: FeelUOwn (desktop music player, Python + Qt)
- Main package:
feeluown/ - Entrypoint CLI:
feeluown/fuo - App modes: GUI-first, with protocol and server capabilities
Key references:
README.mdREADME.en.mddocs/source/index.rst
feeluown/: application sourceapp/: app bootstrap, config, lifecycleentry_points/: CLI entry logic (run.py)gui/: Qt UI (pages, widgets, sidebars, provider UI)library/: provider abstraction and protocolsplayer/: playback, playlist, FM/radio, media handlingserver/,webserver/: protocol/server side logicmodels/,serializers/,utils/: common infra
tests/: unit testsintegration-tests/: integration test runnerdocs/source/: user + developer docsMakefile: lint/test/build taskspyproject.tomlanduv.lock: dependency/runtime config
Use uv as the default project/dependency runner. Prefer uv commands over
direct pip usage for daily development.
Suggested setup:
- Prepare a Python >= 3.10 environment
- Sync dependencies with
uv - Run checks via
uv run
Useful commands:
uv sync --group dev --extra qt --extra jsonrpc --extra batteryuv run make pytestuv run make testuv run make integration_testuv run make lint
Notes:
- GUI tests are partially excluded in default pytest addopts.
- Integration tests run with
QT_QPA_PLATFORM=offscreen. - Before commit/push for PR updates, run full
uv run make testand record result summary in the PR thread.
Primary docs:
docs/source/dev_quickstart.rstdocs/source/dev_best_practice.rst(read on demand for coding style, UI design, runtime debugging, and recent engineering practices)docs/source/contributing.rstdocs/source/arch.rst
Practical conventions:
- Prefer small, focused changes.
- Add/adjust tests for behavior changes under
feeluown/. - Keep comments/docstrings in English.
- For Qt widgets, prefer a
setup_uistyle split when code grows. - Handle provider/network exceptions defensively in GUI flows.
Layering rules for GUI code:
gui/widgets/: app-independent reusable widgets.gui/components/: reusable UI units that depend onappor app managers.gui/pages/: route-level orchestration and page composition only.
Placement rule for shared UI:
- If a shared UI piece needs
app(e.g. browser navigation, provider UI manager), place it undergui/components/, notgui/widgets/or a specific page module.
Page rendering rule:
- For pages rendered as custom widget bodies, use shared page-level helpers
(for example,
render_scroll_area_view) to keep route rendering behavior consistent and avoid duplicated setup code.
Provider-scoped vs multi-provider presentation:
- Multi-provider pages should keep source-identifying affordances.
- Provider-scoped pages should prefer cleaner headers and avoid redundant source decorations.
Responsive layout rule:
- Let a page own its responsive reflow logic based on its own available width.
- Avoid parent-coupled resize orchestration unless there is a proven structural need.