Skip to content

Commit 6f43c78

Browse files
appaKappaKclaude
andcommitted
v1.7.2: rename Serve to Host, add list rename, remove paste label
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 9d538e8 commit 6f43c78

5 files changed

Lines changed: 32 additions & 27 deletions

File tree

README.md

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ A Python desktop app that fetches, parses, and deduplicates multiple Pi-hole blo
1717
- Progress bar and per-source status during combine
1818
- Save combined lists to a local library organized in folders
1919
- Load saved lists back into the combiner to merge with new sources
20-
- **Serve List** — hosts combined lists over HTTP on your LAN so Pi-hole can pull them directly via gravity; name each served file (e.g. `general.txt`, `tvs.txt`) so multiple lists can be served simultaneously at different URLs for Pi-hole group management
21-
- **Serve from Library**serve any saved list directly from the Library tab without re-combining
20+
- **Host List** — hosts combined lists over HTTP on your LAN so Pi-hole can pull them directly via gravity; name each hosted file (e.g. `general.txt`, `tvs.txt`) so multiple lists can be hosted simultaneously at different URLs for Pi-hole group management
21+
- **Host from Library**host any saved list directly from the Library tab without re-combining
2222
- Dark mode desktop GUI (customtkinter)
2323
- Window and taskbar icon
2424
- Install desktop shortcut / launcher entry (Linux)
@@ -49,14 +49,14 @@ The app opens with three tabs:
4949

5050
1. Build your combined list in the Combine tab
5151
2. Optionally type a filename (e.g. `general`) — leave blank for the default `blocklist.txt`
52-
3. Click **Serve List** — the `` indicator turns green and a URL appears (e.g. `http://YOUR.IP.GO.HERE:8765/general.txt`)
52+
3. Click **Host List** — the `` indicator turns green and a URL appears (e.g. `http://YOUR.IP.GO.HERE:8765/general.txt`)
5353
4. Copy the URL and paste it into Pi-hole's **Adlists** page
5454
5. Run **Update Gravity** in Pi-hole — it fetches and caches the list
55-
6. Click **Stop Serving** or close the app — Pi-hole retains the list from its gravity cache
55+
6. Click **Stop Hosting** or close the app — Pi-hole retains the list from its gravity cache
5656

5757
> Pi-hole and your PC just need to be on the same local network. The server defaults to port **8765**.
5858
59-
> **Tip:** To use Pi-hole's group management, build separate lists (e.g. one for general devices, one for smart TVs) and serve each with a different filename. Each URL is a separate adlist entry in Pi-hole that can be assigned to different groups.
59+
> **Tip:** To use Pi-hole's group management, build separate lists (e.g. one for general devices, one for smart TVs) and host each with a different filename. Each URL is a separate adlist entry in Pi-hole that can be assigned to different groups.
6060
6161
### Output format
6262

@@ -139,19 +139,24 @@ pytest tests/
139139
- `requests`
140140
- `customtkinter`
141141
- SQLite (Python stdlib)
142-
- `http.server` / `socket` (Python stdlib — no extra install needed for Serve List)
142+
- `http.server` / `socket` (Python stdlib — no extra install needed for Host List)
143143

144144
## Recent updates
145145

146+
**v1.7.2**
147+
- Renamed "Serve" to "Host" throughout the UI, tooltips, and documentation
148+
- **Rename list** — rename saved lists in the Library tab
149+
- Removed redundant paste box label (placeholder text is sufficient)
150+
146151
**v1.7.1**
147152
- **Hover tooltips** — all buttons and key inputs now show descriptive tooltips on mouseover
148153
- **Paste box placeholder** — gray hint text in the paste area that clears on focus
149154
- **Layout fix** — paste buttons no longer get cut off when combining large lists
150155

