Compare commits
	
		
			No commits in common. "dff01df7bb61825ea152a653d1e6b18b39cdc4bc" and "df67adc3ee37476026e6327e01b57f7f2aa240a9" have entirely different histories. 
		
	
	
		
			dff01df7bb
			...
			df67adc3ee
		
	
		| 
						 | 
					@ -1,4 +1,2 @@
 | 
				
			||||||
.hugo_build.lock
 | 
					.hugo_build.lock
 | 
				
			||||||
public/
 | 
					public/
 | 
				
			||||||
public.tar.gz
 | 
					 | 
				
			||||||
auth.txt
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										13
									
								
								Justfile
								
								
								
								
							
							
						
						
									
										13
									
								
								Justfile
								
								
								
								
							| 
						 | 
					@ -1,13 +0,0 @@
 | 
				
			||||||
serve:
 | 
					 | 
				
			||||||
    hugo serve -D
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
publish:
 | 
					 | 
				
			||||||
    rm -f public.tar.gz
 | 
					 | 
				
			||||||
    hugo build
 | 
					 | 
				
			||||||
    cd public && tar czvf ../public.tar.gz *
 | 
					 | 
				
			||||||
    curl \
 | 
					 | 
				
			||||||
        -XPOST \
 | 
					 | 
				
			||||||
        --fail \
 | 
					 | 
				
			||||||
        -H @./auth.txt \
 | 
					 | 
				
			||||||
        -T public.tar.gz \
 | 
					 | 
				
			||||||
        https://rustybever.be/_root
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,108 +0,0 @@
 | 
				
			||||||
---
 | 
					 | 
				
			||||||
title: "Otter 0.1.0"
 | 
					 | 
				
			||||||
date: 2025-06-12
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Although life's been busy with university, I've found some time to finish
 | 
					 | 
				
			||||||
things up with the current codebase and release a first version. This version's
 | 
					 | 
				
			||||||
been running on my Raspberry Pi for a couple of months without problems, so it
 | 
					 | 
				
			||||||
