Thinking about making my own lemmy client, but I could use some feedback
Here are the problems I want to solve:
The same app everywhere
It will run as a website, iOS app (also on macOS), and Android app. It will be responsive, supporting phone, tablet, and computer screen sizes along with everything in between.
And I’m not talking about simply resizing the interface. Navigation (e.g. sidebar or on mobile bottom tab bar) will match what you would expect to see on the device size you’re using. But everything else (e.g. posts) will look the same, which I hope will make it really easy to jump from mobile to desktop.
Onboarding and configuration
The app will allow you to configure it to look like a typical Reddit or Lemmy app. During the onboarding process, I will prompt you, asking which style of interface you prefer. Consider these presets, which change a bunch of more granular configuration options. I will also give you the ability to fully customize each option instead of picking a preset.
Caching and offline support
This is where it starts to get more tricky. Caching is easy. If you launch the app, it will have everything you previously saw still loaded.
I would like to make it so upvoting, for example, can be done offline. The app will optimistically apply the upvote to the post or comment, then when you reconnect to the internet, it will actually apply the upvote. This is a difficult problem to solve, so I can’t promise this will work, and it would likely be the last feature I add.
I need your feedback
This is a big project to undertake. I really want a Lemmy client that checks those boxes for myself, but I’m curious if any of those resonate with you? Is there anything I missed that you would like to see? If I do build this, I will likely have to keep the project very focused as far as features go initially.
Just for context, I’m using Voyager on iOS currently. I really like it, but the “the same app everywhere” concept and making it easier to onboard Reddit users are my main motivations for creating my own app. My app will also be fully open source
like this
Rooki
in reply to moseschrute • • •it should have good moderation implementation and have its markdown synced with lemmy ( like spoilers etc. ).
It should be easy to block, report.
I like the idea of the offline support. Could be cool if you are able to "download" a post for offline reading or just reading through its comments.
<= could be linked with the "favorite" functionality of lemmy.
Thanks for adding another app to the diversity of lemmy.
moseschrute
in reply to Rooki • • •My goal is to store everything offline for a period of time. Likely, it will be more complicated than this, but let’s say for now everything you see will be automatically cached offline for 30 days. Instead of a number of days, I will probably set a max size for the offline cache and drop the oldest data in the cache as new data comes in.
The only issue here is I’m not sure how easy it will be to cache images offline. They will take up more storage, and I’m not as familiar with image caching mechanisms for apps.
Do you know if Lemmy tends to have good alt text for images? That would be easier to cache offline instead of images.
Maybe after the initial version, I can add the ability to pin a post to your cache so it doesn’t get cleaned up automatically.
Rooki
in reply to moseschrute • • •moseschrute
in reply to Rooki • • •I assume you mean when my app caches a post, but that post is deleted from Lemmy. That’s a good question. Off the top of my head, I would say as soon as I know a post is deleted, I would likely want to purge it from the cache.
I guess it’s a question of whether I should respect the API saying the post is deleted or act like a temporary archive. I’m open to either. From a technical perspective, it would be simpler to act as an archive.
As far as the type of cache I use, I may use a LRU cache, which will effectively prevent something from being deleted every time you view it. So even if something was cached a long time ago, if you pull up that post again, it will reset the timer.
Rooki
in reply to moseschrute • • •But i cant stop you do otherwise ;D
asudox
in reply to moseschrute • • •moseschrute
in reply to asudox • • •Got it. As you can see, I am myself very new to Lemmy and still learning their API. I still need to think through this more since even caching hashes will consume much more data than caching the text content of posts and replies.
Most likely I’ll want to give control to the user of what they want to cache. Either text or text + images.
asudox
in reply to moseschrute • • •Looks like lemmy api does not give the hash of the image, that's unfortunate.
You'd need to use the link field instead.
moseschrute
in reply to Rooki • • •Rooki
in reply to moseschrute • • •asudox
in reply to Rooki • • •moseschrute
in reply to Rooki • • •Again, I plan to add moderation features. But I am one person with a full-time job. I need to prioritize the features that will please the most users. Prioritizing everything initially could mean lots of bugs in the app, and I would lose users quickly due to a crappy app. I would rather build features slower but correctly.
That being said, if most Lemmy users moderate, then that would make this more of a core feature. But again, I want to also build an app that appeals to incoming Reddit users, and those people won’t be moderators. I’m hoping this will be a tool that can help grow Lemmy.
technomad
in reply to moseschrute • • •moseschrute
in reply to technomad • • •That would actually be easier than the offline upvote feature. The issue with offline interactions is if you upvote in one app, but downvote on another, who wins?
Offline posts wouldn’t suffer from this problem. That’s my very roundabout way of saying, this shouldn’t be that hard to do.
snooggums
in reply to moseschrute • • •Whichever interaction is sent 'last' when connected. No, the user would not have any control over this in the example situation,but to be honest it is a pretty minor issue with no real solution. The same thing could happen in an arbitrary order if you clicked different options on two different browsers at approximately the same point in time because web calls are not instantaneous.
moseschrute
in reply to snooggums • • •snooggums
in reply to moseschrute • • •moseschrute
in reply to snooggums • • •Troy
in reply to technomad • • •smeg
in reply to Troy • • •Dariusmiles2123
in reply to moseschrute • • •Settings synchronization between every device would be a big plus.
I’m really happy with Voyager on iOS, but an app for my linux computer would be welcome as I’m kind of struggling with how Lemmy appears in Firefix.
moseschrute
in reply to Dariusmiles2123 • • •I kinda want to avoid building a backend for this if I can. That would also mean your app wouldn’t depend on any infrastructure that I own, preventing any centralization around my backend. And it would mean a very low cost for me to maintain this app.
One way to solve sync could be to have a QR code you scan to sync settings. But it might only sync when you scan it and not continually. I can also look into any Apple or Android APIs that might make this possible, but that would leave out web, and I really want feature parity between all platforms.
But this would fall under a nice-to-have feature that I would likely not prioritize. I really want to nail down the core functionality first.
Dariusmiles2123
in reply to moseschrute • • •I guess it’s true that it would way more infrastructure.
Still the QR code idea would be great 👍
Thanks in advance for your work
gedaliyah
in reply to Dariusmiles2123 • • •Lemmy UI is only one option, although it is the default for most instances. There are a lot of different web clients, some of which will preserve settings:
Voyager
Tesseract
Quiblr
Photon
Mlmym ("old-lemmy")
Alexandrite
GitHub - LemmyNet/lemmy-ui: The official web app for lemmy.
GitHubmoseschrute
in reply to gedaliyah • • •kionay
in reply to gedaliyah • • •GitHub - thunder-app/thunder: Thunder - An open-source cross-platform Lemmy client for iOS and Android built with Flutter
GitHubgedaliyah
in reply to kionay • • •OpenStars
in reply to moseschrute • • •moseschrute
in reply to OpenStars • • •OpenStars
in reply to moseschrute • • •If PieFed had an API I would say to check it out, as many of us are looking to it as the future. It is extremely lightweight, requires sending ~25-fold less data per post, already has most of the heaviest requested features that Lemmy lacks (categories of communities, hashtags, showing of the community and instance data alongside - after - each post, labeling of users, e.g. newly created accounts, private voting, ability to democratize moderation e.g. a user can choose to auto-hide posts based on a downvote counter, allowing moderators to be looser in the strict decision to remove vs. not remove content, etc.), and much more. Like Mbin, it is another implementation of the ActivityPub Protocol that federates with Lemmy while not being Lemmy itself.
The caveat is that its web UI is horrible (lacks user tagging, many notifications don't actually take you to where it intends, replies aren't done in-line but on a separate page and then afterwards doesn't return you to where you were but to a generic view of the post whereupon you may have to dig through the complex navigation all over again to find where you were before, and most damning of all, it lacks a Preview feature so you may have to do all of that multiple times to get a post to look right, like a link or image embed).
But, as I mentioned, it lacks an API. So unless you wanted to make one first and do a more full-stack than front-end project, that makes it a nonstarter no matter how awesome and a perfect fit the idea would have been otherwise. I did want to mention it though, just in case, and also to plant the seed in your mind that perhaps when an API is available it would be awesome to be able to switch to PieFed or Lemmy (or Mbin?) rather than be locked solely into just "Lemmy". Especially if Lemmy.World switches to PieFed let's say 1-3 years from now, bc that one instance holds ~80% of all the users on it.
So... check it out!
moseschrute
in reply to OpenStars • • •I need to set some constraints for the project. IMO, going multi-protocol will be too much work. I would rather do one protocol really well than try and satisfy multiple. I also primarily use Lemmy, and a Lemmy-based app is something I myself would actually use. Doing a different protocol would require me to put myself in the headspace of users that I’m not as familiar with. Much of building an app is sympathizing with your user base not just technical.
But I plan on making the app open source, and that means it can always be forked and adapted to a different protocol later. And I’m happy to draw inspiration from other protocols.
I appreciate the idea! I think a multi-protocol app would be great, but again I think for this project and my limited time, doing one thing well would yield a better result.
OpenStars
in reply to moseschrute • • •8 months ago the admins of Lemmy.World (which has ~80% of all Lemmy users on it) strongly hinted that in the future they may consider leaving Lemmy and moving to a different codebase (for, let's just say "reasons"). Their hope was Sublinks, however ever since that project has basically died off, yet PieFed has surged forward in its place.
So I am not trying to tell you what to do, just offering that wider perspective. Especially since I noticed that your account was only a month old so you may not know the entire history behind Lemmy, and thus find it more surprising when such an event as mentioned above may transpire "suddenly" and "without warning" - except that there are signs, and have been since the beginning. Phrased another way: is your hope to keep "Lemmy" alive - the Lemmy that was written by the codebase developers who consistently advocate for genocide of Western people (especially landlords) and upheaval via violent means of Western civilization, while simultaneously denying that genocide has ever taken place in certain formerly communist nations (including Russia, China, and North Korea), and also being against "capitalism", even while ignoring how some of their favorite nations are themselves capitalist? (again, e.g. Russia)?
Or is your goal to keep the spirt of the free & open source software "Fediverse" alive? The latter also includes Mbin and PieFed (and perhaps one day Sublinks if it ever resurrects from its apparent demise), all of which interact with "Lemmy" as in what most of us try to avoid calling the "Threadiverse", despite how that name predated Meta's "Threads" service and more accurately describes the threaded conversational nature of what we do here. So just to have a single name to call it, mostly we call it "Lemmy", but it's not Lemmy, it's also Mbin and PieFed, and one day perhaps other things too, which uses the identical ActivityPub Protocol to share its messages with users on Lemmy. Case in point, I switched above from my first reply being from my old Lemmy account on Discuss.Online and ever since have been using PieFed - but did you even notice? "Lemmy" and "the Threadiverse" have become somewhat synonymous in our usage of terminology, though they are different, and yet they are also the same.
Again, do as you please ofc, but I hope this discussion might have helped!
Feedback from all moderators - Lemmy.World
lemmy.worldmoseschrute
in reply to OpenStars • • •That makes sense. I appreciate the history lesson. You’re right, my account is very new, and I’m new to Lemmy. Maybe the protocols you mentioned are more compatible than I realize. I would imagine that if Lemmy.world migrates, what they migrate to will be more similar to Lemmy than something like AT Protocol. So it might be okay to run with Lemmy for now and then adapt later depending on where most users wind up.
I still would like to keep the project’s scope smaller, but if there was a mass migration from Lemmy, I would absolutely reconsider. Let me also read up on the similarity of the protocols. If interoperability is easy to do, I’ll consider interoperability from day one.
OpenStars
in reply to moseschrute • • •Oh yes, definitely. BlueSky has a "bridge", whereas the ActivityPub Protocol is a full federation protocol. The user-based, Twitter/X-like Mastodon, the user-based FaceBook-like Friendica, and the thread-based Lemmy + others all use it. Which you probably wouldn't need to care about, since you would just call the API (except for PieFed, that's not currently an option b/c it does not exist yet).
Much of what I am saying here is not really "actionable" atm - though it might affect how you "structure" your code, e.g. making function calls to use the API rather than do it in-line?
Although another reason that I mentioned PieFed was to point to its large & growing list of features that people kept saying that they wanted to see in Lemmy, but never seem to get added to Lemmy, although PieFed already has them (yet lacks many of the more basic, foundational features, oddly enough).
A powerful example is categories of communities - like I don't have to go individually to !fediverse@lemmy.world and !fediverse@lemmy.zip and !communitypromo@lemmy.ca and !fedigrow@lemm.ee and !loops@lemmy.world etc., and can instead just visit piefed.social/topic/fediverse and see posts from all of these communities at once. That has been present in some apps - though I don't know which ones - for a long time now.
And another is hashtags, which have worked so well elsewhere e.g. in Mastodon, and we'd love to see them add additional functionality to Lemmy too. Here is an example that uses both - although the hashtags don't do much there since the vast majority of "Lemmy"/Threadiverse users do not use PieFed.
Fediverse
piefed.socialOpenStars
2024-11-06 09:15:42
moseschrute
in reply to OpenStars • • •Interesting. If you have any talks or articles, I would love to learn more. Without knowing anything about PieFed vs Lemmy, I will say I do think it’s important with any product to nail down its core functionality first. Trying to please everyone can degrade the overall quality of the product. Is it possible Lemmy is focusing on core functionality first? Like it’s interesting that PieFed includes some features but lacks more basic features.
Swapping out API calls shouldn’t be too difficult, but if the schema of the data is very different, it could get difficult. If PieFed was a superset of Lemmy in the sense that it returned the same schema with additional information, then it becomes easier. AT Protocol is a good example of having a completely different schema, making it more difficult to implement interoperability - I know people are working on interoperability, so I’m not saying it’s impossible.
I know nothing about PieFed, so that may sound ignorant on my part, but I will do more research.
OpenStars
in reply to moseschrute • • •I have nothing to do with PieFed, beyond liking it and so I joined the flagship instance as a regular user, which gives me only small insight into the day-to-day usage experience:-).
That said, the main developer has given several talks - e.g. this one and see
also Rimu's YouTube channel.
Rimu Atkinson
YouTubeNothing4You
in reply to OpenStars • • •what are you referring to with this? AP traffic?
do you have some more information about this?
OpenStars
in reply to Nothing4You • • •I used the raw data from this table, which is the 3rd entry in this post. It's been a minute since I did the calculation but I think I did something like take the >4Mb of data for 20 posts that Lemmy does and compare to PieFed which:
So despite showing 5x more posts, it still requires <1/5th the data? That's >25 more data required per post by Lemmy than PieFed, i.e. the latter is a much more "lightweight" client.
Edit: but if you think there is a mistake here, I'd love to hear it?
piefedadmin
2024-02-09 08:59:14
Nothing4You
in reply to OpenStars • • •at least the image resizing topic has recently been fixed in lemmy, thumbnails sizes are limited (at the time of thumbnail creation) in the latest release. I'd have to look closer at the other stuff, the api part is unlikely to have changed and will affect all frontends, but js part should differ depending on the front end. some instances already use other frontends by default and there is also a replacement for lemmy-ui being worked on (lemmy-ui-leptos), but I don't know how they compare. either.
it should be taken into account though how much of this is cacheable as well, as it will then typically only affect the first load for the static files.
I can totally understand the issues in general though, I've been living with a 64kbps uplink for several years in the past.
OpenStars
in reply to Nothing4You • • •All good points. I also don't know how much is cacheable, but regardless, how much of that actually is cached, vs. being sent again and again?
Separately from the per-page considerations, from what people are saying it seems like a great deal of unnecessary info is sent along with each and every post that could be delayed until the user decides that they actually do want the additional info to make it worthwhile to pull in from the backend.
Yes some apps may also be lightweight, and perhaps PieFed could do a comparison with them as well, but to some degree that's an apples to oranges comparison (hehe, yet both are different kinds of fruits! and one may indeed find themselves in a position needing to choose between them at a grocery/market:-), seeing as how a web based UI needs to run in multiple browsers yet conversely runs from any OS.
If leptos also ends up being lightweight then it could be compared to PieFed at that time in that regard. Though atm all that PieFed can compare itself against are things available to be tested. And perhaps leptos will borrow a few tricks from PieFed by that time, or even if providing an entirely independent execution, could solve some of the same issues. Do you know if leptos is supposed to share that feature of being lightweight, or were you just saying that it will exist at some point?
Docus
in reply to OpenStars • • •OpenStars
in reply to Docus • • •MrMakabar
in reply to moseschrute • • •GitHub - aeharding/voyager: Voyager — a beautiful app for Lemmy
GitHublike this
originalucifer likes this.
moseschrute
in reply to MrMakabar • • •Wow, I totally missed that. However, it does feel like the web was tacked on as an afterthought. It feels like navigation hasn’t been optimized for larger screens (see screenshot below). A sidebar would be much more usable on larger screens than this stretched bottom tab bar.
That being said, it would probably be easier for me to contribute to Voyager than to build my own app. But I also kinda want to build my own app, lol. But I might also consider contributing to voyager if they are interested in optimizing their interface for larger screens.
Blue_Morpho
in reply to moseschrute • • •moseschrute
in reply to Blue_Morpho • • •fmstrat
in reply to moseschrute • • •moseschrute
in reply to fmstrat • • •Monsoon
in reply to moseschrute • •Fediverse reshared this.
moseschrute
in reply to Monsoon • • •ByteMe
in reply to moseschrute • • •moseschrute
in reply to ByteMe • • •ByteMe
in reply to moseschrute • • •originalucifer
in reply to moseschrute • • •isnt this already what browsers do? why reinvent the wheel here
like this
kubica and originalucifer like this.
moseschrute
in reply to originalucifer • • •Sorry, I don’t mean this to sound rude, but websites don’t magically become responsive. It takes a lot of work. And that becomes even more complicated when you want to share large amounts of code between web and native.
I’m not reinventing the wheel. I’m using the best libraries—imo— to build a responsive cross-platform app.
originalucifer
in reply to moseschrute • • •like this
originalucifer likes this.
DarkThoughts
in reply to originalucifer • • •originalucifer
in reply to DarkThoughts • • •like this
originalucifer likes this.
rglullis
in reply to moseschrute • • •Why not take an existing client like Voyager, and add the features that you are missing?
This is exactly what I am doing for "easier onboarding". I am working on a fork of Voyager, learning my way through React Native and ionic, and adding support for Fediverser to it.
moseschrute
in reply to rglullis • • •rglullis
in reply to moseschrute • • •Fair enough, every developer goes through that.
At the same time... If this is your primary motivation I would feel like there is no point in you asking for "feedback" because you are essentially looking for validation.
I don't mean to pick on you, I just wish we collectively learned to stop this. So much effort is wasted by individuals who want to prove something to themselves and want to go out on their own, it feels like FOSS alternatives would be 20 years in the future if put worked together on 2-3 alternatives instead of 20-30 disparate projects.
If you are okay with reconsidering your position... go to Voyager's discussion pages on GitHub, there a few issues I opened there and would like to tackle:
If any of these things interest you, I'd love to have a longer chat and see if we can work together.
moseschrute
in reply to rglullis • • •You know how when a hobby becomes your job, it often stops being fun and leads to burnout? Side projects are fun because they offer you an opportunity to build something on your own terms. I want to build the app that I want to use, and I want the freedom to make decisions.
At the same time, I want to hear from the community, and I will take into account that feedback for decisions I make.
Respectfully, some of those issues you opened up are really big asks. Specifically, offline first (RxJS) and adding activity pub support. Initially, my idea was to build an app that did both of these, but after some experimentation, I decided I would burn out before the project ever saw the light of day just trying to solve offline first.
I would still love to hear from you. But I have ideas for what I would consider core functionality, and that will come first. But I will take feedback into consideration and will likely implement some offline first functionality, which will be way simpler than being fully offline.
My tech stack will be similar enough to Voyager that it’s possible I can copy past parts of my code into their app. So I’m not ruling out contributing back to Voyager, and writing my own app doesn’t mean I won’t learn stuff that I can contribute to other clients.
rglullis
in reply to moseschrute • • •moseschrute
in reply to rglullis • • •I do share the offline first ambition! I also probably have ADHD and a tendency to start projects without seeing them through. I think it would be wise for myself to keep the initial scope of the project small. I would love to build the app that solves everything, but in practice I know I likely won’t be able to make that happen.
From what I’ve seen, fully offline first would be more work than I believe it’s worth. Especially when you add the complexity of being cross-platform. I think I have to choose cross-platform or offline first, and I would rather solve cross-platform really well (better than Voyager IMO).
So it’s not that I don’t share your ambitions, but I need to be realistic. But if an app existed that solved all the things you mentioned, I would happily use it!
I appreciate you being understanding, and please continue to share your ambitions. I just encourage you not to be frustrated if someone closes a GitHub issue you open. Maintaining open-source software is taxing, and it doesn’t mean that the person closing the issue doesn’t like your idea.
snooggums
in reply to rglullis • • •Honestly having 20-30 separate projects is awesome if merging in the creative bits from each were merged into the more popular ones more often. Sometimes there is a foundational difference that makes that a lot harder than plug and play, but to be honest not developing with being modular in mind is one of the biggest issues with any kind of development.
rglullis
in reply to snooggums • • •Yeah, the pity is that most of the times this simply doesn't happen, and everyone wants to reinvent their own special flavor of wheel.
secret300
in reply to moseschrute • • •moseschrute
in reply to secret300 • • •snooggums
in reply to moseschrute • • •moseschrute
in reply to snooggums • • •gedaliyah
in reply to moseschrute • • •Lemmy Apps Directory (MEGATHREAD) - Lemmy.World
lemmy.worldlike this
Fitik likes this.
moseschrute
in reply to gedaliyah • • •gedaliyah
in reply to moseschrute • • •moseschrute
in reply to gedaliyah • • •Sunshine (she/her)
in reply to moseschrute • • •Grimy
in reply to moseschrute • • •Great idea! Just here to offer support. I don't think voyager existing matters much, diversity is the name of the game for the fediverse.
Feature wise, I'd love to see something that embedded youtube videos and similar media with the url given but I'm not sure of the feasibility. Making something forward thinking that can eventually be integrated with other activity pub services would be a good idea but I'm certain that brings up the workload as well.
Keep us updated and make a sub when you have a name!
like this
Fitik likes this.
moseschrute
in reply to Grimy • • •like this
Fitik likes this.
solrize
in reply to moseschrute • • •Alice
in reply to moseschrute • • •