Show HN: Social network that looks and works more like a forum
hey.cafe
hey.cafe
Still lots to do and lots on the roadmap but suggestions and feedback are helpful.
Oh another key thing is the site is built using a single Javascript block, no trackers and no ads anywhere. Clean as it can be.
I’m trying to figure out what makes this special other than some nice design aesthetic
But the network is fully centralized, right? Did you consider using a protocol and making something more like Movim, but with your nice design language?
Or is the problem you are trying to solve in a different domain? Like your main concern was that you wanted easily embeddable content?
Also encryption for anything not public.
Does weird things when most of the people you are talking to are strangers. I think humans brains are built for villages, for relatively stable relationships. Instead you see a stranger write something, you reply what you think, someone else replies to you, you reply to them. Whether you are agreeing or disagreeing, but there's not a lot of actual conversation, just... reactions. HN has a very nice tone, but I recognize like 3-4 names and couldn't tell you if the person I agree with today was the person I thought was an idiot yesterday.
I think for example the most successful communities on Reddit are either mega-obscure, so that there are very few newcomers, or very strictly moderated (e.g. /r/weightroom) in a way that maintains the culture. Everything else is is more or less a dumpster fire.
Dunno if you've thought anything along these lines.
I think technology has vastly outpaced the biological capacity of humans to interact effectively.
We're built for small communities. Tribes, clans, villages, whatever you want to call it. We've technologically advanced to the point where we can interact with the majority of humans on the planet in near real time, but... most of those interactions are driven not by connection, but by just projecting our thoughts onto a symbol we create.
This means a lot more users can moderate content besides just the main staff.
Could you elaborate on the distinction you’re making between genuine conversations and records of reaction?
Specifically, did you imply that tone and recognition of the other party are factors?
Also the inputs to create a new conversation on your account from the main feed view at the top to be more inline with what users expect and not a button to open.
In a lot of Internet conversation it's like you are correcting people who you disagree with and then expounding what you think is true. That isn't really what conversation is like, I don't think.
Is the question about the other party’s reasoning as in thought process or reasoning as in the argument they’ve written down? I think of arguments as public processes/entities, in that it doesn’t matter who/where critique comes from. But human beings have particular social psychology so there may be ‘effects’ from drive by critique.
> In a lot of Internet conversation it's like you are correcting people who you disagree with and then expounding what you think is true.
Often when I read something I don’t agree with, my mind immediately creates a caricature of the author and I get the impulse to crush/fix them.
One of the great benefits of knowledge is the ability to make connections between things you know. If I for example know the Latin words "manus" (hand) and "facere" (to make), and I know the English words "manual", "factory", and "manufacture", I'll probably make a bunch of connections there. I probably won't by merit of having access to a Latin dictionary alone.
If half the things you know are on the level of awareness of an unread Wikipedia article, I don't think you quite get the same benefit.
Then combine that with the relentless push to get everyone identifying themselves with a single identity tied to their real name... And the rampant abuse of people who do so... And it's just like... Why?
Making a real human connection requires some level of vulnerability. Someone can't get to know you if you completely hide who you are. But the level of doxxing, and harassing, and trading in personal data to spam you with ads for crap you aren't evenly slightly interested in, that's the price you pay now for being open. And in return, you get to have "discussions" with drive-by commenters who you'll never hear from again and may just be deliberately antagonizing you. Or they may just be bots trying to stir up rage.
Obscure communities solve some of these problems, but they are still open to drive-by trolls and privacy violators. There is simply no space on the public internet where you can find a real community and make real friends without a real risk of being abused by random people outside of that community, using your posts to target you for advertising or harassment.
And this doesn't even get into "likes" and this insane idea of being literally judged for everything you contribute to the community. This isn't how human community works at all. So I've all but opted out of using the internet for anything but consumption.
I've seen very personal exchanges take place on Stack Overflow. A user new to everything, a veteran with some spare time - they exchange comments and learn about each other. In some cases they exchange contact information- I'm not privy to what happens after that
Mind you, almost ALL of SO is devoid of that connection - but it still happens.
It sort of reminds me of when I was in kindergarten, and every child in the class wanted to put in their 2-cents, regardless of how relevant it was to the conversation.
On the forums that I prefer, people tend to stay on topic, and avoid asinine talk. Reddit is full of kindergartners.
I wonder if there is a community for scheduled group video/voice chat rooms about an interesting topic. You could show up to just listen, or participate. Is that how clubhouse is supposed to work? (I couldn't figure it out from their website copy)
Oh, and if you need infrastructure advice (I don't think you do, at least not yet), I would be happy to help.
Is it indexable? Can I find public posts using search engine such as DDG?
- what's the privacy policy?
- how can one request data / delete their account?
congrats on your launch!
I can't stand sites that are tracker heavy so I chose to never add that type of stuff.
1. There's far too much white space and unnecessarily large headers. Reading content in cafes seems to be the heart of the site, however, this is what I see when opening a cafe on my 1920x1080 monitor - https://i.imgur.com/1j0exRM.png. There's literally not a single piece of content for a returning user to read without scrolling.
2. Something weird is happening with post times. I saw a comment that was posted -666 seconds ago, which snapped to 3 minutes ago after refreshing.
3. The background color is too light and it blends with the discussions, making it difficult to visually separate them. Here is the existing background - https://i.imgur.com/wVr0RYs.png and a darker one to add more structure - https://i.imgur.com/U5sekNI.png.
4. Overall I find the content a little hard to read. I prefer sites with discussion titles (Reddit/HN/forums) as they help to summarize an entire post or image in a few words. Without them I need to spend too much time reading each discussion trying to parse what it's about and if it's relevant to my interests.
So will there be paid memberships? Sponsorships of some sort?
I always use sub-addressing to sort/filter my mail and am always a little disturbed when sites implement their own parsing mechanisms/regex....
If I ever find the time to implement a catch-all address I probably will have to use some randomization as well. If I for instance would use ojford+hey.cafe@mydomain.space or ojford.hey.cafe@mydomain.space it could be easily attributed to me, while for some sites I just want a throwaway mail address.
https://endpoint.hey.cafe/api/conversation_info?query=utdtls...
Thats why I am making a open API that will be free to use with no limits so anyone can do anything they want as far as clients go.
Also, I apologize for being pedantic, but... "reeks," not wreaks.
Each café is made by someone and they can have moderators. Things can be private or features locked down from public or even other members, so for example our own updates one only allows comments and reactions from members except admins who can post the updates.
You’re loading about 430KB of JavaScript. That’s quite a lot to parse and execute (yeah, less than many sites, but judging by the functionality it could probably be under 20KB for people just reading the site—code splitting, and all that). Gzipped, it’s over 70KB. Feeding it through Terser to minify the code (which achieves much more than just joining the lines), you can trivially cut it down to about 370KB with no breakage, and treating it as a module (so that it can mangle top-level names) reduces it to 230KB/50KB, which would execute distinctly faster, except for the minor matter that everything will break because event handlers are routinely expressed as strings, including function names (and that’s probably the biggest reason why you should separate event handlers from markup).
You’re reimplementing various things that the browser provides, badly. A few examples:
• <a href='javascript:…'>. This is always bad. Either use a link with a meaningful non-JavaScript href that will work with things like Ctrl+click/open in new tab and possibly add a click handler that will event.preventDefault() and do something different for the current tab (though for general navigation in SPAs it’s normally easier to attach just one “in-app link” interceptor on the document root), or use a button with a click handler.
• <div onclick>/<span onclick>. This is almost always bad (use an element with click semantics, such as a link or a button), and always bad if the element is not focusable by keyboard (e.g. by the tabindex="0" attribute). When it’s <span onclick="javascript:appSwitchPage('/conversation/xjbjpgpqrpvutlf8wcgz1gt50')">, well, that’s even worse than <a href="javascript:appSwitchPage(…)">. Your approach there should be closer to <a href="/conversation/xjbjpgpqrpvutlf8wcgz1gt50" onclick="event.preventDefault();appSwitchPage(this.href)">, though again I say one root link interceptor is generally a better approach.
• History management: you’ve implemented your own back button, a strange choice in general (why not use the browser’s like everyone else? For some sorts of apps, an up button that takes you to the parent in a hierarchy can make sense, but I can’t immediately think of any reasonable case for a back button), but your history management also just interacts badly with the browser’s own, with your back button adding a new history entry, and clobbering history when the native back button is used.
• Page loading: every time you load a page, you use your own loading spinner, and don’t cache various things that reasonably could be. This is a massive regression in experience from the traditional MPA/server-generated HTML approach, where you tend to stay where you are, with only a small indicator that things are happening, until it’s ready and changes over. The end result of all of this is that this site feels much slower to load than it should, and that every load is painful and very disrupting. I’m in Australia, by the way, so add about 150ms on to whatever you may be used to—though the responses seem to be slow enough that latency doesn’t dominate it.
Other issues:
• Relative time display looks to be anchored to when you loaded the page/app, not when you loaded a particular view/page. This leads to times being wildly wrong, including future times (“-1234 seconds ago”). The problem looks to be the way settings_timestamp is used.
• The style of the code leads me to be concerned about injection attacks; in most places, the client is mixing template markup and responses from the server as raw HTML, thereby trusting the server to protect against malicious markup. I tried creating an account with values like <script>alert("xss")</script> for name/alias/bio/whatever, name netted me a crash on /settings/me when I click on the value which shows <script>alert("Name")</script&, “SyntaxError: missing ) after argument list”. I’ve gone no further.
The payload includes icon's and SVG data that I am slowly removing to lower it's size. The entire app is all in the one block.
History management the back button was added on request and based on mobile usage, it should be fine with the default browser button but I will take a look.
The links I totally get, as everything is generated as it's needed that can be changed over and I will take a look at that.
The time is based on the servers time as clients can be all over the place and I am not tracking where users are and timezones, I have never seen times jump all over the place so I will take a look as the timestamp is provided in the same request as the data so it should be updated as the content is loaded.
The inputs are sanitized and rendered as HTML characters, it just appears to be a bug with the render back as regular characters on edit so that users don't see the HTML characters in the text input, but that would be only on the user who made the content that it would do anything, but I will add rules to remove that type of tag server side also. For example what you gave turns into.
<script>alert(1);</script>
It just turns back to normal characters when you bring it up to edit the input as the one who set it.
I will use all this and make some changes, the links where not on mind mostly to the expectation it would mostly be used in an app capacity.
If we had this kind of control, then we could create generic profiles and go into the direction of Tor browser in terms of disappearing in the crowd when it comes to fingerprinting. Then we could share these profiles with other less tech-savy users to protect them as well.
What the "normal user" does, is not really my main concern. There could be a switch to "expert mode" or whatever. The "normal user" doesn't even know, that a website consists of HTML, maybe CSS, and maybe JS. They are so far behind in basic knowledge, that I think it would be hopeless to demand such decisions from them. They just don't know how the Internet works. They are merely users.
That would require building 2 completely different apps that work completely differently.
There is no CSS, no resources that are loaded in, all the structure and style and everything is generated as it's needed so that the server does not need to parse and create pages that end up using and spending a lot of resources when under load. This way the server only gives the JSON data out and the website parses and generates everything.
Can't do that without Javascript, just like an Android or iOS app can't work without using a front end language to generate the view that you interact with.
It also means rich embeds and more like videos, tweets, articles and formatting.
It seems it defaults to a dark mode with no way to change?
I have an issue with the "card" design/UI of conversations on the main page -- I can't tell what's clickable. It seems the timestamp is a link, but other parts are not. On mobile there's no indication.
Can you talk about the FE/BE architecture. I know you said it's a single block of JS... all hand-rolled? What's the server and database, etc?
The JS is separated on my end to files for editing and on push to GitLab it compresses it down on the server that hosts the frontend.
Each backend endpoint is a $5 server on vultr, the front end one is also just a $5 server and the database us a $10 one but it's seeing little load.
Thanks everyone!
I checked with the email you set on the account, your mail provider said the address does not exist.
Cafés Café's
I think for now, the fediverse seems to be the most sustainable alternative to modern social media.
Edit: this is not meant to be dismissive, it's just that the main problem with social media right now is centralization. I'm simply not interested in jumping from one centralized option to another.
I feel like in a lot of ways, something like Mastodon isn't much better than Twitter, should it somehow take over. Sure you have a lot of servers, but they all run the same software and approach the problem in the same way. It's a decentralized monoculture replacing a centralized one.
How many servers they are run on really doesn't matter. What we need is multiple different paradigms. This, even if it's just one guy running one server, is a step in the right direction.
What I'd most of all like is something that lets the visitors own their own posts while still allowing some form of communication. Dunno, like something combining RSS and a forum.
The 'servers' are simply endpoints within a federated network. You can have a frontend "app" interoperate with those endpoints while exposing a different UX, perhaps one that's more old-school BBS- or forum-like.
Or you can have endpoints that expose a slightly diverging logic, perhaps building on other web standards (such as WebMention) for their analogs of the BBS-like "reply", "topic", "thread" etc. But since these are all part of one Fediverse, interoperability across endpoints will be preserved.
> What I'd most of all like is something that lets the visitors own their own posts while still allowing some form of communication.
This can happen if the visitor owns a server and makes their posts available from there via Fediverse standards. The posts can then either be federated directly (if allowed), or "mentioned" (like a trackback) on other servers.
ActivityStreams is the "RSS" like standard in the Fediverse, which can be implemented entirely statically, with no "active" server-side logic whatsoever. ActivityPub is the active "push" part of the standard, which enables "post" workflows from users; the server itself can also use ActivityPub to "push" its content to a federated endpoint in the network, which removes any propagation delays introduced by polling.