-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Labels
enhancementNew feature or requestNew feature or request
Milestone
Description
Summary
Port the DecentConverter logic from the met-community-profiles repository to enable importing Decent Espresso profiles into Meticulous format. This extends the existing "Import from URL" feature (#96) and addresses profile interoperability (#284).
Background
Decent Espresso is the most popular prosumer espresso platform with thousands of community-shared profiles. The MeticulousHome team built a DecentConverter (Vue component) that converts Decent .json profiles to Meticulous format. We should port this logic to our backend.
Behaviour
Import Flow
- User navigates to Profile Catalogue → Import
- Three import options:
- From file (existing) — upload
.jsonfile - From URL (existing, Import from link #96) — paste any URL
- From Decent (new) — paste a Decent profile URL or upload Decent
.json
- From file (existing) — upload
- For Decent import:
- Backend detects Decent format (has
author,beverage_type,steps[]withflow/pressuretargets) - Runs DecentConverter logic to translate:
- Decent
steps[]→ Meticulousstages[] - Decent flow/pressure targets → Meticulous dynamics
- Decent
exit_condition→ Meticulousexit_triggers - Decent temperature → Meticulous temperature
- Decent
notes→ Meticulous description
- Decent
- Shows preview of converted profile with stage visualization
- User confirms → profile saved
- Backend detects Decent format (has
Decent Profile Sources
- Decent community links:
https://visualizer.coffee/shots/...export URLs - Diaspora profiles: Various community forums share
.jsonexports - Direct file upload: Users export from Decent tablet app
Conversion Details (from DecentConverter.vue)
| Decent | Meticulous |
|---|---|
steps[].flow |
stages[].dynamics.points (flow type) |
steps[].pressure |
stages[].dynamics.points (pressure type) |
steps[].temperature |
stages[].temperature |
steps[].exit.type == "pressure_over" |
exit_triggers[].type = "pressure" |
steps[].exit.type == "flow_over" |
exit_triggers[].type = "flow" |
steps[].seconds |
exit_triggers[].type = "time" |
steps[].weight |
exit_triggers[].type = "weight" |
author |
profile.author |
title |
profile.name |
notes |
profile.description |
Edge Cases
- Profiles with advanced Decent features (move-on conditions, limiter) → best-effort conversion with warning
- Profiles with
espresso_declinestep type → map to declining pressure/flow dynamics - Invalid/corrupt files → clear error message with format guidance
Implementation
Backend
- New service:
apps/server/services/decent_converter.pydetect_decent_format(data: dict) -> boolconvert_decent_to_meticulous(data: dict) -> dict- Port logic from
DecentConverter.vueto Python
- Extend
POST /api/import-from-urlto auto-detect Decent format - New endpoint:
POST /api/convert-decentfor direct file conversion - Validate output against
espresso-profile-schema
Frontend
- Add "Decent" import option in ProfileCatalogue import dialog
- Show conversion preview before saving
- Display warnings for unsupported Decent features
- i18n keys for all Decent-specific strings (6 locales)
Acceptance Criteria
- Decent profiles auto-detected by format
- Conversion produces valid Meticulous profiles (passes schema validation)
- Temperature, flow, pressure, and weight targets correctly mapped
- Exit conditions correctly translated
- Preview shown before save
- Edge cases handled with user-visible warnings
- i18n for all 6 locales
- Tests for converter with sample Decent profiles
References
- Research: research: MeticulousHome repository analysis — findings & impact for milestones 2.2–2.4 #283
- Import from URL: Import from link #96
- Profile interop: feat: Decent Espresso profile import & URL link conversion #284
- DecentConverter source: met-community-profiles
- Decent profile format: Decent docs
- Meticulous profile schema: espresso-profile-schema
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request