Skip to content
  • Wiki
  • About Us
  • Rules
  • Categories
  • 0 Unread 0
  • Recent
  • Tags
  • Users
  • Groups
  • Into The Fediverse
  • Chats
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (Spacelab)
  • No Skin
Collapse
Brand Logo

UnfinishedProjects

Lemmy/Piefed Mastodon Codeberg

administrators

Private

Posts


  • 📌 Changelog ❖ 2026-04-09
    AnthonyA Anthony

    2026-04-09:

    ◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤

    Wiki Tasks (ToDo List):

    ◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤

    ╔══════════════▣◎▣══════════════╗

    Codeberg KanBan

    ╚══════════════▣◎▣══════════════╝


    Forum Tasks (ToDo List):

    ◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤

    ╔══════════════▣◎▣══════════════╗

    Codeberg KanBan

    ╚══════════════▣◎▣══════════════╝

    Changelog

  • [www-gem] A tinkerer
    www-gemW www-gem

    Hey everyone!

    I’m a lifelong tinkerer who’s been running Arch Linux for about 25 years now. I’m a big FOSS advocate and feel most at home in the terminal. If there’s a CLI tool for it, I probably prefer it.
    I try to not be opinionated and always go by “the Linux community highest power is to offer a tool for everyone’s needs”. There’s no such thing like a best tool or distro.

    I spend a lot of time writing small scripts in Python and Bash to automate the boring stuff, and I have a mild (okay, not mild) obsession with tweaking dotfiles and config files. Over the years I’ve hopped through window managers like Awesomewm, i3, and Sway on X11, and I’m currently running Niri on Wayland.

    I also keep a blog where I write about overlooked CLI tools that deserve more love.

    Outside the terminal, I’m into 3D printing for 6 years now, long-distance trail running (because debugging scripts isn’t enough suffering), and home automation (HomeAssistant).
    I had a discussion with a friend recently that made me realize that there’s nothing I don’t tweak in my life 😄

    Looking forward to learning, sharing, and swapping tips with fellow tinkerers! I’d be happy to help with any unfinished projects you’ve got. I mostly throw out wild ideas, but every now and then, one of them actually works 🙂

    PS: I’m also one of the two moderators who have helped @Anthony with this project, so I’d love to see it being successful. That doesn’t mean becoming the cool kid around the blog, but rather to see it recapturing the old Internet vibe I’ve been missing where people come together to build something collaboratively.

    Introductions

  • [Seeking] Converting a script to a Neovim plugin
    www-gemW www-gem

    Thanks for taking the time to stop by and the kind words. Neovim really does everything it can to come across as unfriendly to new users, which is frustrating given how powerful it can be for improving your workflow 😞 I’ve tried getting others to use it, but it typically takes a couple of hours just to learn the basics, and then consistent use before it starts to feel natural. That’s too much involvement in today’s world.

    Are you planning on sharing any of your own projects here?

    Skill Exchange

  • [Anthony] - An Introduction.
    AnthonyA Anthony

    Hello everyone!

    My name is Anthony, and I am currently the steward for this community’s platforms. I say “steward”, because I want our community to act more as a public service than as a private entity. While our forum is acting more as a communication and networking tool to connect individuals, our wiki will hopefully act as a hub for projects to grow and document progress. If our platform and community grow, I don’t want all of that project progress to rely on a single individual. or a single server - If something were to happen to me and/or the server, my hope is that someone else in the community is able to reboot the project with all of the data intact. To help solve this issue, an XML dump of the wiki contents are pushed to a public codeberg repository daily (https://codeberg.org/UnfinishedProjects/WikiBackups), and full/true backups (Cloudron “one-click” encrypted backups) are shared between myself and two other trusted admins (@www-gem and @alectronic). While I would love for their to be a way to share these publicly, I cannot due to sensitive information stored like the encrypted passwords and emails. However, between the 3 of - that leaves 2 other individuals who can reboot these platforms almost instantly to a new server and domain if needed, with all the data saved.

    But enough about the UnfinishedProject platform, and a bit more about me, since this is supposed to be an introduction after all 🙂


    Interests: While I have always admired those who are able to stick with something and become truly great at it, that just isn’t who I am - and I have long since come to terms with that. I often find new things that pique my interest, and a new project to work on - thinking about it every waking moment and hyper-fixating on the said project until the eventual burnout and abandonment of the project. So in short, I like to start projects - but I rarely finish them ¯_ (ツ)_/¯ - hence the motivation behind the name “UnfinishedProjects”.

    Not to go back to speaking about the platform again, but my hope is that this platform will be perfect for people like me who love to dive headfirst into projects, even if they aren’t always able to see the project all the way through to the end. I hope that people can jump between projects and contribute their skills in small chunks without the requirement to commit long term.

    With that said, my interests are always changing and I love to learn new thing - although sometimes the time to do so is a limiting factor. In the past I have pursued some of the following hobbies to various degrees of success:
    Blender (3d modeling/sculpting), Stop-motion animation, Programming, Game Development (Godot mostly, but also Unity), Clay Sculpting, Tabletop/Board Game Design, Graphic Design (Inkscape mostly), Sociology, Linux, Reading (not as much as I would like), and whatever else my squirrel brain decides to go down the rabbit whole researching (⌐■_■).

    Current Projects:

    1. Amalgam: My main project is one that I have been working on for more than 10 years. I usually get myself super invested working on the project, abandon it - only to pick it back up in a couple of years. The project is Amalgam (this is a link to our wiki, and I have not yet fleshed this out - but will work on filling this in soon), a 2 player abstract board game. The rules are still getting tweaked here and there as more playtesting reveals overpowered strategies.
      The game can be tested here - but be warned that this is pretty much a “vibe coded” demo of the project to get all the rules working, and an attempt to try and get a bot to play against…spoiler: the bot is terrible and can hardly play the game. The Repository is here, and the README has links to the rules document, a video tutorial, and etc.
    2. Chinese Mandarin Vocabulary App: This is sort of just a little side project that I have mostly abandoned for now, but may come back to in the future. Easier than explaining it, is to just go try it out in the browser here - but essentially it just lists through the HSDK 3.0 vocabulary words and tries to gamify the flashcards - allowing you to change fonts, simplified/traditional, hear the pronounciation, and actually write the hanzi characters. The “dream” for this app is to get other people on board to help turn it into a vocabulary app for many languages, and make it more fun and gamified. (side tangent: too many learning apps that are “gamified” are not actually fun - I think we should try to make a learning tool that is actually fun and you want to play). Disclaimer: this app is also a bunch of AI “slop”, and was originally just an app I was throwing together for myself to try and get myself to study Chinese vocabulary.

    I am hoping to try and get myself away from typical social media platforms, and hopefully this platform will become my main place to post updates and such (other than my piefed/mastodon accounts for this platform), however I have been using Patreon as my way to post updates on my various projects for some time, as it allows me to upload files and such. It is essentially acting as my personal blog.
    Patreon: My Patreon - note: I am not looking for donations, this account is just to share my projects 🙂

    Sorry, I know my writing can get a bit off track and verbose, but if you actually made it through the whole post, thanks for reading and welcome to our community! I am genuinely excited to see what we can grow this platform into. I am hoping that we can make some genuine connections and help build up each other’s projects ( ◡̀_◡́)ᕤ

    • Anthony

    #introduction #FOSS #boardgame #hobby #about

    Introductions

  • [Seeking] Converting a script to a Neovim plugin
    www-gemW www-gem

    Seeked skill

    If you know how to build a Neovim plugin and allow for custom user keybinding, we can be friend 🙂

    The project

    Few months ago, I decided to build something that would allow one to stay in Neovim while interacting with Taskwarrior. I didn’t want to reinvent Taskwarrior so I went with a simple script limited to my needs. After sharing it online, some people showed interest in this tool. As a result, I’ve added few features, but the remaining issue is to convert this script as a real Neovim plugin.

    The features

    • Create/edit/update a task: Type #TW some text and use the default keybinding <leader>ta to create a task with some text as description, and add a task annotation in the form of “+line filepath” so you can easily access this task’s line from Taskwarrior.
      The script will recognize the #TW pattern and ask for a project name, start and due date, and tags for this task. By default, the due date is set to start+1h to fit my specific needs, but you can change that by editing line 90.
      All these fields are optional. The task will be added to Taskwarrior, and the task UUID will be appended to the line which will be commented.

    • Delete a task: Using the default <leader>td keybinding will delete the current line if it has a valid task UUID and remove the task in Taskwarrior. In the background, it will also add task’ annotations to all tasks below the current line.

    • Undo actions: Revert the last delete action with the default <leader>tu keybinding.

    • Retrieve task info summary: With the default <leader>ti keybinding, can call a notification window that will show you a summary of the task info.

    • Mark task as completed: Can be done using <leader>tc keybinding.

    The missing steps

    I’ve never built a real Neovim plugin. and this project was designed to be one more script to my collection. Hence, there are two issues remaining to be solved to convert this idea to a plugin:

    1. Create a correct git structure to allow for pulling by Neovim plugin managers.
    2. Allow for users to customize the keybindings.

    The current script

    local M = {}
    -- Default
    M.keybindings.keybindings = {
    	create_or_update_task = "<leader>ta",
    	task_delete = "<leader>td",
    	task_undo = "<leader>tu",
    	task_info = "<leader>ti",
    }
    
    -- Function to allow users to define their own keybindings
    function M.setup(custom_keybindings)
    	-- Merge custom keybindings with the default ones
    	if custom_keybindings then
    		for action, key in pairs(custom_keybindings) do
    			if M.keybindings[action] then
    				M.keybindings[action] = key
    			end
    		end
    	end
    
    	-- Rebind the keys based on the defined keybindings
    	vim.keymap.set("n", M.keybindings.create_or_update_task, function()
    		M.create_or_update_task()
    	end)
    
    	vim.keymap.set("n", M.keybindings.task_delete, function()
    		M.task_delete()
    	end)
    
    	vim.keymap.set("n", M.keybindings.task_undo, function()
    		M.task_undo()
    	end)
    
    	vim.keymap.set("n", M.keybindings.task_info, function()
    		M.task_info()
    	end)
    end
    
    -- Annotation update function
    function M.annotation_update(line_nb)
    	if line_nb == 0 then
    		line_nb = vim.fn.line(".")
    	end
    	local total_lines = vim.api.nvim_buf_line_count(0)
    
    	for line = line_nb, total_lines do
    		local current_line = vim.fn.getline(line)
    		local task_id = string.match(current_line, "UUID: ([%w-]+)")
    		local annot_line_cmd = string.format("task %s export | jq '.[].annotations.[-1].description'", task_id)
    		local annot = vim.fn.system(annot_line_cmd)
    		local annot_line = string.match(annot, "+(%d+)")
    		annot_line = tonumber(annot_line)
    
    		if annot ~= "" and annot_line ~= line then
    			local file_path = vim.fn.expand("%:p")
    			local annotation = string.format("+%s %s", line, vim.fn.shellescape(file_path))
    			local annotate_cmd = string.format('task %s annotate "%s"', task_id, annotation)
    			vim.fn.system(annotate_cmd)
    			vim.notify("Annotation(s) updated")
    		elseif task_id and annot == "" then
    			vim.notify("Can't find UUID on line " .. line)
    		end
    	end
    end
    
    -- Create or update task
    function M.create_or_update_task()
    	local current_line = vim.fn.getline(".")
    	local file_path = vim.fn.expand("%:p") -- Get full path of current file
    	local line_number = vim.fn.line(".") -- Get current line number
    
    	-- Ask for parameters
    	local task_tag = ""
    	local start = vim.fn.input("Start date (MMDDYYHH:MM): ")
    	local due = vim.fn.input("Due date (default: start+1h): ")
    	local project = vim.fn.input("Project name: ")
    	local has_note = false
    	local additional_tags_input = vim.fn.input("Tags (separated by spaces): ")
    	local additional_tags = {}
    
    	-- Keywords to look for
    	local keywords = { "#TW" }
    
    	for _, keyword in ipairs(keywords) do
    		local kw_start_index, kw_end_index = string.find(current_line, keyword)
    		-- Check line validity
    		if not kw_start_index then
    			vim.notify("No valid keyword found")
    		else
    			local id_keyword = ":: UUID:"
    			local task_id = string.match(current_line, "UUID: ([%w-]+)")
    			local id_start_index = string.find(current_line, id_keyword)
    			local task_cmd
    
    			if task_id then
    				local task_description = string.sub(current_line, kw_end_index + 2, id_start_index - 2)
    				task_cmd = string.format('task %s mod %s "%s"', task_id, task_tag, task_description)
    			else
    				local task_description = string.sub(current_line, kw_end_index + 1)
    				task_cmd = string.format('task add %s "%s"', task_tag, task_description)
    			end
    
    			-- Add additional tags if available
    			for tag in additional_tags_input:gmatch("%S+") do
    				table.insert(additional_tags, "+" .. tag)
    				if string.match(tag, "note") then
    					has_note = true
    				end
    			end
    
    			if #additional_tags > 0 then
    				task_cmd = task_cmd .. " " .. table.concat(additional_tags, " ")
    			end
    
    			-- Add project if available
    			if #project > 0 then
    				task_cmd = task_cmd .. " project:" .. project
    			elseif project == " " then
    				task_cmd = task_cmd .. " project:"
    			end
    
    			-- Add start date if available
    			if #start > 0 then
    				task_cmd = task_cmd .. " start:" .. start
    			end
    
    			-- Add due date if available and tag is not note
    			if #due > 0 and not has_note then
    				task_cmd = task_cmd .. " due:" .. due
    			elseif has_note then
    				task_cmd = task_cmd .. " due:"
    			elseif due == " " then
    				task_cmd = task_cmd .. " due:"
    			else
    				task_cmd = task_cmd .. " due:start+1h"
    			end
    
    			-- Execute the task add command
    			local output = vim.fn.system(task_cmd)
    
    			-- Task update notification
    			local task_id = string.match(current_line, "UUID: ([%w-]+)")
    			if task_id then
    				vim.notify("Task updated")
    			end
    
    			-- Add annotation to new task
    			local new_task_id = string.match(output, "Created task (%d+)%.")
    			if new_task_id then
    				local tasks_number_cmd = "task count status=pending"
    				local tasks_number = vim.fn.system(tasks_number_cmd)
    				tasks_number = tasks_number:gsub("%s+$", "")
    				local new_task_id_cmd = string.format("task %s export | jq '.[].uuid' | sed 's/\"//g'", tasks_number)
    				new_task_id = vim.fn.system(new_task_id_cmd)
    				new_task_id = new_task_id:gsub("%s+$", "")
    
    				-- Annotate task with filename and line number
    				local annotation = string.format("+%s %s", line_number, vim.fn.shellescape(file_path))
    				local annotate_cmd = string.format('task %s annotate "%s"', new_task_id, annotation)
    				vim.fn.system(annotate_cmd)
    				vim.notify("Task created")
    
    				-- Add UUID to line
    				local line_id = current_line .. " :: UUID: " .. new_task_id
    				vim.fn.setline(".", line_id)
    
    				-- Comment the line
    				vim.api.nvim_command("normal! gcc")
    			elseif not task_id then
    				vim.notify("Failed to extract task ID")
    			end
    
    			-- Update annotation on line change
    			M.annotation_update(0)
    		end
    	end
    end
    
    -- Task delete function
    function M.task_delete()
    	local current_line = vim.fn.getline(".")
    	local task_id = string.match(current_line, "UUID: ([%w-]+)")
    	local status_cmd = string.format("task %s export | jq '.[].status' | sed 's/\"//g'", task_id)
    
    	if task_id then
    		local delete_cmd = string.format("task rc.confirmation=off del %s", task_id)
    		vim.fn.system(delete_cmd)
    		vim.notify("Task " .. task_id .. " deleted")
    		vim.api.nvim_command("normal! dd")
    		M.annotation_update(0)
    	else
    		vim.notify("Can't find UUID task")
    	end
    end
    
    function M.task_complete()
    	local current_line = vim.fn.getline(".")
    	local task_id = string.match(current_line, "UUID: ([%w-]+)")
    
    	if task_id then
    		local complete_cmd = string.format("task %s mod status:completed", task_id)
    		vim.fn.system(complete_cmd)
    		vim.notify("Task " .. task_id .. " completed")
    		M.annotation_update(0)
    	else
    		vim.notify("Can't find UUID task")
    	end
    end
    
    -- Undo function
    function M.task_undo()
    	local undo_cmd = string.format("task rc.confirmation=off undo")
    	local undo_output = vim.fn.system(undo_cmd)
    	vim.cmd("undo")
    	vim.notify("Undo output: ", undo_output)
    end
    
    -- Task info function
    function M.task_info()
    	local current_line = vim.fn.getline(".")
    	local task_id = string.match(current_line, "UUID: ([%w-]+)")
    	local info_cmd = string.format("task %s info | head -n 12", task_id)
    	local info = vim.fn.system(info_cmd)
    	vim.notify(info)
    end
    
    return M
    
    Skill Exchange

  • We're Open!
    AnthonyA Anthony

    Welcome!

    I’ll keep this short, but I mostly just wanted to thank anyone stopping by to check out our community.
    The forum is pretty sparse at the moment, but feel free to introduce yourself and help us build up the community (we hope you’ll stick around long enough to help us jump start community activity).

    We’ve been busy setting up the wiki (unfinishedprojects.net), and we still have quite a bit to do, but we’ll try to start populating it with some of our projects eventually to give you a better idea of how it will work. In the meantime, feel free to post your projects in the Project Showcase Forum Category, or simply stick around and chat.

    Either way, we’re just glad you are here and hope that you’ll help us grow our community. Please feel free to let us know if you find any bugs, issues, or have any recommendations.

    - The Unfinished Projects Team

    Announcements announcement

  • 📌 How to "Ask a Question" ❖ 2026-03-29
    UnfinishedProjectsU UnfinishedProjects

    When someone has answered your question, select from the dropdown: “Mark as Correct”

    f5160fd3-543e-4f4c-8d1e-98cd3e2e8b4c-image.jpeg

    Also, it doesn’t hurt to give them an upvote as well ( ദ്ദി ˙ᗜ˙ )

    c5b45e2b-dd70-4d8c-8fa4-eacd21a0cfdf-image.jpeg

    Help & Support site-info

  • 📌 How to "Ask a Question" ❖ 2026-03-29
    AnthonyA Anthony

    Hey, I think I know the answer to your question . . .

    Help & Support site-info

  • 📌 How to "Ask a Question" ❖ 2026-03-29
    UnfinishedProjectsU UnfinishedProjects

    Before you submit, hit the dropdown and select “Ask as question”.

    ad10510c-4fb7-43fa-b13c-61aa5461fd56-image.jpeg

    Help & Support site-info

  • Poll Test: Fruit
    AnthonyA Anthony

    Lol, Apples are good. Idk if they are my favorite or not, but their good 😉

    Also, I don’t think Gui answered the poll (I took it twice - one with this account, and one with the “UnfinishedProjects” account xD

    Testing

Member List

AnthonyA Anthony
UnfinishedProjectsU UnfinishedProjects
A alectronic
www-gemW www-gem
  • Login

  • Don't have an account? Register

  • Login or register to search.
  • First post
    Last post
0
  • Wiki
  • About Us
  • Rules
  • Categories
  • Unread 0
  • Recent
  • Tags
  • Users
  • Groups
  • Into The Fediverse
  • Chats