seems to be fairly stable.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
For context, Otter is a lightweight implementation of the [gpodder.net
 | 
					 | 
				
			||||||
API](https://gpoddernet.readthedocs.io/en/latest/), specifically the parts
 | 
					 | 
				
			||||||
required for synchronizing subscriptions between clients. Its goal is to be an
 | 
					 | 
				
			||||||
easy-to-install alternative to gpodder.net, allowing self-hosters to easily
 | 
					 | 
				
			||||||
use the various Gpodder-based clients available across devices.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Version 0.1.0 has a fairly complete implementation of the parts of the Gpodder
 | 
					 | 
				
			||||||
API that's required for synchronizing clients. I've currently got no plans to
 | 
					 | 
				
			||||||
implement the more social media-related API routes, as these aren't necessary
 | 
					 | 
				
			||||||
for the goal of this project. 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Supported features
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Otter 0.1.0 implements the following API sections:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* Authentication
 | 
					 | 
				
			||||||
* Devices
 | 
					 | 
				
			||||||
* Subscriptions
 | 
					 | 
				
			||||||
* Episode actions
 | 
					 | 
				
			||||||
* Device synchronization
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This includes both the basic routes and the "advanced" sections, as described
 | 
					 | 
				
			||||||
in the API documentation. OPML and text output formats aren't supported yet, so
 | 
					 | 
				
			||||||
currently the API only supports JSON. I am planning on adding support for the
 | 
					 | 
				
			||||||
other output types later.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
In terms of client compatibility, Otter definitely works with AntennaPod and
 | 
					 | 
				
			||||||
Kasts. Kasts does have the strange bug where it crashes if you agree to the
 | 
					 | 
				
			||||||
"synchronize with all devices" popup when adding a new device. However, after
 | 
					 | 
				
			||||||
manually marking the devices as being synchronized on the server, all syncing
 | 
					 | 
				
			||||||
functionality works as expected. The Gpodder client also does not work, as it
 | 
					 | 
				
			||||||
strangely uses a different form of authentication. 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Both of these issues should get fixed in a following release, as I'd like Otter
 | 
					 | 
				
			||||||
to be generally usable with any client.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Ease of use
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Otter is distributed as a single binary configurable via a configuration file,
 | 
					 | 
				
			||||||
environment variables and CLI arguments. Everything can be set up via any of
 | 
					 | 
				
			||||||
these three methods (or a combination), allowing Otter to be easily used in
 | 
					 | 
				
			||||||
both Docker containers and directly as a background service. For fun, I've also
 | 
					 | 
				
			||||||
added support for listening on a Unix socket instead of a TCP socket.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The goal is to always keep this setup, as a single binary is by far the easiest
 | 
					 | 
				
			||||||
way this type of software can be distributed. I currently publish binaries for
 | 
					 | 
				
			||||||
`x86_64` and `arm64`, as these are the platforms that I use. It should be
 | 
					 | 
				
			||||||
possible however to compile Otter for any build target supported by Rust.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Plans
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Before Otter reaches version 1.0, there are still some features I'd like to
 | 
					 | 
				
			||||||
add.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### UI
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The biggest feature would definitely be a web UI. This UI will contain
 | 
					 | 
				
			||||||
everything required to manage an Otter server, both as a user and an admin.
 | 
					 | 
				
			||||||
Users should be able to see and remove sessions, manage their synced devices,
 | 
					 | 
				
			||||||
and view and edit their subscriptions and other stored data. Admins also
 | 
					 | 
				
			||||||
require the ability to add, remove and edit accounts, as well as seeing other
 | 
					 | 
				
			||||||
global service data. The goal is to have an easy-to-use UI that contains
 | 
					 | 
				
			||||||
everything you'd need to effectively use an Otter server.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Important here is that I don't have any plans to recreate any of the social
 | 
					 | 
				
			||||||
media-related aspects of Gpodder. Otter is just a sync server; it's not meant
 | 
					 | 
				
			||||||
as a full-on replacement of the gpodder.net website.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
In terms of technology, I'm using [HTMX](https://htmx.org/) and
 | 
					 | 
				
			||||||
[PicoCSS](https://picocss.com/) to develop the frontend, combined with a
 | 
					 | 
				
			||||||
templating system in the backend. In my opinion, these two are the perfect
 | 
					 | 
				
			||||||
combination for developing simple frontends, especially for someone like me
 | 
					 | 
				
			||||||
that isn't the best at creating UIs.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### CLI
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
It's always useful to have a more technical CLI-focused way of accessing the
 | 
					 | 
				
			||||||
data of an application. For this, I want to add a full CLI interface that
 | 
					 | 
				
			||||||
allows an admin to interact with the server through the same abstractions used
 | 
					 | 
				
			||||||
by the API. There's already some very basic functionality available right now
 | 
					 | 
				
			||||||
on which I'd like to build to expose the full functionality of the API in CLI
 | 
					 | 
				
			||||||
form.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Database support
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Otter currently only support SQLite as it's easy to develop with and install on
 | 
					 | 
				
			||||||
the server. I do however know lots of people prefer running PostgreSQL, so
 | 
					 | 
				
			||||||
support for this will be added. Due to the way the codebase is structured, this
 | 
					 | 
				
			||||||
shouldn't be too hard, as all database-related functionality is hidden behind
 | 
					 | 
				
			||||||
an abstraction that can simply be implemented for PostgreSQL as well.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Those are my plans for this project! I'm hoping I can keep up the development
 | 
					 | 
				
			||||||
pace, as I should be having a lot more free time the next couple of months.
 | 
					 | 
				
			||||||
I've grown quite fond of this project, as it solves a specific problem I had
 | 
					 | 
				
			||||||
while allowing me to screw around with some design patterns I hadn't used
 | 
					 | 
				
			||||||
before. I hope to continue developing it into a mature application.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
As always, thank you for reading, and have a nice day.
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,35 +0,0 @@
 | 
				
			||||||
---
 | 
					 | 
				
			||||||
title: "Working on Web UI & Admin Features"
 | 
					 | 
				
			||||||
date: 2025-06-29
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Last couple of weeks, I've started working on the web UI using HTMX and
 | 
					 | 
				
			||||||
PicoCSS. Development's been going pretty well, as I already had some experience
 | 
					 | 
				
			||||||
working with HTMX from a previous project. 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Currently, the login page is implemented, as well as a session management page.
 | 
					 | 
				
			||||||
I'm working towards building an initial version that can be used by multiple
 | 
					 | 
				
			||||||
users, complete with admin user management features and sign-up functionality.
 | 
					 | 
				
			||||||
Specifically, I'm prioritizing the following features:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* Admin user management page
 | 
					 | 
				
			||||||
* Sign-up flow, including sign-up links for private instances
 | 
					 | 
				
			||||||
* Support for public instances (a.k.a. add a sign-up button and flow)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
These together would already make Otter a pretty nice Gpodder server, usable by
 | 
					 | 
				
			||||||
multiple people. After that, I can focus on the smaller features and bug fixes
 | 
					 | 
				
			||||||
(such as trying to make the Gpodder client work at all). I've released versions
 | 
					 | 
				
			||||||
[0.2.0](https://git.rustybever.be/Chewing_Bever/otter/releases/tag/0.2.0) and
 | 
					 | 
				
			||||||
[0.2.1](https://git.rustybever.be/Chewing_Bever/otter/releases/tag/0.2.1)
 | 
					 | 
				
			||||||
containing the login view and session management page. Ideally, I'm going to
 | 
					 | 
				
			||||||
keep releasing these smaller versions, so there's a relatively constant stream
 | 
					 | 
				
			||||||
of new features to try.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
While developing the sessions and user management page, I've noticed I'm
 | 
					 | 
				
			||||||
basically already implementing everything required for a RESTful API. Tables
 | 
					 | 
				
			||||||
are implemented using paginated API requests, so having these routes return
 | 
					 | 
				
			||||||
JSON instead of HTML depending on the `Content-Type` header wouldn't be a lot
 | 
					 | 
				
			||||||
of work. The Gpodder API isn't the greatest, so having this more standardized
 | 
					 | 
				
			||||||
API would be quite nice for third-party integrations.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
That's about it for this devlog, have a nice day.
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in New Issue