151156
**v1.7.0**
152-
- **Multi-path serving** — the HTTP server now supports serving multiple lists simultaneously at different URL paths; enables Pi-hole group management with separate lists per device group
153-
- **Custom serve filename** — name the served file in the Combine tab (e.g. `general``/general.txt`) instead of the fixed `/blocklist.txt`
154-
- **Serve from Library**serve any saved list directly from the Library tab with its own URL, without needing to re-combine
157+
- **Multi-path hosting** — the HTTP server now supports hosting multiple lists simultaneously at different URL paths; enables Pi-hole group management with separate lists per device group
158+
- **Custom host filename** — name the hosted file in the Combine tab (e.g. `general``/general.txt`) instead of the fixed `/blocklist.txt`
159+
- **Host from Library**host any saved list directly from the Library tab with its own URL, without needing to re-combine
155160

156161
**v1.6.0**
157162
- **Settings persistence** — port and Blocklist/Allowlist choice now saved to the local database; restored automatically on next launch
@@ -164,10 +169,10 @@ pytest tests/
164169
- URL extractor handles all paste formats: plain lists, markdown tables (backtick-wrapped URLs), Pi-hole dashboard, mixed prose
165170

166171
**v1.4.1**
167-
- Red/green `` indicator next to Serve List button shows server state at a glance
172+
- Red/green `` indicator next to Host List button shows server state at a glance
168173

169174
**v1.4.0**
170-
- **Serve List** — built-in LAN HTTP server serves the combined list so Pi-hole can pull it via gravity; stops cleanly on app close
175+
- **Host List** — built-in LAN HTTP server hosts the combined list so Pi-hole can pull it via gravity; stops cleanly on app close
171176

