# target
# {
# 68 │ "createdAt": 1739262800,
# 69 │ "title": "Errands – Simple (GNOME) Tasks app",
# 70 │ "tags": [
# 71 │ "linux",
# 72 │ "opensource",
# 73 │ "productivity",
# 74 │ "Task Management",
# 75 │ "GNOME Apps",
# 76 │ "To-Do List",
# 77 │ "Linux Utility"
# 78 │ ],
# 79 │ "content": {
# 80 │ "type": "link",
# 81 │ "url": "https://apps.gnome.org/List/"
# 82 │ },
# 83 │ "note": "Errands is an open source GNOME app!"
# 84 │ },
# from
#
#
- Greater Good in Action
#
- Science based practices for a meaningful life
#
- Errands – Simple (GNOME) Tasks app
#
- Kept _very_ simple as a todo list application. Can sync with CalDAV/Nextcloud, or manually import lists. Can display today's tasks, multiple lists and has a trashcan functionality but not much more.
#
# Supports displaying tags, but have not even been able to find a way to filter by tag.
#
- EasyEDA - Online PCB design & circuit simulator
#
- EasyEDA is a free and easy to use circuit design, circuit simulator and pcb design that runs in your web browser.
#
# PCB Layouting software. Has a nice free (beer) version but is not free (freedom) software. Closely integrated w/ JLCPCB so you can see which parts you can get for what money.
#
- Awesome Docker Compose
#
- A collection of self-hosted apps you can quickly set up with Docker Compose.
#
# Nice collection of compose files. Fairly simple and not _super_ useful if you've done a couple composes, but they can provide good starter boilerplate until then.
#
- KiCad EDA - Schematic Capture & PCB Design Software
#
- Open source EDA / electronics CAD software for Windows, macOS and Linux. Use schematic capture, create PCB designs and view them in 3D, all forever free.
#
# Open source PCB schematic design.
#
- GitHub - madeofpendletonwool/PinePods: Pinepods is a complete podcast management system and allows you to play, download, and keep track of podcasts you enjoy. All self hosted and enjoyed on your own server!
#
- Pinepods is a complete podcast management system and allows you to play, download, and keep track of podcasts you enjoy.
#
# Integrates with gpodder sync! Integrates with Nextcloud gpodder app! Can thus use android clients like AntennaPod to listen and still have your own server! This makes me happy!
#
- GitHub - usebruno/bruno: Opensource IDE For Exploring and Testing Api's (lightweight alternative to postman/insomnia)
#
- Opensource IDE For Exploring and Testing Api's (lightweight alternative to postman/insomnia)
#
# FOSS and fully 'offline' (except for where you send your requests) alternative to Postman
#
- mergiraf/mergiraf: A syntax-aware git merge driver for a growing collection of programming languages and file formats. - Codeberg.org
#
- mergiraf - A syntax-aware git merge driver for a growing collection of programming languages and file formats.
#
# Interesting: A merge driver which tries to do its best to really only leave _conflicts_ over,
# using its knowledge of various syntax trees of languages.
#
- VisualJJ – Jujutsu in Visual Studio Code
#
- "Publish changes on GitHub in seconds. Effortlessly manage branches. Resolve conflicts with confidence."
#
# A visual (GUI) interface for JJ, including interesting PR merge ability with GitHub (which is a little more difficult with jj usually).
#
# Proprietary but currently free (beer) software.
#
- GitHub - kyoheiu/felix: tui file manager with vim-like key mapping
#
- tui file manager with vim-like key mapping. Yet another file manager. Has nicely working-by-default (in wezterm) jumping by integrating zoxide and image display by integrating chafa.
#
- GitHub - dahlia/iterfzf: Pythonic interface to fzf, a CLI fuzzy finder
#
- Pythonic interface to fzf, a CLI fuzzy finder. Super nice library to use - does come bundled with fzf binary in the wheels though.
#
- GitHub - mrusme/neonmodem: Neon Modem Overdrive
#
- TUI application for: Lemmy, Hackernews, Lobsters, Discourse (forums). A little.. overloaded in my opinion (including big huge splash screen when starting) but at the very least nice to learn from its code.
#
- The Dhall configuration language
#
- Configuration language which seeks to be maintainable and can be mapped onto a wide variety of other config langs (yaml, toml, ini etc). Functional and stable, has 'behavior-driven' hashing to compare versions and semantic diffs. Very cool.
#
- flohmarkt/flohmarkt: federated decentral classified ad software using activitypub - Codeberg.org
#
- Up-and-coming activitypub/fediverse implementation of a bulletin board software (similar to Craigslist/Kleinanzeigen/similar small announcement software), fully federated.
#
# Not entirely sure how it works with location-aware options, so you could search within a certain radius only which is an important part of any such list.
#
- GitHub - monasticacademy/httptap: View HTTP/HTTPS requests made by any Linux program
#
- View HTTP/HTTPS requests made by any Linux program.
#
import json
import sys
from bs4 import BeautifulSoup
if len(sys.argv) < 2:
print("ERROR: Pass the bookmarks file as argument.")
sys.exit(1)
path = sys.argv[1]
def parse_bookmark(html_content):
soup = BeautifulSoup(html_content, "html.parser")
bookmarks = []
if len(soup.find_all("dl")) != 1:
print("WARNING! More than one Bookmark element found. File may be corrupt.")
first = True
last_desc = ""
for el in soup.find_all("a"):
bm_el = {}
url = el["href"]
title = el.string.strip() if el.string else url
# date elements
add_date = el.get("add_date", "")
last_modified = el.get("last_modified", "")
tag_string = el.get("tags", "")
tags = tag_string.split(",") if tag_string else []
# TODO: url contains '/shaare/' == note type
# desc / note
desc_el = el.parent.find_next_sibling("dd")
# Have to fix the non-closed
tabs :\
# For now, in vim do: `:%s/.*/\0<\/DT>` to add a closing el to each line
description = desc_el.contents[0].strip() if desc_el else ""
if description and description == last_desc:
description = ""
if description:
last_desc = description
# print(f"URL: {url}, TITLE: {title}")
# print(f"ADD: {add_date}, MOD: {last_modified}, TAGS: {tags}")
# print(f"DESC: {description.strip()}")
content = {}
if "/shaare/" in url:
content = {"type": "text", "text": description}
# print(f"Detected note-style url ({url}) turning description to content.")
description = ""
else:
content = {"type": "link", "url": url}
bm_el = {
"title": title,
"note": description,
"createdAt": int(last_modified if last_modified else add_date),
"content": content,
}
if tags:
bm_el["tags"] = tags
if description:
bm_el["note"] = description
bookmarks.append(bm_el)
return bookmarks
with open(path) as f:
contents = f.readlines()
for i, line in enumerate(contents):
if "" in line:
contents[i] = f"{line.rstrip()}"
bookmarks = parse_bookmark("\n".join(contents))
print(json.dumps({"bookmarks": bookmarks}, indent=2))