Compare commits
3 Commits
df67adc3ee
...
dff01df7bb
Author | SHA1 | Date |
---|---|---|
|
dff01df7bb | |
|
e75da51a19 | |
|
0618422b68 |
|
@ -1,2 +1,4 @@
|
||||||
.hugo_build.lock
|
.hugo_build.lock
|
||||||
public/
|
public/
|
||||||
|
public.tar.gz
|
||||||
|
auth.txt
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
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
|
|
@ -0,0 +1,108 @@
|
||||||
|
---
|
||||||
|
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.
|
|
@ -0,0 +1,35 @@
|
||||||
|
---
|
||||||
|
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