172177
**v1.3.3**
173178
- Virtual root now shows as `🏠 Root` vs user folders as `📁 name` — fixes delete being blocked when a folder named "Root" existed in the database

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "piholecombinelist"
7-
version = "1.7.1"
7+
version = "1.7.2"
88
requires-python = ">=3.9"
99
dependencies = [
1010
"requests>=2.28.0",

src/piholecombinelist/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""Pi-hole Combined Blocklist Generator."""
2-
# v1.7.1
2+
# v1.7.2
33

4-
__version__ = "1.7.1"
4+
__version__ = "1.7.2"
55

66
from .combiner import ListCombiner
77
from .database import Database

src/piholecombinelist/gui/combine_tab.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ def __init__(self, parent, db: Database, switch_to_library_cb, server: ListServe
143143
self._server = server
144144
self._list_type_var = list_type_var
145145

146-
# Whether the Combine tab is currently serving; tracks the active path
146+
# Whether the Combine tab is currently hosting; tracks the active path
147147
self._serving: bool = False
148148
self._serving_path: str = ""
149149

@@ -283,7 +283,7 @@ def _build_ui(self) -> None:
283283
save_lib_btn.pack(side="left")
284284
Tooltip(save_lib_btn, "Save to the app's built-in library for later use.")
285285

286-
# Serve row — host the list over HTTP for Pi-hole to pull
286+
# Host row — host the list over HTTP for Pi-hole to pull
287287
serve_row = ctk.CTkFrame(right, fg_color="transparent")
288288
serve_row.grid(row=4, column=0, sticky="ew", padx=10, pady=(0, 10))
289289
self._serve_indicator = ctk.CTkLabel(
@@ -313,7 +313,7 @@ def _build_ui(self) -> None:
313313
serve_row, text="Copy URL", width=80, command=self._copy_serve_url
314314
)
315315
Tooltip(self._serve_copy_btn, "Copy the URL to paste into Pi-hole's Adlists page.")
316-
# URL entry + copy button hidden until server starts
316+
# URL entry + copy button hidden until hosting starts
317317

318318
# ── Paste placeholder ────────────────────────────────────────────
319319

@@ -522,7 +522,7 @@ def _save_to_library(self) -> None:
522522
messagebox.showinfo("Saved", f'"{dialog.result_name}" saved to library.')
523523
self._switch_to_library()
524524

525-
# ── Serve over HTTP ──────────────────────────────────────────────
525+
# ── Host over HTTP ──────────────────────────────────────────────
526526

527527
def _serve_path_from_name(self) -> str:
528528
"""Build a URL path from the filename entry, defaulting to ``/blocklist.txt``."""
@@ -548,7 +548,7 @@ def _toggle_serve(self) -> None:
548548
else:
549549
content = self._output_box.get("1.0", "end").strip()
550550
if not content:
551-
messagebox.showwarning("Nothing to serve", "Combine sources first.")
551+
messagebox.showwarning("Nothing to host", "Combine sources first.")
552552
return
553553
path = self._serve_path_from_name()
554554
try:

src/piholecombinelist/gui/library_tab.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def __init__(self, parent, db: Database, get_combine_tab_cb, switch_to_combine_c
3333
self._server = server
3434
self._selected_folder_id: Optional[int] = None # None = root
3535
self._selected_list_id: Optional[int] = None
36-
# list_id → URL path currently being served (e.g. "/my-general-list.txt")
36+
# list_id → URL path currently being hosted (e.g. "/my-general-list.txt")
3737
self._served_paths: dict[int, str] = {}
3838

3939
self._build_ui()
@@ -153,7 +153,7 @@ def _build_ui(self) -> None:
153153
move_btn.pack(side="left")
154154
Tooltip(move_btn, "Move the selected list to a different folder. Doesn't change content.")
155155

156-
# Serve row — host a saved list over HTTP for Pi-hole
156+
# Host row — host a saved list over HTTP for Pi-hole
157157
serve_row = ctk.CTkFrame(right, fg_color="transparent")
158158
serve_row.grid(row=5, column=0, sticky="ew", padx=10, pady=(0, 10))
159159
self._lib_serve_indicator = ctk.CTkLabel(
@@ -174,7 +174,7 @@ def _build_ui(self) -> None:
174174
serve_row, text="Copy URL", width=80, command=self._copy_lib_serve_url
175175
)
176176
Tooltip(self._lib_serve_copy_btn, "Copy the URL to paste into Pi-hole's Adlists page.")
177-
# URL entry + copy button hidden until a list is being served
177+
# URL entry + copy button hidden until a list is being hosted
178178

179179
# ── Refresh helpers ──────────────────────────────────────────────
180180

@@ -293,7 +293,7 @@ def _select_list(self, list_id: int) -> None:
293293
self._lib_dupes_label.configure(
294294
text=f"Duplicates removed: {row['duplicates_removed']}"
295295
)
296-
# Reflect serve state for this list
296+
# Reflect host state for this list
297297
if list_id in self._served_paths:
298298
self._lib_serve_indicator.configure(text_color="#27AE60")
299299
self._lib_serve_btn.configure(text="Stop Hosting", fg_color=["#C0392B", "#922B21"])
@@ -320,7 +320,7 @@ def _delete_list(self) -> None:
320320
messagebox.showinfo("Select a list", "Select a list to delete.")
321321
return
322322
if messagebox.askyesno("Delete list", "Delete this list?", parent=self):
323-
# Stop serving this list if it's active
323+
# Stop hosting this list if it's active
324324
if self._selected_list_id in self._served_paths:
325325
self._server.remove_path(self._served_paths.pop(self._selected_list_id))
326326
self._db.delete_list(self._selected_list_id)
@@ -370,7 +370,7 @@ def _load_into_combiner(self) -> None:
370370
combine_tab.load_content_as_source(f"[library] {row['name']}", row["content"])
371371
self._switch_to_combine()
372372

373-
# ── Serve from Library ─────────────────────────────────────────
373+
# ── Host from Library ─────────────────────────────────────────
374374

375375
def _make_path(self, list_id: int, name: str) -> str:
376376
"""Return a unique ``/slug.txt`` path for *list_id*, avoiding collisions."""
@@ -384,11 +384,11 @@ def _make_path(self, list_id: int, name: str) -> str:
384384

385385
def _toggle_lib_serve(self) -> None:
386386
if self._selected_list_id is None:
387-
messagebox.showinfo("Select a list", "Select a list to serve.")
387+
messagebox.showinfo("Select a list", "Select a list to host.")
388388
return
389389
lid = self._selected_list_id
390390
if lid in self._served_paths:
391-
# Stop serving this list
391+
# Stop hosting this list
392392
self._server.remove_path(self._served_paths.pop(lid))
393393
self._lib_serve_indicator.configure(text_color="#C0392B")
394394
self._lib_serve_btn.configure(text="Host", fg_color=["#3B8ED0", "#1F6AA5"])

0 commit comments

Comments
 (0)