Gemini project & Lagrange, a Browser for Gemini

User avatar
Atruepatriot
Posts: 12151
Joined: Tue Feb 25, 2020 11:55 am

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Atruepatriot »

Clayton wrote: Sat Oct 14, 2023 11:49 am
Atruepatriot wrote: Sat Oct 14, 2023 7:52 am Lol, You don't see the future and why we are soon going to need this? The writing is on the wall, our options are going to be get raped to death/imprisoned on the clearnet or go underground.

The only thing holding back the later is a little effort and dedication.
Absolutely I do see that. Way back before 2012, I developed an entire programming language (see here) whose goal was to address some of these issues (not all of them). Since then, I've come to understand that the issues involved are more complex -- we are being hacked not at the digital layer, but at the physical layer. Physics itself is being hacked. Ultimately, this is a spiritual issue. So, there really is no technological solution at all.

To be clear, I'm not black-pilled, and I think I do see some of the trends that may lead the way out of this. I think that AI may actually turn out to be a saving-grace here. Software 2.0 is going to be written in natural language. So, logic, math and natural-language formal specifications... these are going to become the next-generation of programming languages. The AI will "compile" these down into existing frameworks, such as C++, etc. and the resulting code is what we will actually run. While this involves more moving parts and seems more hackable, I think the results are going to be more secure and more reliable, similar to the way that components built by CNC can actually meet higher tolerances than hand-milled components in the mass-production environment (obviously, hand-milling can exceed CNC tolerances for single-run, bespoke parts.) The Internet is a mass-produced good... nobody is carefully reviewing and combing through the code running in your backend... if it doesn't break, that's good enough. But it's not good enough, and software-wise, we are currently in something like the 19th-century industrial era, where every machine had custom nuts and bolts that were incompatible with those used in any other machine, and even required custom wrenches just to turn them. That's where we are now. We need to get to true interchangeability, and that's not going to happen until our formal specifications become machine-processable. We need to take humans out of the loop not because there is anything bad or wrong with human software, but because we're too flexible in our thinking and work patterns. We need more rigid and inflexible systems so that the resulting components are interchangeable. Imagine if any web plugin written by anybody could be drag-dropped into any web framework, without having to worry about all the compatibility layers. That's the future we need to go to, and we're never going to get there from the status quo. And while I realize that this is what is driving projects like Gemini, unfortunately, they are all doomed to fall into the xkcd specification trap...
The way I see it evil forces are trying to divide us and mold us to be subservient and obedient slaves. We need to resist at every opportunity so they do not succeed. The internet is almost dead. It is nothing but a huge market place of products, services, and ads, personal communications are being restricted or becoming more dangerous by the day.

Soon it will be nothing but a catalog of goods and services and absolutely good for nothing else. They will create the environment where even places like the TA will not be allowed. Or it will be subjected to such restrictions and regulations that it will not be worth the trouble. Only Facebook and Twitter will be able to afford it. Dividing us and tossing us to the wind so that we lose each other or cannot freely communicate is the end goal.

And what I propose is a simple concept that is free. And only one prototype just needs to be stacked into a pile. That one pile can be cloned as many times as we like. What have we got to lose by adapting and trying to stay alive as long as possible? Now is when to do it, not after it is too late and they have won. Of course eventually they will destroy everything and not even make it worthwhile to get on the internet at all, even their own market place. But until then I am going to try, with or without help... I could use the help but I will suffer through if I can't get any. Done it many times before.

Important note... I am not trying to do this for my own selfish reasons. I am doing it for humanitarian reasons and if successful it will make my heart feel good. Maybe God will smile on me for fixing the town well...
“The ultimate test of a moral society is the kind of world it leaves to its children.” ~ Dietrich Bonhoeffer
User avatar
Atruepatriot
Posts: 12151
Joined: Tue Feb 25, 2020 11:55 am

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Atruepatriot »

Macaque Mentality wrote: Sat Oct 14, 2023 11:59 am Thanks ATP! I'm saving all of this info. I'm at the cusp of switching over fully to Linux, even on my not-so-fully compatible PCs.
Atruepatriot wrote: Sat Oct 14, 2023 11:06 am But as far as marketing, my only interests are for setting up a privatecommunity network of trusted friends aside from the public Gemini community. But of course you could have both! Because if you go beyond that you are inviting trouble and/or outside efforts to control it or somehow censor it. But of course as it is spread by word of mouth through friends it could get pretty big. Especially if it is as easy as possible for the average user to implement. Everything would be installed and all hooked together ready to go except for changing passwords and acquiring the needed unique certificates. With full easy to understand steps and instructions it should all be a breeze ,because all the hard work is done already.
I hear you. Honestly, I've been leading toward your direction lately. The most important thing would be to have a private community network of trusted friends.

Regarding normies, I don't know many around me who see the need for anything like this. More and more, I'm not sure if people see the need for this enough for even word-of-mouth to spread reliably. I'm still planning on trying. But I'm not making a crusade out of it without testing the waters with the most minimum viable product possible.
"Regarding normies, I don't know many around me who see the need for anything like this."

Nope, they are all addicted to the big corporations like Twitter and Facebook. They are lost and not worth saving. Robots and zombies. Screw them, I don't care about them at all, let them swim in their own self made demise. I'm leaning towards keeping those who are not robots together and in touch. True patriots and church groups who will soon be persecuted in mass.

Now about switching to Linux, I think this is great! But keep in mind it will not matter what you already have installed in your machine. This stick will be a stand alone independent system, OS and all apps in one box aside from your default system. So you really don't need to change operating systems in your machine to use it, it will have it's own.

"But I'm not making a crusade out of it without testing the waters with the most minimum viable product possible."

I agree... And I know it looks like a lot of elements, but they are all fairly small in total. But that is how software is, stacks of modules on top of each other to make a complete package. For perspective though, this stick is even self hosting a server for your shared Gemini website from a portable stick! So in total it would be extremely powerful for only a few gigs of software boxed up.

:)
“The ultimate test of a moral society is the kind of world it leaves to its children.” ~ Dietrich Bonhoeffer
Lancer
Posts: 63
Joined: Tue Jul 11, 2023 5:18 pm

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Lancer »

Atruepatriot wrote: Mon Oct 02, 2023 5:53 pm ## 1.1 What is Gemini?
The program that followed Mercury and preceded Apollo. All other bets are off the table! ;-D
User avatar
Atruepatriot
Posts: 12151
Joined: Tue Feb 25, 2020 11:55 am

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Atruepatriot »

Lancer wrote: Sun Oct 15, 2023 5:04 pm
Atruepatriot wrote: Mon Oct 02, 2023 5:53 pm ## 1.1 What is Gemini?
The program that followed Mercury and preceded Apollo. All other bets are off the table! ;-D
Lol, it is actually named after that. :)
“The ultimate test of a moral society is the kind of world it leaves to its children.” ~ Dietrich Bonhoeffer
Lancer
Posts: 63
Joined: Tue Jul 11, 2023 5:18 pm

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Lancer »

Atruepatriot wrote: Sat Oct 14, 2023 2:51 pm ...they are all addicted to the big corporations like Twitter and Facebook. They are lost and not worth saving. Robots and zombies.
It kind of surprises me that others see what has disturbed me for so long. I remember those BBS dial-in sources of information where you could download what you wanted and only what you wanted. The browsers kept getting more sophisticated and consequently more vulnerable. People seem to be strongly attracted to the flash and bang of fancy web sites rather than the quality of the information viewed. Now we have circular links to contentless pages, but plenty of mouse hover gadgets.

When I think back to the late 1970s and early 1980s before the Internet was such a big deal, I remember that the quality of information that was passed around on paper copies or on BBS was pretty high. Books. Nobody seems to use books, which are usually a lot more information dense than any web site these days. When one writes a book it seems they are better organized and willing to be thorough than when writing for the web.
I suppose what I am getting at is that I don't think the technology of the web is the actual problem. I think the actual problem is the lack of informational and intellectual discernment on the part of readers and publishers. Flash and and bang has become the driving force rather than actual content.

Text only would be fine for me. PDFs are as "cool" as anything needs to be. Content would be terrific.
Lancer
Posts: 63
Joined: Tue Jul 11, 2023 5:18 pm

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Lancer »

Atruepatriot wrote: Mon Oct 02, 2023 5:53 pm Project Gemini FAQ - §1 Introduction and Overview...
Now that I have slugged it out through that generous text, I find myself interested. Is there an abundance of material in Geminispace? Does Gemini gobble up ordinary web pages, throwing out the chaff?
User avatar
Macaque Mentality
Posts: 6689
Joined: Sun May 15, 2022 9:46 pm

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Macaque Mentality »

Lancer wrote: Mon Oct 16, 2023 7:06 am It kind of surprises me that others see what has disturbed me for so long. I remember those BBS dial-in sources of information where you could download what you wanted and only what you wanted. The browsers kept getting more sophisticated and consequently more vulnerable. People seem to be strongly attracted to the flash and bang of fancy web sites rather than the quality of the information viewed. Now we have circular links to contentless pages, but plenty of mouse hover gadgets.

When I think back to the late 1970s and early 1980s before the Internet was such a big deal, I remember that the quality of information that was passed around on paper copies or on BBS was pretty high. Books. Nobody seems to use books, which are usually a lot more information dense than any web site these days. When one writes a book it seems they are better organized and willing to be thorough than when writing for the web.
I suppose what I am getting at is that I don't think the technology of the web is the actual problem. I think the actual problem is the lack of informational and intellectual discernment on the part of readers and publishers. Flash and and bang has become the driving force rather than actual content.

Text only would be fine for me. PDFs are as "cool" as anything needs to be. Content would be terrific.
I agree with you.

The power of the internet isn't just being a repository of easily accessible knowledge, either.

I think that the real power of the internet is connecting highly intelligent, well-read, and truth-seeking individuals with the discernment you write about. This enables a synergy that used to only be possible in old-time intellectual salons, schools, etc. This synergy has a name now: human swarm intelligence.

We can't all read everything. But put a group of 10 of these people together. Not only have we likely multiplied the available knowledge by a factor of 5 (just a guess) but we have put together a quorum of individuals who have spent their lives parsing and analyzing that knowledge into information that can more easily be communicated to others. This, in turn, allows for the emergence of insight at least an order of magnitude more efficiently than a single individual, at least for certain things. An insight that might have taken years of research to develop might take a single discussion to emerge.

We've all experienced this to one degree or another, which is one of the reasons that we ended up here at TA. The fact that it's a closed community here likely increases the chances of swarm intelligences emerging in our discussions. The fact that individuals must apply further increases the chances.

I agree that I would prefer a more barebones approach to the internet, focused on data retrieval and communication.
User avatar
Atruepatriot
Posts: 12151
Joined: Tue Feb 25, 2020 11:55 am

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Atruepatriot »

Lancer wrote: Mon Oct 16, 2023 7:21 am
Atruepatriot wrote: Mon Oct 02, 2023 5:53 pm Project Gemini FAQ - §1 Introduction and Overview...
Now that I have slugged it out through that generous text, I find myself interested. Is there an abundance of material in Geminispace? Does Gemini gobble up ordinary web pages, throwing out the chaff?
Actually there is quite a bit when you take it in consideration that it is a more recent protocol on the ground floor. The thing to keep in mind is that what I would like to do is create our own private network aside from what they already have public using the software. So in the beginning there will not be any content, we will have to add it and built it ourselves, Folks will have to fire up their own webpages, content, and boards. So the content will be what we choose to make of it. Which can be anything including whole books and articles if we like.

But that does not mean we cannot also go play in their public sand box... And to really get a sense of how it works you would have to take the plunge and go check out what they have available to give you an idea how cool the overall concept is. It is the old school simple small static pages with links and BBS sites. But the Lagrange client for it will also process images if you should "decide" to open them. Simple, practical and minimalistic. Yet it also incorporates some of the newer utilities if you choose to use them. Extremely basic text as default and the sites are tiny in size.

But yes, there are a lot of personal blogs and personal works of writing along with a LOT of knowledge shared about the Gemini project it's self because they are actively at work to improve it in good ways. It is a blast from the past, like the old days where everything was just simple and personally self served. And it is all the work of volunteers who believe in it. They see the future coming too. There is no commercialization and they would rather not have any. And they take pride that there is nothing that tracks you in the protocol.

If you are interested and want to check it out there really is nothing to lose. I'll gladly help! Be nice to have someone else in there who understands how it works! All I need to know is what OS your machine is running to make a plan for the best way to do it for you. On Ubuntu based linux it is easy, the repository has the LaGrange client already boxed with Gemini included and one click install. MS will take just a little more work to install a client for Gemini but well worth the effort!
“The ultimate test of a moral society is the kind of world it leaves to its children.” ~ Dietrich Bonhoeffer
User avatar
Atruepatriot
Posts: 12151
Joined: Tue Feb 25, 2020 11:55 am

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Atruepatriot »

Macaque Mentality wrote: Mon Oct 16, 2023 8:04 am
Lancer wrote: Mon Oct 16, 2023 7:06 am It kind of surprises me that others see what has disturbed me for so long. I remember those BBS dial-in sources of information where you could download what you wanted and only what you wanted. The browsers kept getting more sophisticated and consequently more vulnerable. People seem to be strongly attracted to the flash and bang of fancy web sites rather than the quality of the information viewed. Now we have circular links to contentless pages, but plenty of mouse hover gadgets.

When I think back to the late 1970s and early 1980s before the Internet was such a big deal, I remember that the quality of information that was passed around on paper copies or on BBS was pretty high. Books. Nobody seems to use books, which are usually a lot more information dense than any web site these days. When one writes a book it seems they are better organized and willing to be thorough than when writing for the web.
I suppose what I am getting at is that I don't think the technology of the web is the actual problem. I think the actual problem is the lack of informational and intellectual discernment on the part of readers and publishers. Flash and and bang has become the driving force rather than actual content.

Text only would be fine for me. PDFs are as "cool" as anything needs to be. Content would be terrific.
I agree with you.

The power of the internet isn't just being a repository of easily accessible knowledge, either.

I think that the real power of the internet is connecting highly intelligent, well-read, and truth-seeking individuals with the discernment you write about. This enables a synergy that used to only be possible in old-time intellectual salons, schools, etc. This synergy has a name now: human swarm intelligence.

We can't all read everything. But put a group of 10 of these people together. Not only have we likely multiplied the available knowledge by a factor of 5 (just a guess) but we have put together a quorum of individuals who have spent their lives parsing and analyzing that knowledge into information that can more easily be communicated to others. This, in turn, allows for the emergence of insight at least an order of magnitude more efficiently than a single individual, at least for certain things. An insight that might have taken years of research to develop might take a single discussion to emerge.

We've all experienced this to one degree or another, which is one of the reasons that we ended up here at TA. The fact that it's a closed community here likely increases the chances of swarm intelligences emerging in our discussions. The fact that individuals must apply further increases the chances.

I agree that I would prefer a more barebones approach to the internet, focused on data retrieval and communication.
Absolutely my direction! Less is more! Get rid of all the unneeded heavy garbage! This protocol does that, seriously!

I am striving for a "Timeless Authors" alternative network that is secure and underground not having to rely on any 3rd parties, such as even 3rd party server hosting. Implemented now as a parallel network it would be ready to fall back on when the crap gets deep and the TA domain is threatened. But here is the deal... One such as yourself could also set up a network of your own for your own social or church group outside our TA network. Once packaged up as a boxed set It can be adapted and used as we like with just a couple configurations! But first we need to play with it and get it figured out! Using what they already have to get an idea is the first step. Tell you what, I am personally impressed with it and how simple, basic, and light everything is in there. Except for content, the whole websites are only a couple Megabytes just like the old days.

:)
“The ultimate test of a moral society is the kind of world it leaves to its children.” ~ Dietrich Bonhoeffer
User avatar
Atruepatriot
Posts: 12151
Joined: Tue Feb 25, 2020 11:55 am

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Atruepatriot »

Lancer wrote: Mon Oct 16, 2023 7:21 am
Atruepatriot wrote: Mon Oct 02, 2023 5:53 pm Project Gemini FAQ - §1 Introduction and Overview...
Now that I have slugged it out through that generous text, I find myself interested. Is there an abundance of material in Geminispace? Does Gemini gobble up ordinary web pages, throwing out the chaff?
Geminispace is a whole separate internet of it''s own isolated from the normal WWW we use. Here are some Geminispace searches, they search only what is inside the separate Gemini realm of course except for outside links that are shared in posts. Then it uses your separate default browser to go to those.

:)

In my copy and paste the > and => are actualy small icons. That is about as fancy as it gets. Everything esle is just text.

geminispace.info - Gemini Search Engine

=> / Home
=> /search Search
=> /backlinks Query backlinks

## Search
=> /v/search/1?books Enter verbose mode

"books"

=> gemini://gemini.omarpolo.com/cgi/gempkg/books/mason-book/ gemini.omarpolo.com/cgi/gempkg/books/mason-book/ (text/gemini, 2K)
* ...books/vol6a books/vol6a => /cgi/gempkg/books/wndw books/wndw => /cgi/gempkg/books/wndw,-ar books/wndw,-ar => /cgi/gempkg/books/wndw,-es books/wndw,-es => /cgi/gempkg/books/wndw,-fr books/wndw,-fr => /cgi/gempkg/books/wndw,-id books...

=> gemini://blitter.com/apl-books/ blitter.com/apl-books/ (text/gemini, 25K)
* ...books/Iverson_algebra.pdf Iverson_algebra.pdf [Jan 1 00:00:00] => /apl-books/James1972.pdf James1972.pdf [Dec 2 17:11:07] => /apl-books/MSKLC.exe MSKLC.exe [Mar 8 10:10:14] => /apl-books/MicroAPL_Unified_Keyboard.jpg Micro...

=> gemini://blitter.com/apl-books blitter.com/apl-books (text/gemini, 25K)
* ...books/Iverson_algebra.pdf Iverson_algebra.pdf [Jan 1 00:00:00] => /apl-books/James1972.pdf James1972.pdf [Dec 2 17:11:07] => /apl-books/MSKLC.exe MSKLC.exe [Mar 8 10:10:14] => /apl-books/MicroAPL_Unified_Keyboard.jpg Micro...

=> gemini://vigrey.com/books vigrey.com/books (text/gemini, 593B)
* ...Books I Have Read I'm trying to make it a point to read books, as I had not read full books for over a decade. That is why the earliest year in this list is 2023. This list is limited to physical...

=> gemini://caseyrichins.online/books.gmi caseyrichins.online/books.gmi (text/gemini, 833B)
* ...my thoughts on their content or story line. There are non-fiction and fiction. => books/sudo_mastery.gmi Sudo Mastery by Michael W. Lucas => books/tls_mastery.gmi TLS Mastery by Michael W. Lucas => books/pgp_gpg.gmi PGP & GPG by Michael W. Lucas => books/ssh_mastery.gmi SSH Mastery by Michael W...

=> gemini://cldwrm.xyz/books/index.gmi cldwrm.xyz/books/index.gmi (text/gemini, 2K)
* ...books/other.gmi Other Boring Topics => gemini://cldwrm.xyz/books/heresy.gmi Fun(?) books ## Good taste in books (i.e. more lists) => gemini://gnebbia.net/misc/books/index.gmi gnebbia ## Places for boring books => https://humblebundle...

=> gemini://blitter.com/apl-books/Papers blitter.com/apl-books/Papers (text/gemini, 7K)
* ...apl-books/Papers/jint.pdf jint.pdf [Mar 24 10:36:50] => /apl-books/Papers/lin1988_TeachingMathematicalProgrammingWith_APL.pdf lin1988_TeachingMathematical...

=> gemini://blitter.com/apl-books/BQN blitter.com/apl-books/BQN (text/gemini, 3K)
* ...Listing /home/russtopia/public_gemini/apl-books/BQN => gemini://blitter.com/apl-books .. => /apl-books/BQN/3270_fonts_70de9c7.zip 3270_fonts_70de9c7.zip [Mar 6 22:48:16] => /apl-books/BQN/3270font-2.1.1.zip 3270font-2.1.1.zip [Mar 6 22:48:27] => /apl-books/BQN/DejaVuBQNSans...

=> gemini://maple.flounder.online/books maple.flounder.online/books (text/gemini, 282B)
* ...cataloging books I read => /books/2020.gmi 2020 => /books/2021.gmi 2021 => /books/2022.gmi 2022 => /books/2023.gmi 2023 ``` ______ ______ _/ Y...

=> gemini://blitter.com/apl-books/Retro blitter.com/apl-books/Retro (text/gemini, 2K)
* ...apl-books/Retro/Computer_Age_06.pdf Computer_Age_06.pdf [Dec 20 02:38:58] => /apl-books/Retro/Computer_Age_07.pdf Computer_Age_07.pdf [Dec 20 02:40:00] => /apl-books/Retro/Computer_Age_08.pdf Computer_Age_08.pdf [Dec 20 02...

Page 1 of 1852 (18511 results)
=> /search/2?books Next Page
=> /search/jump/books Jump to page...


=> /add-seed missing results? add your capsule to geminispace.info

> Index updated on: 2023-10-13

geminispace.info - Gemini Search Engine

=> / Home
=> /search Search
=> /backlinks Query backlinks

## Search
=> /v/search/1?Christian Enter verbose mode

"Christian"

=> gemini://the-brannons.com/christians/ the-brannons.com/christians/ (text/gemini, 5K)
* ...will have power." This is Christian Nationalism in a nutshell, pursuing Christian power over Christian principles. Salt the earth. Here at home, Gov. Kevin Stitt is the man in charge of the fight...

=> gemini://library.inu.red/topic/christian library.inu.red/topic/christian (text/gemini, 2K)
* ...and William Blake's Idea of Jesus — Chris Hobson => /document/nathan-coombs-christian-communists-islamic-anarchists Christian Communists, Islamic Anarchists? — Nathan Coombs => /document/hugh-owen-pentecost-the-crime...

=> gemini://library.inu.red/topic/Christian library.inu.red/topic/Christian (text/gemini, 2K)
* ...and William Blake's Idea of Jesus — Chris Hobson => /document/nathan-coombs-christian-communists-islamic-anarchists Christian Communists, Islamic Anarchists? — Nathan Coombs => /document/hugh-owen-pentecost-the-crime...

=> gemini://library.inu.red/topic/Christianity library.inu.red/topic/Christianity (text/gemini, 5K)
* ...of Sunday — Pierre Joseph Proudhon => /document/alexandre-christoyannopoulos-christian-anarchism Christian Anarchism — Alexandre Christoyannopoulos => /document/tom-cornell-christian-nonviolence Christian Nonviolence — Tom Cornell => /document/nikolai-berdyaev-christianity...

=> gemini://library.inu.red/topic/christianity library.inu.red/topic/christianity (text/gemini, 5K)
* ...of Sunday — Pierre Joseph Proudhon => /document/alexandre-christoyannopoulos-christian-anarchism Christian Anarchism — Alexandre Christoyannopoulos => /document/tom-cornell-christian-nonviolence Christian Nonviolence — Tom Cornell => /document/nikolai-berdyaev-christianity...

=> gemini://library.inu.red/topic/Christian+anarchism library.inu.red/topic/Christian+anarchism (text/gemini, 815B)
* ...Christianity — Jacques Ellul => /document/alexandre-christoyannopoulos-christian-anarchism Christian Anarchism — Alexandre Christoyannopoulos => /document/graham-cameron-christian-anarchism-en Christian Anarchism — Graham Cameron => /document/jon-burke-successful...

=> gemini://blitter.com/OLGA/MUSIC/C/CHRISTIAN_DEATH blitter.com/OLGA/MUSIC/C/CHRISTIAN_DEATH (text/gemini, 1K)
* ...C/CHRISTIAN_DEATH/SKELETON_KISS.TAB SKELETON_KISS.TAB [Jan 23 17:29:49] => /OLGA/MUSIC/C/CHRISTIAN_DEATH/SPIRITUAL_CRAMP.CRD SPIRITUAL_CRAMP.CRD [Jan 23 17:29:49] => /OLGA/MUSIC/C/CHRISTIAN_DEATH/THIS_IS_HERESY.TAB...

=> gemini://willowashmaple.xyz/2022-11-08-christian-nationalism willowashmaple.xyz/2022-11-08-christian-nationalism (text/gemini, 4K)
* ...I was thoroughly indoctrinated by Trinity Broadcasting Network (TBN) and Christian radio stations and regularly donated to Christian Coalition, American Centers for Law and Justice, and other similar entities. I believed...

=> gemini://library.inu.red/author/Christian+Loidl library.inu.red/author/Christian+Loidl (text/gemini, 190B)
* ...Author: Christian Loidl => /document/david-ender-jack-hauser-christian-loidl-interview-with-hakim-bey Interview with Hakim Bey — David Ender, Jack Hauser, Christian Loidl => / Home...

=> gemini://spam.works/mirrors/textfiles/bbs/BBSLISTS/christian.bbs spam.works/mirrors/textfiles/bbs/BBSLISTS/christian.bbs (text/plain, 7K)
* ...LIST OF CHRISTIAN BBS: AK 907-345-6661 Alaskan Christian Exchange AK 907-522-3806 Abbot Loop Family Net AL 205-598-1987 Ideas Unlimited AR 501-455...

Page 1 of 1165 (11647 results)
=> /search/2?Christian Next Page
=> /search/jump/Christian Jump to page...


=> /add-seed missing results? add your capsule to geminispace.info

> Index updated on: 2023-10-13

geminispace.info - Gemini Search Engine

=> / Home
=> /search Search
=> /backlinks Query backlinks

## Search
=> /v/search/1?social%20BBS Enter verbose mode

"social BBS"

=> gemini://cdg.thegonz.net/interactive/social/ cdg.thegonz.net/interactive/social/ (text/gemini, 563B)
* ...net/gredig/ Gredig: social language-learning exercise => gemini://bbs.geminispace.org/ BBS: forums, microblogging, issue tracking => +add Add link...

=> gemini://gemini.thegonz.net/cdg/interactive/social/ gemini.thegonz.net/cdg/interactive/social/ (text/gemini, 563B)
* ...net/gredig/ Gredig: social language-learning exercise => gemini://bbs.geminispace.org/ BBS: forums, microblogging, issue tracking => +add Add link...

=> gemini://the-brannons.com/broken-social/ the-brannons.com/broken-social/ (text/gemini, 1K)
* ...The idea of a social network is kinda broken The discussion of social networking and the small net got me thinking. The problem with social networking is that people follow people, not topics. That's not a new idea...

=> gemini://eaplmx.smol.pub/creando-un-pensadero-social eaplmx.smol.pub/creando-un-pensadero-social (text/gemini, 3K)
=> /backlinks?eaplmx.smol.pub/creando-un-pensadero-social 1 cross-capsule backlink
* ...y de otros servicios sociales como midnight.pub, estuvo trabajando en => https://bbs.nfshost.com Speakeasy un simple sitio Web que recuerda a los foros y BBS (Sistema de Tablón de anuncios) de hace algunos años, o como recientemente, en los 2020s, se le ha llamado...

=> gemini://text.eapl.mx/creando-un-pensadero-social text.eapl.mx/creando-un-pensadero-social (text/gemini, 3K)
* ...y de otros servicios sociales como midnight.pub, estuvo trabajando en => https://bbs.nfshost.com Speakeasy un simple sitio Web que recuerda a los foros y BBS (Sistema de Tablón de anuncios) de hace algunos años, o como recientemente, en los 2020s, se le ha llamado...

=> gemini://gemini.locrian.zone/bookmarks/social.gmi gemini.locrian.zone/bookmarks/social.gmi (text/gemini, 530B)
* ...Bookmarks — Social media alternatives ## Forums => gemini://bbs.geminispace.org/ Bubble => gemini://geddit.glv.one Geddit => gemini://nightfall.city Nightfall City ## Journaling...

=> gemini://gem.ajroach42.com/posts/2022-11-08-Social-Media.gmi gem.ajroach42.com/posts/2022-11-08-Social-Media.gmi (text/gemini, 4K)
* ...lot of signal. Traditional media has spent the last 10 years trying to swallow social media, to the point that the concept of Social Media is now poisoned. For most people, it doesn't mean Participating, it means being alternately...

=> gemini://spam.works/mirrors/textfiles/bbs/hacker.txt spam.works/mirrors/textfiles/bbs/hacker.txt (text/plain, 149K)
* ...11 is presented. Although the CU is a social network, the ties developed at the social level encourage the formation of small "work groups." At this level, some members of the CU work...

=> gemini://bbs.geminispace.org/u/cquenelle?tinylog bbs.geminispace.org/u/cquenelle?tinylog (text/gemini, 3K)
* ...which I found quite interesting. I like thinking about next generation social networks that aren’t so unhealthy and there was a lot to think about. => https://subconscious.substack...

=> gemini://bbs.geminispace.org/u/skyjake/1257 bbs.geminispace.org/u/skyjake/1257 (text/gemini, 6K)
* ...u/jeang3nie/1258 🦀 jeang3nie @skyjake actually I really like that idea. Maybe bbs.geminispace.org would be more fitting than social? => /u/skyjake/1259 🚀 skyjake @jeang3nie "bbs" is appropriate, short, and descriptive. Definitely a contender! => /u/Morgan/1261 ☕️ Morgan Nice idea...

Page 1 of 4327 (43261 results)

geminispace.info - Gemini Search Engine

=> / Home
=> /search Search
=> /backlinks Query backlinks

## Search
=> /v/search/1?Blogs Enter verbose mode

"Blogs"

=> gemini://psicobyte.com/blog/carajillo_y_blogs.gmi psicobyte.com/blog/carajillo_y_blogs.gmi (text/gemini, 3K)
* ...suena esta fecha?_), charlando tranquilamente. Charlando, fundamentalmente, de blogs: Chismorreos de blogs, motores de blogs, autores de blogs, lectores de blogs, redes de blogs... Pero también de otros temas de lo más variado... En definitiva, un rato agradable, interesante...

=> gemini://psicobyte.com/blog/blogs.gmi psicobyte.com/blog/blogs.gmi (text/gemini, 3K)
* ...suerte de voyeur cibernético. Porque algo así es lo que somos los lectores de blogs. Aunque no sé muy bién si se debe _realmente_ a algún impulso _voyeur_, esa especie de curiosidad...

=> gemini://psicobyte.com/blog/piononos_y_blogs.gmi psicobyte.com/blog/piononos_y_blogs.gmi (text/gemini, 836B)
* ...Piononos y blogs 2004-06-30 Como ya puedes ver en el blog de JJ, tenemos fecha, hora y lugar para la próxima kedada...

=> gemini://posixcafe.org/blogs posixcafe.org/blogs (text/gemini, 290B)
* ...blogs/9radio.gem => /blogs/abstractions.gem => /blogs/badapple.gem => /blogs/barebones9.gem => /blogs/docs.gem => /blogs/dynamic_typing.gem => /blogs/find_a_mentor.gem => /blogs/fossil_and_venti.gem => /blogs/lessons_learned...

=> gemini://psicobyte.com/blog/premios_20_blogs.gmi psicobyte.com/blog/premios_20_blogs.gmi (text/gemini, 2K)
* ...Premios 20 blogs 2005-06-06 Pues no, yo no me presento. Debo ser de los pocos del bloguerío hispano que no están en...

=> gemini://psicobyte.com/blog/i_masa_critica_y_blogs.gmi psicobyte.com/blog/i_masa_critica_y_blogs.gmi (text/gemini, 1K)
* ...Crítica & Blogs**. [IMG I - Masa Crítica & Blogs (1)] Lo sé: Este cartel es kitsch y no tiene nada que ver con el tema. Pero a mí me gusta así. Puedes hacer...

=> gemini://psicobyte.com/blog/blogs_contra_la_tortura.gmi psicobyte.com/blog/blogs_contra_la_tortura.gmi (text/gemini, 1K)
* ...en nombre de los Derechos Humanos. Lee el manifiesto completo (y únete) en Blogs contra la tortura[1] ## Links => http://www.otromundoesposible.com/wiki/ ... la_tortura [1] Blogs contra la tortura ## Meta => https://www.psicobyte.com/articulo/blog ... la_tortura...

=> gemini://psicobyte.com/blog/blogs_cervezas_y_un_libro.gmi psicobyte.com/blog/blogs_cervezas_y_un_libro.gmi (text/gemini, 2K)
* ...cuando lo termine, aunque te adelanto que está interesante). Y a hablar del blogs, claro. Pariticiparán en una mesa redonda a las **doce del mediodía**, en el salón de grados de la ETSII...

=> gemini://psicobyte.com/blog/blogs_en_canal_2_andalucia.gmi psicobyte.com/blog/blogs_en_canal_2_andalucia.gmi (text/gemini, 706B)
* ...Blogs en Canal 2 Andalucía 2006-03-22 Me entero por AficionA2[1] de que el reportaje sobre blogs[2] para el que entrevistaron a varios blogueros granadinos (incluído un servidor[3]) se emitirá...

=> gemini://psicobyte.com/blog/i_chana_tapas_y_blogs.gmi psicobyte.com/blog/i_chana_tapas_y_blogs.gmi (text/gemini, 1K)
* ...esas cosas de las que charlan los blogeros. Los blogeros básicamente hablan de blogs y todo lo demás, considerando "todo lo demás" en su sentido más amplio. De modo que se está hablando...

Page 1 of 1371 (13705 results)
=> /search/2?Blogs Next Page
=> /search/jump/Blogs Jump to page...


=> /add-seed missing results? add your capsule to geminispace.info

> Index updated on: 2023-10-13

geminispace.info - Gemini Search Engine

=> / Home
=> /search Search
=> /backlinks Query backlinks

## Search
=> /v/search/1?Directories Enter verbose mode

"Directories"

=> gemini://pennywhether.xyz/articles/i_miss_web_directories.gmi pennywhether.xyz/articles/i_miss_web_directories.gmi (text/gemini, 5K)
* ...I Miss Web Directories In my previous post, I alluded to how I miss the directories of the 90s / very early 00s. Pre-Google, search engines were not great. Query recommendation...

=> gemini://cdg.thegonz.net/infrastructure/directories/ cdg.thegonz.net/infrastructure/directories/ (text/gemini, 533B)

=> gemini://mozz.us/journal/2019-08-20_documents_and_directories.gmi mozz.us/journal/2019-08-20_documents_and_directories.gmi (text/gemini, 6K)
=> /backlinks?mozz.us/journal/2019-08-20_documents_and_directories.gmi 1 cross-capsule backlink
* ...There are two broad categories of content that are worth consideration here: 1. Directories 2. Documents Directories are what facilitate content discovery on your platform. These pages don't contain much...

=> gemini://gemini.thegonz.net/cdg/infrastructure/directories/ gemini.thegonz.net/cdg/infrastructure/directories/ (text/gemini, 533B)

=> gemini://lofi.haiku-os.org/docs/develop/packages/DirectoryStructure.gmi lofi.haiku-os.org/docs/develop/packages/DirectoryStructure.gmi (text/gemini, 2K)
* ...of the activated packages in the respective "packages" subdirectory. The directories marked with "*" are “shine-through” directories. They are not provided by the packagefs, but are the underlying directories of the boot volume. Unlike the other directories they are writable...

=> gemini://tilde.pink/~hektor/gemini-directory.gmi tilde.pink/~hektor/gemini-directory.gmi (text/gemini, 3K)
=> /backlinks?tilde.pink/~hektor/gemini-directory.gmi 1 cross-capsule backlink

=> gemini://soviet.circumlunar.space/hektor/gemini-directory.gmi soviet.circumlunar.space/hektor/gemini-directory.gmi (text/gemini, 3K)

=> gemini://soviet.circumlunar.space/~hektor/gemini-directory.gmi soviet.circumlunar.space/~hektor/gemini-directory.gmi (text/gemini, 3K)

=> gemini://thrig.me/tech/rpm-a-directory.gmi thrig.me/tech/rpm-a-directory.gmi (text/gemini, 5K)
* ...of Modules This need not be a single directory; there could be multiple such directories, one for each particular application that needs particular module versions. I ran nothing...

=> gemini://hellomouse.net/user-pages/handicraftsman/ietf/data/draft-ietf-mmusic-sdp-directory-type-00.txt hellomouse.net/user-pages/handicraftsman/ietf/data/draft-ietf-mmusic-sdp-directory-type-00.txt (text/plain, 10K)
* ...document describes the "directory" SDP media type, for use in describing session directories using SDP. By allowing SDP directories to be announced as sessions within other SDP directories, this media type increases the flexibility and scalability of SDP directories. 3. Introduction...

Page 1 of 6570 (65694 results)
=> /search/2?Directories Next Page
=> /search/jump/Directories Jump to page...


=> /add-seed missing results? add your capsule to geminispace.info

> Index updated on: 2023-10-13

geminispace.info - Gemini Search Engine

=> / Home
=> /search Search
=> /backlinks Query backlinks

## Search
=> /v/search/1?music Enter verbose mode

"music"

=> gemini://blitter.com/OLGA/MUSIC/R/ROMANTIC_MUSIC blitter.com/OLGA/MUSIC/R/ROMANTIC_MUSIC (text/gemini, 304B)
* ...Listing /home/russtopia/public_gemini/OLGA/MUSIC/R/ROMANTIC_MUSIC => gemini://blitter.com/OLGA/MUSIC/R .. => /OLGA/MUSIC/R/ROMANTIC_MUSIC/ROMANCE.TAB ROMANCE.TAB [Jan 23 17:40:25...

=> gemini://blitter.com/OLGA/MUSIC/R/ROXY_MUSIC blitter.com/OLGA/MUSIC/R/ROXY_MUSIC (text/gemini, 296B)
* ...Listing /home/russtopia/public_gemini/OLGA/MUSIC/R/ROXY_MUSIC => gemini://blitter.com/OLGA/MUSIC/R .. => /OLGA/MUSIC/R/ROXY_MUSIC/JEALOUS_GUY.TAB JEALOUS_GUY.TAB [Jan 23 17:40:29...

=> gemini://blitter.com/OLGA/MUSIC/M/MUSIC_MACHINE blitter.com/OLGA/MUSIC/M/MUSIC_MACHINE (text/gemini, 302B)
* ...Listing /home/russtopia/public_gemini/OLGA/MUSIC/M/MUSIC_MACHINE => gemini://blitter.com/OLGA/MUSIC/M .. => /OLGA/MUSIC/M/MUSIC_MACHINE/TALK_TALK.TAB TALK_TALK.TAB [Jan 23 17:37:49...

=> gemini://blitter.com/OLGA/MUSIC/M/MUSIC_EXPLOSION blitter.com/OLGA/MUSIC/M/MUSIC_EXPLOSION (text/gemini, 306B)
* ...Listing /home/russtopia/public_gemini/OLGA/MUSIC/M/MUSIC_EXPLOSION => gemini://blitter.com/OLGA/MUSIC/M .. => /OLGA/MUSIC/M/MUSIC_EXPLOSION/LITTLE_BIT_O_SOUL.CRD LITTLE_BIT_O_SOUL.CRD [Jan 23 17:37:48...

=> gemini://blitter.com/OLGA/MUSIC/M/MUSIC_MAN blitter.com/OLGA/MUSIC/M/MUSIC_MAN (text/gemini, 294B)
* ...Listing /home/russtopia/public_gemini/OLGA/MUSIC/M/MUSIC_MAN => gemini://blitter.com/OLGA/MUSIC/M .. => /OLGA/MUSIC/M/MUSIC_MAN/TIL_THERE_WAS_YOU.TAB TIL_THERE_WAS_YOU.TAB [Jan 23 17:37:49...

=> gemini://blitter.com/OLGA/MUSIC/A/AMERICAN_MUSIC_CLUB blitter.com/OLGA/MUSIC/A/AMERICAN_MUSIC_CLUB (text/gemini, 314B)
* ...Listing /home/russtopia/public_gemini/OLGA/MUSIC/A/AMERICAN_MUSIC_CLUB => gemini://blitter.com/OLGA/MUSIC/A .. => /OLGA/MUSIC/A/AMERICAN_MUSIC_CLUB/FEARLESS.CRD FEARLESS.CRD [Jan 23 17:27:03...

=> gemini://senders.io/music/ senders.io/music/ (text/gemini, 2K)
* ...Music Index I really like music. It's my first and primary love. I am a bad writer but if anything just sift past me fangirling and...

=> gemini://blitter.com/OLGA/MUSIC/ blitter.com/OLGA/MUSIC/ (text/gemini, 10K)
* ...MUSIC/O-P.ZIP O-P.ZIP [Jan 23 17:38:29] => /OLGA/MUSIC/OLGA.CL2 OLGA.CL2 [Jan 23 17:38:35] => /OLGA/MUSIC/Q-R.ZIP Q-R.ZIP [Jan 23 17:39:39] => /OLGA/MUSIC/RESOURCES.ZIP RESOURCES.ZIP [Jan 23 17:41:18] => /OLGA/MUSIC/S.ZIP S.ZIP [Jan 23 17:42:55...

=> gemini://blitter.com/OLGA/MUSIC blitter.com/OLGA/MUSIC (text/gemini, 10K)
* ...MUSIC/O-P.ZIP O-P.ZIP [Jan 23 17:38:29] => /OLGA/MUSIC/OLGA.CL2 OLGA.CL2 [Jan 23 17:38:35] => /OLGA/MUSIC/Q-R.ZIP Q-R.ZIP [Jan 23 17:39:39] => /OLGA/MUSIC/RESOURCES.ZIP RESOURCES.ZIP [Jan 23 17:41:18] => /OLGA/MUSIC/S.ZIP S.ZIP [Jan 23 17:42:55...

=> gemini://siiky.srht.site/music/what_is_music-may_be_subjective.gmi siiky.srht.site/music/what_is_music-may_be_subjective.gmi (text/gemini, 3K)
=> /backlinks?siiky.srht.site/music/what_is_music-may_be_subjective.gmi 51 cross-capsule backlinks
* ...to be the Mona Lisa if I decide it's not the Mona Lisa -- a certain piece of music doesn't cease to be music just because I don't recognize it as music. Whether it is music or not to me, if somebody recognizes it as music, then it is music. And, on the other hand, something being music...

Page 1 of 3753 (37527 results)
=> /search/2?music Next Page
=> /search/jump/music Jump to page...


=> /add-seed missing results? add your capsule to geminispace.info

> Index updated on: 2023-10-13

Small sample of what is on there....

:)
“The ultimate test of a moral society is the kind of world it leaves to its children.” ~ Dietrich Bonhoeffer
User avatar
Atruepatriot
Posts: 12151
Joined: Tue Feb 25, 2020 11:55 am

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Atruepatriot »

I was wrong about needing a static mail server for a community network. The mail protocol is directly P2P. So if the receiver is not online it is considered "unavailable" and you are required to try and send again later when they are online. I like that no common mail server is required, this is one less dependency to implement for a community network.

The Misfin mail protocol (prototype B)
(updated 11 May 2023)
(for comments, suggestions, well-wishes, insults, etc. - send a Misfin letter to rfc@misfin.org)

## 1 Overview

Misfin is a client-server mail transport protocol, broadly similar to SMTP and heavily influenced by Gemini. All connections follow the pattern request-response, and are closed at the end of this transaction.

Misfin servers on TCP/IP should be bound to port 1958, which is unprivledged and should be accessible without administrator permissions on most systems.

### 1.1 Misfin transactions

The sole type of Misfin transaction delivers a message from a client to a server. This transaction proceeds as so:

C: Opens connection
S: Accepts connection
C/S: Complete TLS handshake
C/S: Validate peer's certificate (s)
C: Sends one CRLF terminated line - the request
S: Sends one CRLF terminated line - the response
C/S: Closes connection, handling response if not OK

Both clients and servers should gracefully handle connections that close before they are expected to.

### 1.2 Misfin request scheme

A single request line is sent by the Misfin client to a Misfin server, following this structure:
```
misfin://<MAILBOX>@<HOSTNAME><SPACE><MESSAGE><CR><LF>
```
MAILBOX is the user receiving the message.
HOSTNAME is the domain name that points to the Misfin server.
SPACE is a single space character, i.e. the byte 0x20.

The remainder of the request following the SPACE, and up until the terminating CRLF, makes up the MESSAGE, which is assumed to be Gemtext (text/gemini). All strings are UTF-8 encoded, and the entire request should not exceed 2048 bytes.

By including the hostname of the server in the request, advanced Misfin servers can host mailboxes for multiple domains on the same host. Servers are not required to implement this feature, and are only expected to service mail for a single domain.

### 1.3 Misfin response scheme

The Misfin server will send a single response line to the requesting client, following this structure:
```
<STATUS><SPACE><META><CR><LF>
```
STATUS is a two-digit numeric status code.
META is a string whose meaning is defined by the status code.

Like requests, response strings are UTF-8 encoded and should not exceed 2048 bytes in length. After the response is sent, the transaction is finished, and the connection should be closed.

## 2 Status codes

Misfin servers send a two-digit status code in their response to the client, which either confirms the message was delivered, or explains why it wasn't. The status code's category is indicated by the first digit, so simple clients only need to read the first character of the response to know, broadly, what it should do.

These status codes are designed to be compatible with Gemini's, so developers comfortable with Gemini status codes should intuitively know the meaning of Misfin status codes.

### 2.1 1x (INPUT)
These codes are reserved, and must not be sent by a Misfin server.

### 2.2 2x (SUCCESS)
Status codes beginning with 2 are SUCCESS status codes, which mean that the client's message has been delivered.

#### 20 <fingerprint> - MESSAGE DELIVERED
The message was delivered successfully. The META tag is the fingerprint of the recipient's certificate - see section 3.1.

### 2.3 3x (REDIRECT)

Status codes beginning with 3 are REDIRECT status codes, which tell the client to resend their request to a different Misfin server.

#### 30 <address> - SEND HERE INSTEAD
The mailbox has moved to a different address, and this message should be resent to that address.

#### 31 <address> - SEND HERE FOREVER
The mailbox has moved to a different address, and all future messages should be sent to that address.

### 2.4 4x (TEMPORARY FAILURE)

Status codes beginning with 4 are TEMPORARY FAILURE status codes, which mean the request did not succeed, but might succeed if retried in the future.

#### 40 - TEMPORARY ERROR
The mailserver experienced a transient issue, and the message should be resent.

#### 41 - SERVER IS UNAVAILABLE
The mailserver can't accept mail right now.

#### 42 - CGI ERROR
A mailserver script ran for your message, but experienced an error.

#### 43 - PROXYING ERROR
There was a problem accepting mail for that domain, but it might resolve itself.

#### 44 - SLOW DOWN
You are being rate limited - wait before trying to send more mail.

#### 45 - MAILBOX FULL
The mailbox isn't accepting mail right now, but it might in the future.

### 2.5 5x (PERMANENT FAILURE)

Status codes beginning with 5 are PERMANENT FAILURE status codes, which mean the request did not succeed, and should not be retried.

#### 50 - PERMANENT ERROR
Something is wrong with the mailserver, and you should not try to resend your message.

#### 51 - MAILBOX DOESN'T EXIST
The mailbox you are trying to send to doesn't exist, and the mailserver won't accept your message.

#### 52 - MAILBOX GONE
The mailbox you are trying to send to existed once, but doesn't anymore.

#### 53 - DOMAIN NOT SERVICED
This mailserver doesn't serve mail for the hostname you provided.

#### 59 - BAD REQUEST
Your request is malformed, and won't be accepted by the mailserver.

### 2.6 6x (AUTHENTICATION FAILURE)

Status codes beginning with 6 are AUTHENTICATION FAILURE status codes, which mean that there was an issue with the client's certificate.

#### 60 - CERTIFICATE REQUIRED
This mailserver doesn't accept anonymous mail, and you need to repeat your request with a certificate.

#### 61 - UNAUTHORIZED SENDER
Your certificate was validated, but you are not allowed to send mail to that mailbox.

#### 62 - CERTIFICATE INVALID
Your certificate might be legitimate, but it has a problem - it is expired, or it doesn't point to a valid Misfin identity, etc.

#### 63 - YOU'RE A LIAR
Your certificate matches an identity that the mailserver recognizes, but the fingerprint has changed, so it is rejecting your message.

#### 64 - PROVE IT
The mailserver needs you to complete a task to confirm that you are a legitimate sender. (This is reserved for a Hashcash style anti-spam measure).

## 3 TLS

The use of TLS is mandatory for Misfin transactions. The minimum permissible version of TLS allowed for transactions is TLS 1.2, but clients and servers may choose a more recent version of TLS to support and disallow connections from earlier versions.

Misfin clients and servers must send a TLS "close-notify" prior to closing the connection, so that a complete transaction can be distinguished from one that has ended prematurely.

### 3.1 Misfin identity certificates

Senders and recipients are identified via self-signed x509 certificates, sent as part of a Misfin transaction's TLS handshake. Senders are not required to send a certificate, but are strongly urged to do so, and mailservers should require sender certificates (unless you really know what you are doing).

A Misfin identity consists of a mailbox name, the hostname of the user's mailserver, and a human-readable description of the mailbox or user (the blurb). The mailbox and blurb are stored in the USER_ID and COMMON_NAME fields, respectively, of the certificate's Distinguished Name (as per RFC 4514). The hostname is stored as a DNS record in the certificate's SUBJECT_ALT_NAME extension, to be compatible with Server Name Indication (SNI). Other fields in the subject and issuer names can be present, but are not required to be present, and should not be relied on by Misfin utilities.

A Misfin address is written as "mailbox@hostname", or "blurb (mailbox@hostname)" in longform.

Multiple mailboxes can be serviced by a single mailserver; in this case, the mailserver's certificate should be self-signed, and each mailbox certificate should be signed by the mailserver certificate, so other clients and servers can confirm that those mailboxes actually exist on the mailserver. Mailserver certificates used this way should have the CA constraint set to True, so the mailserver certificate can cryptographically verify its mailbox certificates.

The fingerprint of a Misfin certificate should be a SHA256 hash, and sent as a hexadecimal number without octet separators. Clients and servers should make an effort to normalize received fingerprints that don't match this specification, by lowering the case of the fingerprint or stripping out non-alphanumeric characters.

### 3.2 Certificate validation

Misfin clients and servers send certificates during a transaction, but have no obligation to verify these certificates; however, this is highly, highly discouraged.

Like Gemini, the default validation method for certificates is TOFU, or Trust on First Use. Misfin clients and servers should store the fingerprint of a received certificate the first time it is received, and subsequent certificates from that client or server should be matched against the stored fingerprint.

Advanced Misfin servers may perform CA validation in addition to TOFU. In this scheme, upon receiving a message from a sender with an unrecognized host, the Misfin server may perform a single blank request to the sender's host, and store its certificate. That stored certificate can then be used to verify the certificates of senders purporting to be from that host.

Certificates may be signed by other CAs; Misfin servers may choose to verify these signatures, but are not required to.

### 3.3 Security implications

TOFU is a better-than-nothing strategy that should be suitable for most Misfin users; as long as you've successfully interacted with a legitimate sender once, future attempts to intercept or forge interactions with them will fail.

CA validation is even better; you only need to have an uncompromised connection to a server once, and you can then verify the legitimacy of anyone reporting to have a mailbox with them. This method also has the effect of disallowing messages from senders that are not associated with a Misfin server, which might be desireable in some cases.

Since the sender of a message is identified solely by their certificate, it is not possible to spoof the sender's address in a way that is not visible to the recipient. For instance, you could generate a new, self-signed certificate claiming to be bob@example.com, and send mail pretending to be Bob; however, any replies to those messages will be delivered to the Misfin server at example.com, and not to you.

## 4 Mail file format (gemmail)

The default encoding of Misfin messages is text/gemini; however, Misfin extends this by adding three new line types. Misfin utilites must only parse the first occurance of these lines in a file.

### 4.1 Sender line

The sender line records the Misfin address of the user that sent the message. Sender lines begin with a single "<" character, and have this syntax:
```
< mailbox@hostname.com blurb
```
The whitespace separating the < and the address is optional. The blurb is also optional, but if it is included, it must be separated from the address by whitespace.

Sender lines should be added by the server when saving or retransmitting a message. If a message is forwarded, the original sender line should be preserved and sent alongside, so the final recipient will see both senders:
```
< development@mailing-lists.com Development mailing list
< source@example.com Source user
...
```

### 4.2 Recipients line

The recipients line begins with a single ":" character, and denotes all receivers of a message, separated by whitespace:
```
: one@example.com two@example.com three@example.com ...
```
When replying to a Misfin message, it should be delivered to the address in the sender line (if present), followed by the addresses in the recipients line. Misfin clients are required to check for duplicate addresses, and not send multiple copies of the message to the same recipient. Misfin clients must also check to make sure they are not sending mail back to their sending address.

A recipient line can added for messages going to only one person, but since replies go to the sending address anyway, this shouldn't be done - it's overkill.

### 4.3 Timestamp line

This line type is a work in progress, but the intention is to record when the message was received - useful if your mailbox is implemented as a single text file (like UNIX back in the day) or when forwarding a message.

Timestamp lines begin with a single "@" character, and are followed by the time in ISO-8601 format:
```
@ 2023-05-09T19:39:15Z
```
Like sender lines, timestamp lines should be added by the receiving mailserver, and only sent if forwarding a message, in which case they should be left as-is.

### 4.4 Message subject

The first heading line in a file, if provided, should be considered as the message's subject, and advanced Misfin utilities may elect to show it to the user in place of the full message contents.

### 4.5 Example messages

The simplest messages may just consist of a sender line:
```
< friend@example.com Your Friend

What's up?
```

A group message can be sent with a recipients line:
```
< one@example.com Person One
: two@example.com three@example.com

A funny joke
```
...and the replies will have the addresses shuffled around to make sense:
```
< two@example.com Person Two
: one@example.com three@example.com

Rolling on the floor laughing
```

A message from a mailing list might read:
```
< workers@hive.com Worker bees list
< 33@hive.com Bee #33

# A note on flowers

The green snappy looking ones are venus flytraps and you SHOULD NOT interact

I like that everything in Gemini and the Lagrange client are personal, you can contact the developer of tools and protocols directly.
“The ultimate test of a moral society is the kind of world it leaves to its children.” ~ Dietrich Bonhoeffer
User avatar
Atruepatriot
Posts: 12151
Joined: Tue Feb 25, 2020 11:55 am

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Atruepatriot »

Full help page:

Help

## What is Gemini

Gemini is a simple protocol for serving content over the internet. It specifies a Markdown inspired format allowing basic plain text document markup. Compared to HTTP and HTML, Gemini is vastly simpler and easier to work with.

=> gemini://geminiprotocol.net/docs/faq.gmi Project Gemini FAQ
=> gemini://geminiprotocol.net/docs/specification.gmi Protocol and 'text/gemini' specification

## What is Lagrange

Lagrange is a GUI client for browsing Geminispace. It offers modern conveniences familiar from web browsers, such as smooth scrolling, inline image viewing, multiple tabs, visual themes, Unicode fonts, bookmarks, history, and page outlines.

Like Gemini, Lagrange has been designed with minimalism in mind. It depends on a small number of essential libraries. It is written in C and uses SDL for hardware-accelerated graphics. OpenSSL is used for secure communications.

=> about:lagrange About Lagrange
=> https://www.libsdl.org/ SDL: Simple DirectMedia Layer
=> https://www.openssl.org/ OpenSSL: Cryptography and SSL/TLS Toolkit

### Features

* Beautiful typography with full Unicode support
* Autogenerated page style and symbol for each Gemini domain
* Light and dark color themes
* Smooth scrolling
* Scaling page content (50%...200%)
* Scaling factor for the UI (for arbitrary monitor DPI)
* Sidebars for managing bookmarks, identities and subscribed feeds, and viewing browsing history and the page outline
* Multiple tabs
* Split view for browsing two pages at once
* Persistent app state — tabs and history are restored on next run
* Configurable keybindings
* Customizable UI color palette
* Open links via keyboard shortcuts
* Select and copy text with the mouse
* Find text on the page
* Open image and audio links inline on the same page
* Instant back/forward navigation (on macOS supports swipes on trackpad)
* Subscribe to Gemini and Atom feeds
* Identity management — create and use TLS client certificates
* Smart suggestions when typing an URL — search bookmarks, history, feeds, identities
* Search engine integration
* Configurable text snippets that can be pasted in input fields and used as custom search queries
* Use Gemini pages as a source of bookmarks
* Audio playback: MP3, Ogg Vorbis, WAV
* Read Gempub books and view ZIP archive contents
* Built-in support for uploading data using the Titan protocol
* Built-in support for Gopher, Finger, Spartan, and Nex
* Use proxy servers for Gemini, HTTP, and Gopher content

## Why not just use a web browser

Modern web browsers are complex beasts. In fact, they are so complex that one can create a fully functional virtual machine inside one and run another operating system!

=> https://win95.ajf.me Windows 95 on DOSBox (using Emscripten)

If one seeks to just read text and view images, this is absurd overkill. Having a universal platform that runs everywhere and on everything is clearly a valuable notion, but it comes with a hefty price tag. The software stack towers ever higher, and hardware needs to be ever more powerful and complicated to run it well. However, everything on the internet doesn't have to rely on this behemoth.

One way to browse Gemini content is via web browser extensions or proxies that translate the content for the web. This may be a sufficient and easy solution for you. However, native clients such as Lagrange also benefit from the simpleness of the protocol and the content. The experience can be optimized, and the software runs well even on simple hardware like the Raspberry Pi.

# 1 User interface

Lagrange's user interface is modeled after web browsers:

* There is a navigation bar at the top with Back and Forward buttons.
* There is a tab bar for switching tabs. The tab bar is hidden if there is only one tab open.
* There are sidebars for managing bookmarks, subscribed feeds, and TLS identities, and viewing history and the page outline. Sidebars are hidden by default.
* There is a search bar that appears at the bottom when searching text on a page.

Tip: Try pressing Ctrl+5 now to see the page outline.

The user interface has been designed for both mouse and keyboard based use. When using a mouse the most commonly needed features are available via context menus, for example by right-clicking on the currently open page. Keyboard shortcuts on the other hand can provide a very quick and fluid user experience. For example, to open the "CAPCOM" bookmark, one might use the following keyboard shortcuts:

* Ctrl+L to activate the URL input field
* Type "cap" which shows the "CAPCOM" bookmark as the first lookup result
* Tab (or ↓) to move focus to the lookup results
* Enter to select "CAPCOM"

## 1.1 Navigation

### 1.1.1 URL entry and quick search

The URL input field can be found in the traditional location in the navigation bar. It can be accessed quickly by pressing Ctrl+L. You can then type or paste an URL and press Enter to load the page.

As you enter text in the URL input field, Lagrange starts looking for matches in bookmarks, subscribed feeds, history, identities, and content of cached pages. This provides an easy way to return to a page you've been on recently. Press Tab or ↓ to switch input focus to the results.

Search within cached pages is limited to the (small) set of pages that Lagrange keeps in memory for back navigation. Search terms are case insensitive, and if many words are entered, they are all required to appear in the specified order in any matched content.

Note that the navigation stack is saved to a file when Lagrange is shut down and restored on the next launch. This means the next time you launch Lagrange, you can still search the contents of past pages. However, navigation stacks are tab-specific, so closing a tab will delete its history as well.

You can also make online search queries via the URL input field. When a search URL is configured on the "General" tab of Preferences, text entered in the URL field is passed to the search URL as a query parameter. A search query will only occur when Enter is pressed while the [Search Query] indicator is visible. One way to configure the search URL is to right-click on a search engine's "Search" link — say, when you are on the engine's front page — and select "Use as Search URL" from the context menu.

See section 2.5 about further customizing the search behavior.

### 1.1.2 Links

The type and destination of a link are indicated by the link's icon and color: ➤ links to the same domain, and 🌐 to a different domain. The colors are:

* Blue for Gemini
* Green for Gopher
* Orange for HTTP(S)
* Red for other/unknown/invalid (cannot be opened)

Links colors may change depending on the page color theme. (See section 2.3.1 "Color themes".)

The "Show URL on hover" option can be enabled in Preferences to show additional information when you move the mouse cursor over a link: the destination domain, URL scheme for non-Gemini links, date of the last visit to the URL, and the identity that will be used when opening the link.

If a link would normally use the default ➤ icon but there is an Emoji at the beginning of the link label, that Emoji is used as the link icon instead. In these cases, you can always assume that the link is a Gemini link whose destination is the same domain that you're currently on.

The "Network" tab of Preferences has a few settings that affect the presentation of links and URLs in general:

* "Decode URLs" causes percent-coding to be decoded for the user interface, so one can see international characters in URLs.
* "Maximum URL size" sets a limit for how long URLs can be. While Gemini servers are required to enforce a limit of 1024 bytes for URLs, this setting affects all URLs regardless of scheme. Link lines with URLs longer than this will be presented as plain text.

### 1.1.3 Page caching

When navigating to a new page, the old page is cached in memory. If you navigate back, the cached copy of the old page is restored. Think of it as rewinding time — you return to a past time as if nothing had happened. The same applies to forward navigation; cached pages are loaded if available. This allows back and forward navigation to happen instantly, without any network requests.

The page cache is saved to a file when Lagrange is shut down so it can be restored on the next launch.

Maximum size of the cache can be configured on the "Content" tab of Preferences. Note that the entire cache is kept in memory at runtime. When the cache fills up, the oldest and largest page content is removed — both factors contribute to the removal. You can set the maximum size to 0 to disable caching altogether, but that will also disable the page content quick search feature.

### 1.1.4 Opening links in a new tab

Holding down Ctrl when left-clicking on a link causes it to open in a new tab. Alternatively, middle-clicking a link has the same effect.

Shift+Ctrl+click opens the link in a new background tab.

Right-clicking on a link shows a link-specific context menu. From there, you can also open the link in a new background tab, which will keep the current tab open.

### 1.1.5 Opening links to the side

Holding down Shift when left-clicking on a link opens it in split view mode on the other side of the split. When in split view mode, your tab pinning preference will determine the tab on which clicked links will open. See section 1.9 for more information about split view modes.

### 1.1.6 Opening links using the keyboard

Lagrange has two modes for navigating links with the keyboard. The first uses a modifier key (Alt by default): while the modifier is pressed, alphanumeric shortcuts are shown for each visible link in the window. You can then press the corresponding key, still holding the modifier, to open a link. The second mode is based on letters only and focuses on the page row keys. You press and release the activation key ("F" by default) to show the link shortcut letters. In this mode the shortcuts are not in alphabetic order, but instead roughly sorted based on proximity to the F and J keys. You may find this easier to use since it is a simple sequence of key presses without using modifiers, allowing one to keep fingers on or near the home row.

You can give it a try now with the link below. Either hold down Alt, or press and release F.

=> gemini://geminiprotocol.net/ Project Gemini

## 1.2 Tabs

Press Ctrl+T to open a new tab, and Ctrl+W to close the current tab. Right-clicking on buttons in the tab bar shows a context menu for additional tab-related functions.

The set of open tabs and their full contents are saved when you quit the application and restored when relaunch it.

### 1.2.1 Highlighting of open links

When you open a tab, and the URL of that tab is found in a link on another page, that link will be highlighted. This way you can conveniently see which links are currently open in other tabs. These highlights will assist you in navigating hierarchies and index pages.

### 1.2.2 Auto-reloading

A tab can be set to auto-reload at given intervals. The setting is remembered until the tab is closed. This is helpful if you keep a periodically updated page open for longer periods of time.

The feature can be found in the page context menu: right-click and select "Tools > Set Auto-Reload...".

## 1.3 Sidebars

The sidebars can be toggled via menus or by pressing Shift+Ctrl+L or Shift+Ctrl+P (for the left/right sidebar, respectively). Both sidebars have five tabs:

* Bookmarks: List of bookmarks that you've created, organized into folders. Bookmarks appear first in search results for quick and easy access.
* Feeds: Entries found on subscribed pages.
* History: Chronological list of visited URLs. This is not a full history of all the URLs you've accessed over time — only unique URLs are shown at the latest access time.
* Identities: TLS client certificates.
* Outline: List of the headings in the currently open tab. Useful when reading longer documents.

Ctrl+1 through Ctrl+5 switch between the left sidebar tabs, or hide the sidebar if the current tab's key is pressed. You can also press Escape to dismiss sidebars.

## 1.4 Bookmarks

Press Ctrl+D to bookmark the currently open URL.

Newly added bookmarks appear at the bottom of the Bookmarks sidebar. You can drag and drop items in the list to change their order.

In addition to a title, bookmarks can have tags. Some tags have a special meaning, but you are free to enter whatever you want in the tags field. In quick search results, tags are given extra weight so they appear higher in results.

By default, bookmarks are assigned random icons. You can enter a custom icon for a bookmark in the bookmark edit dialog to make it easier to recognize a particular site at a glance. The icon must be a single Unicode character. It will appear in the bookmark list, tab titles, feed entry list, quick search results, and page top banners.

### 1.4.1 Folders

Press Shift+N to create a new bookmark folder. Newly added folders appear in the bottom of the bookmark list.

You can drag and drop bookmarks in and out of folders. Folders can also be nested inside each other. Clicking on a folder heading will toggle its fold state, either hiding or showing its contents. The fold state is remembered across sessions.

You can open all the bookmarks inside a folder in new tabs using the sidebar context menu (right-click on a folder). A new tab is instantly created for each bookmark, including ones in nested subfolders. However, the bookmarked pages will load sequentially to avoid excessive network traffic.

### 1.4.2 Sharing and batch importing

=> about:bookmarks The special page "about:bookmarks" is used for listing bookmarks in various ways.
It has three different modes that can be opened via menus:

* listing bookmarks alphabetically
* listing bookmarks grouped by tag
* listing bookmarks as a feed with creation dates

The generated page can be saved to Downloads or you can copy all or parts of it to the clipboard. For example, you can then use these listings to share public bookmarks on your capsule.

To import all links on a page as bookmarks, use the page context menu to select "Tools > Import Links as Bookmarks...". You can also right-click on individual links and select "Bookmark Link...".

Importing links on a page will not cause any folders to be (re)created. To fully export and import your bookmarks, tags, custom icons, and folders, see section 1.12.

### 1.4.3 Remote bookmarks

This version of Lagrange does not support automatic bookmark synchronization. By default all bookmarks are stored locally. However, a remote bookmarks feature is provided to allow accessing a set of bookmarks from everywhere. This way you can set up your own centralized bookmark pages or use any public Gemini page as a source of bookmarks.

A local bookmark can be turned into a source of remote bookmarks via the Bookmarks context menu. Right-click the bookmark and select "Use as Remote Source". The ⤓ icon is used to indicate remote items in the Bookmarks list. Remote sources are checked when launching Lagrange and manually with the "Refresh Remote Sources" menu item.

All links found in the remote sources become remote bookmarks and are included in the Bookmarks list. If a URL is already bookmarked locally, any remote bookmarks with a matching URL are not shown.

Note that remote bookmarks are read-only: they cannot be edited or tagged. This means you cannot subscribe to a remote bookmark without first making a local duplicate of it. If you want to make local copies of all the links in the remote source, open the remote source page and use the "Import Links as Bookmarks..." context menu item on it. After refreshing remote sources, the remote copies of the bookmarks will not be shown any more.

### 1.4.4 Behavioral tags

Bookmarks may use a number of special tags that control their behavior. In practice, these are stored in the bookmarks.ini "tags" entries, but are hidden from the Tags field in the app UI.

* A ".homepage" tag makes a bookmark one of the pages that will be opened when pressing the 🏠 button. If multiple bookmarks are tagged as homepages, a random one is selected.
* A ".subscribed" tag means that Lagrange will periodically fetch the bookmarked page and look for Gemini feed links. All the found links that match the required style ("YYYY-MM-DD Entry title") will appear in the Feeds sidebar tab.
* ".headings" can be used together with ".subscribed" to subscribe to new headings instead of Gemini feed links.
* ".ignoreweb" modifies a feed subscription to ignore all HTTP(S) URLs. This is useful if a feed contains both Gemini and web links, but you're only interested in the Gemini ones.
* The ".remotesource" tag marks the bookmark as a source of remote bookmarks. All links on the source pages are shown as remote bookmarks in the Bookmarks list.
* The ".remote" tag is used for remote bookmarks. These bookmarks cannot be edited or tagged, but you can make a local duplicate to turn it into a regular bookmark.
* The ".usericon" tag prevents a random icon to be selected for the bookmark. This tag is automatically applied when an icon character is entered in the bookmark editor.
* The ".linksplit" tag causes all links on the bookmarked page to open to the side, automatically enabling split view mode.

## 1.5 Subscribing to feeds

You may be familiar with XML-based RSS and Atom feeds from the web. The Gemini equivalent of these is Gemini feeds. A Gemini feed is simply a regular 'text/gemini' page that contains one or more links whose labels are formatted in a particular way. This makes it very easy to write pages that clients can subscribe to.
=> gemini://geminiprotocol.net/docs/companion/subscription.gmi See "Subscribing to Gemini pages" for more information.

Lagrange supports Gemini and Atom feed subscriptions. Atom feeds are automatically translated to the Gemini feed format so they can be viewed and subscribed to like a normal 'text/gemini' page. RSS feeds are not supported.

Subscriptions are managed via bookmarks. When you subscribe to a feed page, a bookmark is created and the special ".subscribed" tag is applied on it. In the Bookmarks list, this is indicated by a ★ icon. There is no other difference between normal bookmarks and feed subscriptions — you may tag any bookmark as a subscription and Lagrange will look through it for feed-style links. The bookmark title is used as the feed title. This defaults to the top heading of the feed index page, but you can edit it to suit your needs.

Feeds are refreshed periodically while Lagrange is running, and also immediately after launching if it has been a while since the previous refresh. You may also manually refresh all feeds via the menus or by pressing Shift+Ctrl+R.

The Feeds sidebar tab displays recent feed entries. From there you can open entries and mark them as read/unread.

To see a list of all entries from all feeds, open the "Feed entries" page. This page also shows how long has it been since the previous feed refresh.
=> about:feeds

## 1.6 Identities (client certificates)

Gemini uses TLS client certificates for user/session identification purposes. Unlike on the web where user identity tracking is covert and automatic, client certificates must be manually taken into use, and you are able to define how long each certificate remains valid. The term "Identity" is used in Lagrange to refer to client certificates.

The Identities sidebar tab shows all identities known to Lagrange. Press Ctrl+4 to show it. This includes identities created in Lagrange and any identities based on imported X.509 certificates.

### 1.6.1 Creating a new identity

Click on the 👤 button in the navigation bar and select "New Identity..." or "New Identity for Domain...". The shortcut for this is Shift+Ctrl+N.

Consider any information you enter in the certificate as public — only the Common Name is required to be non-empty. The generated certificate will use the Common Name as the issuer and subject of the certificate, making it clear that the certificate is self-signed. The other required field is the expiration date in "Valid until". Entering a year is sufficient, and means that the certificate is valid until the end of that year.

The "Temporary" option prevents the identity from being saved persistently — it will be deleted as soon as you quit Lagrange. Otherwise, the certificate and its private key are written to .crt and .pem files.

### 1.6.2 Using an identity

You will need to select an identity when you encounter this error message:

> 🔑 Certificate Required

Clicking on an identity in the sidebar shows a menu where you can control usage of the identity for the currently open URL. On subsequent page loads, the certificate will then be sent to the server when the URL or any URL under it is fetched. You can click on the 👤 button in the navigation bar to see which identity is being used for the current page.

As the sidebar is not keyboard-navigable, note that identities can also be accessed via lookup results. Identities matching the search terms are shown as the last category in the lookup results list. From there, one can toggle an identity for the current page, or stop using it on all pages.

Identities may also be used by pinning one to a bookmark. Whenever the bookmark is then opened, the associated identity is taken into use. The identity also gets permanently "pinned" to the opened tab. This means that the tab keeps using the identity for all subsequent requests, but can only switch to URLs inside the same capsule. If a link leads elsewhere, that link gets opened in a new tab with no identity pinned. This way, one can navigate freely inside the capsule while keeping the identity in use, while not accidentally sending it to any other capsule, for example if you forget you are using an identity and manually enter some other capsule's URL. To end use of the identity, it has to be manually unpinned from the tab (via the Identity button in the navbar), or the tab has to be closed. Keeping the pinned identity tab-specific is also useful because then the same URL can be simultaneously opened with several different identities, in separate tabs.

### 1.6.3 Importing existing certificates

To import an existing X.509 certificate as an identity, press Shift+Ctrl+I or click on 👤 and select "Import..." (macOS: Identity menu → Import...).

When the Import Identity dialog opens, it checks the currently open page for any certificates and private keys in PEM format. If found, these are automatically loaded in. You can also press Ctrl+V to paste PEM-formatted certificates and/or private keys, or drag-and-drop a PEM-formatted .crt/.key files on the Lagrange window while the dialog is open.

Alternatively, you can manually copy the certificate files so Lagrange can find them. At launch, Lagrange looks through its "idents" directory to see if any new certificates have been copied there. (See "Runtime files" below for the location; it is platform-specific) The file format must be PEM. Both a certificate (.crt) and its private key (.key) must be found in "idents" and they must have matching file names. For example:
* mycert.crt
* mycert.key
Lagrange will add a note to the imported identities to mark them as "Imported".

Note that you can find the certificates of any exported identities inside a user data ZIP archive. See sections 1.12 and 6 for details.

## 1.7 Downloads

Press Ctrl+S to save the contents of the current page to the Downloads folder. This works on all pages regardless of whether Lagrange can display the contents or not.

When image or audio content is displayed inline, you can right-click on it and select "Save to Downloads" in the context menu.

The 🔃 button on the right side of the URL input field is the Reload/Stop button — it reloads the current page or stops an ongoing download. During large downloads, an additional progress indicator appears next to the Stop button.

The location where downloaded files are saved can be changed in Preferences. The default location is "Downloads" in your home directory.

## 1.8 Uploads (with Titan)

Titan is a sister protocol to Gemini that enables sending arbitrary amounts of data from a client to a server. The Gemini protocol itself only enables sending up to 1024 bytes of data in a request. Furthermore, the request URL also counts against that limit, and the sent data must be percent-encoded so it can be parsed as a valid URL. Consequently, Gemini clients can only send very limited amounts of data to a server. Titan solves this by expanding the request so that the request URL is followed by a payload field. When it comes to TLS, Titan is equivalent to Gemini, so the same server and client certificates can be used with both.

=> gemini://transjovian.org/titan Titan Protocol (by Alex Schroeder)

While Titan and Gemini are related, Titan is a separate protocol and regular Gemini servers are not expected to support it. Many services have no need to let clients upload large amounts of data, but it is useful for some specific cases. For example, a server that hosts a gemlog could enable Titan uploads for submitting new posts, or editing existing posts by uploading a revised version.

As far as Lagrange is concerned, Titan is just one of the supported URL schemes. Whenever you try to open a "titan://" URL, no matter if it is manually entered into the URL field, or by clicking on a link, opening a bookmark, feed entry, or via a redirect, a dialog will open where you can enter the data to upload:

* You can type text into the input field on the "Text" tab. It will be sent to the server using 'text/plain' as the media type.
* You can drag and drop a file on the dialog. The details of the file to be uploaded are visible on the "File" tab. The media type can be specified manually if Lagrange does not correctly detect it.

The upload token is a feature of Titan where servers can require a certain token text/passphrase for uploads. It is up to the server how this is interpreted. It could be used as a simple password, or even a command to further instruct the server about what to do with the uploaded data. Please refer to the server's instructions about what to enter here. The token may also be left empty.

Gemtext syntax highlighting is supported in the upload dialog's text field. You can toggle this feature in "Preferences > Appearance". By default, Lagrange comes with a single monospace font, so unless you install additional monospace weights/styles, the syntax highlighting will only use different colors for the Gemtext line types. You can install this fontpack to include bold and italic fonts for the highlighting:
=> gemini://skyjake.fi/fonts/mono/iosevka-term-extended.fontpack Iosevka Term Extended (7.6 MB)

The text entered into the upload dialog's main text field is protected against accidental closing of the dialog or the application, or a crash. The previous text is restored when the dialog is reopened. The text field contents are only cleared when the submitted Titan request has been successfully completed.

## 1.9 Split view mode

By default, only one tab is visible at a time in the application window. However, sometimes it is beneficial to see two pages at once. For example, many capsules have top-level menus or lists of articles, and keeping the menu/index visible on the side makes navigation less cumbersome.

Split view mode divides the UI into two equivalent parts. You can have multiple tabs open in each split. Closing all tabs on one side will remove the split and return back to the normal unsplit mode.

View splitting is primarily controlled using the view split menu. The default keybinding for showing it is Ctrl+J. For convenience it is recommended to use the shortcuts listed in the menu to change split modes. For example, the sequence Ctrl+J 2 can be used to quickly activate a 50% horizontal split, and Ctrl+J 1 will merge all open tabs back into the normal unsplit view.

Another way to activate split view mode is to click on a link while holding Shift.

Each split has its own sidebars, which means that in split view mode you can have a total of four sidebars open at the same time.

### 1.9.1 Switching focus

At any given time, one of the splits has keyboard focus. This is indicated by a colored line at the top of the section, and some UI elements will be dimmed out on the unfocused side.

To switch keyboard focus between the sections, you can use the Next/Previous Tab keybindings or Ctrl+Tab. Next/Previous Tab is particularly convenient as it cycles through all open tabs, jumping to the other side of the split when appropriate.

You may also press Tab to cycle input focus between all the URL input fields.

### 1.9.2 Pinning

While it is sometimes useful to simply have two independent browsers open side by side, by default view splitting is meant to assist in navigating hierarchies and lists. In the typical use case, you'll have a menu or an index page on the left, and a content page open on the right. Links clicked on the left will automatically open on the right.

This is called "pinning" and the behavior can be configured in Preferences. The "Split view pinning" setting on the "General" tab of Preferences controls where links get opened in a split view. There are three modes available:

* "None" causes links to open in the tab where the link is clicked. In this mode, both sides of the split can be navigated independently.
* "Left Tab" causes links clicked on the left tab to open on the right side. The page open in the left tab is therefore "pinned" and does not change unless you enter a new URL or navigate to the parent or root.
* "Right Tab" is the same but works the other way around. The page open in the right tab is pinned and clicked links open on the left.

The default pinning mode is "Left Tab".

The ◧ indicator is shown in the URL input field when the current tab is pinned.

## 1.10 Viewing local files and directories

"file://" URLs can be used for accessing local files and directories. File types known to Lagrange, such as .gmi, .txt., .png, .jpg, and .zip, can be viewed inside the application. In this release, types of local files are detected solely based on the file extension.

When viewing a directory, its contents are shown as a list of links. A similar page is shown when viewing a directory inside a ZIP archive.

Note that ZIP archives are not decompressed while browsing their directory structure. Each request that accesses a compressed file in an archive will cause only that particular file to be decompressed. This may cause slow response times when dealing with large compressed files.

## 1.11 Gempub

Gempub is an e-book/archival format that is essentially a set of Gemtext files stored in a ZIP archive.

=> https://codeberg.org/oppenlab/gempub Gempub specification

Lagrange can be used as a Gempub reader. When a .gpub file has been saved locally, you can open it in the application to see the book cover page. On the cover page you will find a link that opens the contents of the book. When clicked, split view mode is automatically enabled and both the book index page and the first chapter are shown (unless split view pinning has been disabled).

## 1.12 Input prompt

An input prompt dialog is shown when the server asks for input from the user. Typically, you would enter just a word or two, e.g., the search terms for a search engine. However, input prompts have a few advanced features that can help with more sophisticated use cases.

When entering a longer piece of text, it may help to scale the text a big larger. The font size can be changed with the keys bound to "Zoom In" and "Zoom Out". The width of the dialog can be resized by dragging the left or right edge with a mouse. Both the font size and the dialog width are saved persistently.

The behavior of the Return key can be switched between sending the input to the server and inserting a line break. This can be configured in "Preferences > UI".

The dialog has a context menu for additional functionality. Click on the Ellipsis (⋯) button to open it.

* "Paste Preceding Line" inserts the contents of the Gemtext source line that immediately precedes the link that caused the input prompt to open. This is sometimes used for "Edit" actions in Gemini applications.
* "Assume This URL Requires Input" modifies what happens when the prompt's URL is opened. Normally, it takes two requests to submit input: the first one causes the prompt to open, and the second one sends the user's input to the server. To make this more efficient, you can assume the URL requires input and Lagrange will prompt you automatically before sending anything to the server. (It is possible that some applications may expect the two requests to arrive in a sequence, however usually there are no problems submitting query strings directly.)
* Restoring past entries: The rest of the items in the menu are for input that has been submitted previously. Selecting one will cause it be inserted into the input field.

## 1.13 Export/import user data

The export/import feature allows one to manually export and import identities, bookmarks, text snippets, browsing history, and site-specific information via a ZIP archive.

"User Data > Export" can be found in the File menu or the hamburger menu. In practice, this creates a compressed archive that you can then save to the Downloads folder or open in an external application. From there, you can transfer the archive manually onto another device, or just put in a safe place for backup.

Opening the exported archive works similar to fontpacks (see section 2.4): when viewing the ZIP in the app, there is a button in the bottom of the window to import the contained data. Fine-grained controls are provided to choose which data gets imported and how, so you don't have to overwrite all the existing data.

Note that browsing history also contains the read status of feed entries, because those are tracked based on whether entry URLs have been visited. This means a transfer of user data includes the up-to-date status of each subscription as well.

There is no automatic sync service to share user data between multiple devices.

# 2 Customization

You can find a number of settings in Preferences to customize the user interface and page contents.

## 2.1 Browsing behavior

On the "General" tab, "Split view pinning" controls which tab links will be opened on when browsing in split view mode. The default mode is "Left Tab", which means that the page in the left tab is pinned (remains unchanged) when clicking on a link. For more information, see section 1.9.

On the "Content" tab, the "Open images in Data URLs" option determines if image data embedded into links using data URLs is automatically shown after the page has finished loading. This only applies to a handful of common image media types: JPEG, PNG, GIF, and WebP. Note that the maximum size of an URL has a limit, so these embedded images have to fit under the configured limit to be recognized as valid links. Image from data URLs are displayed as links' inline content, just like with any other URL scheme.

The "Open index.gmi in ZIP archives" option controls whether index.gmi pages are automatically opened while browsing the contents of a ZIP archive. The purpose is to simulate the behavior of a Gemini server where opening a directory will by default show its index page. Enabling this option makes navigating an archived copy of a capsule a more streamlined experience.

One important characteristic of Gemini is that you remain in control of what gets loaded and when. The browser will not suddenly fetch a ton of images, autoplay videos, or make surreptitious connections to any tracking servers — each network request is purposeful and manually triggered. With this in mind, the "Load next image on scroll key" option on the "UI" tab is provided to assist keyboard-only browsing and to facilitate a focused reading experience. When enabled, if there is an image link visible on the page and you press Space or ↓ (or whichever keys are bound to the scroll actions), it will be loaded and shown inline _instead_ of the view scrolling down. This allows you to read and see all the content of the page while only tapping on a single key on the keyboard.

## 2.2 UI appearance

There are four different color schemes for the UI: two for dark mode, and two for light mode. These can be selected on the "Appearance" tab of the Preferences dialog:

* Dark mode: "Black" and "Dark" have a fully black or dark gray UI.
* Light mode: "White" and "Light" have completety white or light gray UI.

On macOS, Lagrange will automatically switch between dark and light modes if the "Use system theme" setting is enabled. On other platforms you'll need to switch manually.

On Windows, an option is provided to use a custom window frame. This provides a more consistent visual style for the application. However, the custom frame overrides default behaviors of the window, so if you are a Windows power user expect it to not support all the special interactions. For example, when pressing the Windows+Left/Right key, the window is resized to take over one half of the screen. Normally, Windows would then prompt to select another window to fill the rest of the screen, but this does not happen with the custom window frame.

## 2.3 Page style and layout

The "Page Style" and "Page Layout" tabs of the Preferences dialog let you customize the appearance and arrangement of page contents.

### 2.3.1 Color themes

Page content color themes are selected on the "Page Style" tab of Preferences. The "Dark theme" is active in dark UI mode, and the "Light theme" is active in light UI mode.

* Colorful Dark: All elements of the page are colored; the background is dark and text is light. This mode provides the best visual distinction between different domains because more color combinations are available.
* Colorful Light: A single, bright background color with black text. This is the most colorful light theme. Note that colored backgrounds may reduce readability.
* Black: Gray body text and brightly colored headings on a black background.
* Gray: Slightly brighter version of Black, i.e., gray body text and colored headings on a gray background.
* White: Colored headings on a white background.
* Sepia: Light sepia background with black text. Does not change depending on domain; use this for readability if you prefer a sepia reading experience.
* Oceanic: Mostly teal/blue theme with a few orange/red accents. Brightness and saturation vary randomly based on domain.
* High Contrast: White background with black text. Does not change depending on domain; use this for readability if you prefer maximum contrast between text and the background.

The "Saturation" setting can be used to tone down the theme colors for a more neutral appearance.

### 2.3.2 Site-specific colors

You can manually customize the color theme of a site. Open "Page Information" and click on "Settings" to open the Site-Specific Settings dialog. The default keyboard shortcut for this is Shift+Ctrl+Comma.

The "Theme palette seed" is the input data given to the theme generator that determines a site's color palette. The theme generator is designed to algorithmically choose a palette whose colors go together. It is not possible to individually pick the colors of a theme.

You can enter any text as the palette seed. By default, the seed is the site's hostname, or a user name found in the URL path (e.g., "gemini://example.com/~User/" → seed "User"). Examples of how to use this:

* Enter a word or phrase, or just random characters, to find a theme that you like.
* To copy the theme of another site, enter the hostname of that site as the seed.

### 2.3.3 Text styling

The fonts for document headings, body text, and preformatted blocks can be chosen separately. There is also a separate font for monospaced body text that is used when the Gemini/Gopher-specific "Monospace body" option is enabled. See section 2.4 for more details about using fonts.

The "Bold links" option determines whether links use a bold font. Enabling "Visited" means that the bold font is used also for visited links, not just unvisited ones. "On Dark" and "On Light" enable bold links on a dark/light background. For readability, using bold fonts on a light background is recommended because differences in text color and link icon color are less noticeable.

### 2.3.4 Layout options

Paragraph layout options:

* Line width: This setting determines the maximum width for text lines. "Fill" disables the maximum limit and fits text lines to the full width of the window. (Shorter lines are generally easier to read.)
* Line spacing: Adjust spacing between text lines. A value of 1.1 would add 10% more space, while 2.0 would mean there is a full-height empty line between all text lines. For the best results, keep this pretty close to 1.0. (Values smaller than 1.0 may lead to visual artifacts as lines become overlapped.)
* Tab width: Number of spaces to use for tab stops.
* Justify: Paragraphs are justified when they at least three lines long. Spaces on each line are expanded to equalize line widths.
* Big 1st paragraph: When enabled, the leading paragraph on the page is shown in a slightly larger font. (The leading paragraph is autodetected by Lagrange, so it is not guaranteed to always be appropriately chosen.)

Other layout options:

* Quote indicator: Quoted text is shown in an italic font. Additionally, you can select between a quotation mark icon and the traditional vertical line along the left edge of the quote.
* Capsule icon on left side: When the window is wide enough, show the capsule icon on the left side of the page at a fixed position together with the current level 1 heading.
* Collapse preformatted: After loading a page, immediately hide all preformatted blocks, showing only the alt texts.

## 2.4 Fonts

This version of Lagrange supports TrueType fonts. To use a new font, simply view a .ttf file in the app and a page footer action is available for performing the installation. For example, try drag-and-dropping a .ttf file on the window. Alternatively, you can manually copy the font to the "fonts" subdirectory of the user-specific configuration directory (see section 3.5).

The "Page Style" tab of the Preferences dialog contains options that affect the appearance of text in page content. The user interface font can be changed in the "Appearance" tab, along with other text renderer settings.

To be precise, on the "Page Style" tab you can select which _typefaces_ to use for certain elements of the page; picking a particular font (including its size, weight, style, etc.) for specific elements is not possible. Lagrange controls the size and styling of text by choosing fonts according to your theme and typeface preferences. The term "font" is often used to mean "typeface" in this document and in the app UI.

There are three built-in fonts available:

* "Roboto" is the default UI font that is also used for page content.
* "Source Sans" is the previous default font. It has more personality than Roboto, but rarely matches the system fonts.
* "Iosevka" is the monospaced font.

There is also an "Iosevka (compact)" variant that actually uses the font's original line spacing. It is the default for preformatted blocks to avoid gaps between lines of ASCII art, but not for body text for better legibility.

See sections 2.4.4 and 5 for more details about font management, compatibility, and configuration.

### 2.4.1 Monospace body

The "Monospace body" option causes all pages to be displayed in a monospace font. For example, most Gopher content has been written with the assumption of a monospace font, so it may provide a better reading experience to enable this for Gopher pages. The selected "Monospace font" is applied to the entire document.

Handling of whitespace in page content also changes when this option is enabled: spaces are no longer normalized so if the source uses multiple spaces somewhere, those are shown as-is.

### 2.4.2 ANSI escapes

=> https://en.wikipedia.org/wiki/ANSI_escape_code ANSI escape code (Wikipedia):
> ANSI escape sequences are a standard for in-band signaling to control cursor location, color, font styling, and other options on video text terminals and terminal emulators.

Sometimes these codes are used for things like colored ASCII art. However, Lagrange is not a terminal emulator so only a very minimal set of codes have any effect; the rest are ignored.

The "ANSI escapes" setting controls which ANSI escape codes are enabled:

* "FG Color" enables changes to text foreground color.
* "BG Color" enables changes to text background color.
* "Font Style" enables changing the font style: bold, light, italic, regular, or monospace. (These correspond to codes 1, 2, 3, 10, and 11.)

A warning banner is displayed if any codes are detected on a page. This helps you be aware of potential visual artifacts, like text color that is being forced to black regardless of the page background color. Click on the warning to dismiss it on a per-site basis.

If you serve content via Gemini, please be aware that ANSI escapes may not be supported by clients, and may in fact disrupt the behavior of a client in unexpected ways. For instance, consider a screen reader or a web proxy that doesn't filter out the codes. Only employ ANSI escapes when the user has somehow indicated that is their preference.

### 2.4.3 Other font options

On the "Content" tab, the "Font glyph warnings" option controls whether a warning will be shown when a page is missing one or more characters. This is typically due to the page being in a language that is not covered by any of the installed fonts. Clicking on the glyph warning banner opens the font management page.

On the "Appearance" tab, "Font smoothing" enables or disables glyph antialiasing. In this version, it is recommended that smoothing is always enabled. This is because the text renderer does not support hinting of any kind, which means that without smoothing, glyph shapes will be severely distorted. You may still want to try disabling this option if antialiasing causes eye strain for you, or you are using a special font that is designed to not be smoothed.

### 2.4.4 Managing fonts

Open "about:fonts" to see all the installed fonts, and enable, disable or uninstall individual fontpacks. At the top of the page, there is a link to the skyjake.fi Font Library that contains a curated collection of fontpacks that can be freely distributed. From there you can conveniently install more fonts specifically tuned for Lagrange.

The rest of the page is divided to two sections: enabled and disabled fontpacks. Individual packs can be disabled, so they remain installed but not in use. (Tip: Use the Outline sidebar to see a list of all packs, if there are many.)

Click on the "View file" links to see what each fontpack contains. The fontpack format is described in section 5: it is simply a ZIP archive with some metadata and a bunch of font files. When you install a TrueType font (i.e., copy it to the user's fonts directory), it is treated as a fontpack containing a single file, although no ZIP archive is created for it. Use the "View fontpack.ini template" link to see the generated metadata that can be used as a basis for creating an actual fontpack.

There are multiple locations where Lagrange looks for fontpacks at launch:

* Directory containing the app binary (BIN_DIR)
* (BIN_DIR)/fonts
* (BIN_DIR)/../share/lagrange
* (BIN_DIR)/../../share/lagrange
* macOS: Lagrange.app/Contents/Resources
* User configuration directory (CFG_DIR; see section 3.5)
* (CFG_DIR)/fonts

Individual TrueType fonts are automatically loaded only from the last one, (CFG_DIR)/fonts.

If a "fonts.ini" file is present in the user configuration directory, it will be loaded as fontpack metadata (see section 5). This way you can manually configure fonts without creating a ZIP archive. For example:

```fonts.ini example
[couriercode]
name = "Courier Code"
regular = "/home/jaakko/Fonts/Courier Code/CourierCode-Roman.ttf"
glyphscale = 0.85
monospace = true
```

About compatibility: fonts are complex, and while the TrueType format is not the most advanced one, it still has features that are not supported in Lagrange. The technical reason is that glyphs are rasterized using stb_truetype, a rather simple TrueType font library. (It's nice and small, though.) You may find that some fonts simply fail to load correctly, or look wrong in the app.

* Hinting is not supported.
* Bitmap glyphs are not supported.
* Multi-color glyphs are not supported.

TrueType Collections (.ttc) can be used, with the restriction that each declared font uses a single index from the collection. The index must be appended to the file name:
```.ttc example
regular = "NotoSansCJK-Regular.ttc:2"
```

## 2.5 Text snippets and custom queries

Gemlogs are often written entirely manually, so you may find yourself typing or copy-pasting the same headers, footers, or other small snippets into each post. You may also need to repeatedly enter specific pieces of text in a game or another interactive capsule. On desktop operating systems, there are multiple existing utilities that facilitate these use cases. While you may be able to use these with Lagrange, the app also has a built-in text snippet manager that works on any platform.

In "Preferences > Snippets", you can define a set of text snippets that can be pasted into any input field via the field's context menu. Snippets can also be created by right-clicking on a link or selected text on a page.

Text snippets whose name begins with an exclamation point ("bang") have a special meaning: they are used for additional search query URLs. For example, if the snippet "!w" is defined as "gemini://gemi.dev/cgi-bin/wp.cgi/search", you can then enter the following in the navbar URL field to make a search on Gemipedia:
```
!w Gemini Protocol
```
The additional words following the "!w" bang snippet are appended as a query string to the URL expanded from the snippet. This way, you can configure any number of searches or other shortcuts that take input. Bang snippet names can be longer than a single character but they cannot contain spaces.

The keybinding Shift+1 ("Enter a snippet query") focuses the URL field and inserts the leading '!' character so you can save a few keystrokes when using query snippets.

## 2.6 Proxies

Gemini allows relaying requests via a proxy server. On the "Network" tab, you can configure proxy servers for Gemini, Gopher, and HTTP/HTTPS requests.

When an HTTP proxy server is configured, HTTP/HTTPS links will no longer open in the system's default web browser but will be loaded via the proxy, expecting it to serve a 'text/gemini' version of the link contents.

## 2.7 URL handling

The "Network" tab of Preferences has a few options related to handling URLs.

Enabling the "Decode URLs" option causes all percent-encoded URLs to be shown in decoded form in the UI. Enabling this option is useful when encountering URLs that contain characters outside the basic Latin (A-Z) alphabet. This does not affect what gets sent to a server when loading pages: Gemini requests are always required to be sent in encoded form.

The "Maximum URL size" setting defines what is considered a valid link in Gemtext. Link lines with URLs longer than this are not considered to be links and are displayed like regular text lines. This only affects links that don't use the "gemini" scheme. The maximum size of a Gemini URL is 1024 bytes.

Having a length limit is necessary due the special case of Data URLs:
=> https://datatracker.ietf.org/doc/html/rfc2397 RFC 2397: The "data" URL scheme
With Data URLs, one is able to embed arbitrary data into a Gemtext file using link lines. This makes it possible to circumvent the intentional limitations of Gemini and override the clients' ability to choose which linked resources should be loaded and when. Without a limit, a server could for example send an arbitrarily large image attachment as part of the page, with no regard to the user's or client's preferences or abilities to view images. Also note that like any non-Gemini scheme, "data" is not expected to be supported by Gemini clients.

## 2.8 Keybindings

The "Keys" tab lets you change which keys are bound to UI commands. Click on an item with the mouse and then press the new key combination that you want bound to it. Right-click on a binding to erase it or reset it to the default.

Erasing a binding can be useful to disable certain features. For example, if you have no use for keyboard navigation of links via a modifier key, that binding can be erased and use of the modifier key for other purposes will no longer distract you by showing the link shortcuts.

To reset all bindings to their defaults, quit Lagrange and delete the "bindings.txt" file in Lagrange's runtime directory. This is a platform-dependent location; see below for more information (under "Runtime files").

## 2.9 Gopher

Lagrange converts Gopher menus to Gemtext for presentation. There are a couple of settings that control the conversion.

On the "Content" tab, the "Autodetect Gopher menu styling" option controls whether Gopher menus should use autodetected Gemtext styling. By default, the app's Gopher experience mimics that of Gemini, where preformatted ASCII art is in separate blocks and paragraph text has its own (variable-width) font. However, the autodetection does not always get it right. Menus with meticulously crafted ASCII may sometimes be misinterpreted. Disabling the style autodetection makes all text lines equal in appearance.

Enabling monospace body text for Gopher (in the "Page Style" tab) will faithfully present the Gopher source text, with original whitespaces intact, while also using the chosen monospace font for all text.

# 3 OS integration

## 3.1 Command line options

Here are some of the commonly needed command line options. Check the "lagrange.1" manual page or the output of --help for a more complete listing.

### URLs/paths
URLs and file paths on the command line are opened after Lagrange has launched. If more than one URL is given, multiple tabs will be opened. For example:
```
$ lagrange gemini://geminiprotocol.net/
```

### --dump
Instead of opening the GUI, fetch each of the URLs/paths specified on the command line and print them to stdout. Metadata about the response will be printed to stderr.

### -E, --echo
Debugging utility: internal events are printed to stdout.

### --help
Print a list of all the available options.

### --sw
Disable hardware accelerated graphics. Note that software rendering is anyway used as a fallback, so usually this option should not be necessary.

### -V, --version
Print the application version.

## 3.2 Opening Gemini links

On macOS and Windows, Lagrange registers itself as a "gemini" URL scheme handler, so you can click on Gemini links in any application to open Lagrange with that URL.

Likewise (on macOS), .gmi/.gemini file extensions are registered as file formats that Lagrange can view so Finder will know how to open those automatically using Lagrange.

## 3.3 Drag and drop

You can drag and drop .gmi files on the Lagrange window to open them in the current tab. Dropping multiple files opens them in separate tabs. This is the recommended way to view local files, because there is no "Open File" menu item. You may also type "file://" URLs in the URL field.

## 3.4 Controlling a running instance

Only one instance of the application is allowed to run at once. This is because each instance uses the same runtime files (section 3.5) without any synchronization. A second instance of the application would overwrite any changes made by the first one, leading to lost bookmarks and other state.

If there already is a running instance you can still use the command line to interact with it: you can open and close tabs, change the currently open URL, or list all the open URLs. See --help for a list of the available options.

## 3.5 Runtime files

The location of user data files can be changed with the --user option. By default, Lagrange stores user-specific persistent files in one of the following locations (depending on the operating system):

```Location of user-specific files on different operating systems (table)
Windows : C:\Users\Name\AppData\Roaming\fi.skyjake.Lagrange
macOS : ~/Library/Application Support/fi.skyjake.Lagrange/
Other Unix : ~/.config/lagrange/
```

### bindings.txt
Each line specifies one keybinding:
> {binding-id} {keycode} {flags}
* Binding IDs are defined in src/ui/keys.c.
* Keycode is one of the SDLK constants from SDL (hexadecimal).
* Flags specifies the modifier keys:
```Table of modifier key flags
s : Shift
a : Alt
c : Ctrl
g : Gui (Windows/Command/Meta key)
k : Caps Lock
```

### bookmarks.ini
This file stores all bookmarks and bookmark folders. The format is a subset of TOML: the only supported value types are strings and integers.
```Example bookmark
[51]
url = "gemini://geminiprotocol.net/"
title = "Project Gemini"
tags = ""
icon = 0x264a
created = 1609936844 # 2021-01-06
parent = 99
order = 288
```
* The table name (51) is the unique identifier of the bookmark.
* "url", "title", and "tags" are used as-is. C-style backslash escapes must be used for quotes (for example: \"), and may optionally be used for Unicode characters as well.
* "icon" is a UTF-32 codepoint as a hexadecimal number.
* "created" is a UNIX timestamp for when the bookmark was created. Following the timestamp, a human-readable date is also provided but it is just a comment — that part will be ignored when parsing the file.
* "parent" is the ID of the parent folder. Folders are stored as similar bookmark entries, but their URL value is always an empty string.
* "order" is for sorting the bookmarks list. The list is sorted by ascending order. This value is updated automatically when bookmarks are reordered in the sidebar.

### feeds.txt
Cached state of feed subscriptions. The file may be deleted while the application is not running to force a reset of feed contents. Subscriptions themselves are tracked via bookmark tags so deleting the file does not affect which pages are subscribed.

The file has three sections. The first one is simply a UNIX timestamp indicating when feeds were last refreshed. The second section begins after the comment:
```
# Feeds
```
In this section, each line identifies a subscription so it can be referenced in the feed entries:
> {feed-id} {feed-url}
* The feed ID a hexadecimal number and always eight characters long.

The third section contains all the discovered feed entries. It begins after the comment:
```
# Entries
```
Each feed entry consists of five consecutive lines:
> {feed-id}
> {posted-time}
> {discovery-time}
> {url}
> {title}
* The feed ID is one of the identifiers from the Feeds section (without zeroes for padding).
* The posted time is a UNIX timestamp that specifies when the entry was posted. This is determined from the "YYYY-MM-DD" date found on the link line. If this is a "new headings" subscription, the posted time and the discovery time are the same.
* The discovery time is a UNIX timestamp that marks when the entry was added to the cache.

### fonts.ini
This file is loaded as fontpack metadata (see section 5). It must be manually created.

### idents.lgr and idents/
idents.lgr is a binary file that contains metadata about the client certificates known to the application, for example on which URLs a particular certificate should be active.

The "idents" subdirectory is where the actual client certificates are stored. Each certificate comprises a .crt and a .key file in PEM format. Certificates generated inside the application use the certificate fingerprint as the file name.

### modmap.txt
Translation table for keyboard modifiers. For example, one could swap the Alt and Ctrl keys by changing their mappings. See the comment in the file that explains the format and usage.

### mimehooks.txt
See section 4.

### palette.txt
Palette for UI color themes. This configuration file does not exist by default and must be created manually.

The actual colors used in the user interface are derived from the base palette. Therefore, you should not change the colors too drastically, but instead follow the expected pattern: a range of 5 intensities (black-white), followed by two accent color pairs (dim, bright). The last five colors are reserved for certain specific uses, e.g., the green is used for the navbar lock icon to indicate a trusted server certificate. The palettes defined here do not affect page color themes, only the UI. Note that link icons are considered part of the UI, so you may find that changing the palette will reduce visibility of the icons with some of the page color themes.

The file specifies two palettes: one for dark mode and one for light mode. The current palette is selected with the lines:
```
# Dark
```
and
```
# Light
```

The other lines specify colors:
> {label}: {rgb-hex}
> {label}: {red} {green} {blue}
* {rgb-hex} must use the form "#RRGGBB"
* {red}, {green}, {blue} are decimal numbers in the range 0...255

The configuration below defines the built-in default palette:
```palette.txt with the default UI palette
# Dark

black: #000000
gray25: #282828
gray50: #505050
gray75: #A0A0A0
white: #FFFFFF
brown: 106 80 0
orange: 255 192 0
teal: 0 96 128
cyan: 0 192 255
yellow: 255 255 32
red: 255 64 64
magenta: 255 0 255
blue: 132 132 255
green: 0 200 0

# Light

black: 0 0 0
gray25: 75 75 75
gray50: 150 150 150
gray75: 235 235 235
white: 255 255 255
brown: 210 120 10
orange: 235 215 200
teal: 10 110 130
cyan: 170 215 220
yellow: 255 255 32
red: 255 64 64
magenta: 255 0 255
blue: 132 132 255
green: 0 150 0
```

### prefs.cfg
Persistent configuration variables. The file is rewritten when the application is closed. Each line is interpreted as an internal UI event like those printed with the --echo command line option.

### state.lgr
A binary file that contains the current state of the application: open tabs and their scroll positions, and navigation history with cached page content (up to the configured cache limit). You may delete this file when the application is not running to close all tabs and clear the page content cache.

### sitespec.ini
Site-specific settings.

### trusted.2.txt
Trusted server certificates. Each line specifies the certificate fingerprint of one server:
> {domain};{port} {valid-until} {fingerprint}
* Domain names are stored in punycode format if they contain non-ASCII characters.
* The "valid until" expiration date is a UNIX timestamp.
* The fingerprint is an SHA256 checksum of the server certificate's public key in DER format.

### uploadbackup.txt
Backup of the text entered into the Upload with Titan dialog.

### uploadtoken.txt
Backup of the server token.

### visited.2.txt
The combined navigation history of all tabs. Each line specifies one URL:
> {last-visited} {flags} {url}
* The last visited time is stored as a UNIX timestamp.
* Flags is always four bytes long:
```URL flags (table)
0000 : No flags set
0001 : Transient
0002 : Kept
```
The Transient flag is used to indicate redirections and for marking feed entries as read without actually visiting the URL. URLs with the Transient flag do not appear in the History sidebar tab.

The Kept flag is used for preventing the URL from being discarded due to old age. Normally URLs in the navigation history become stale after several months and are removed from the file.

## 3.6 Environment variables

### LAGRANGE_OVERRIDE_DPI
Override display DPI detection with a user-provided value. The same value is applied to all displays. This is useful if your display's DPI value is not being detected correctly. Example:
```96 is the default DPI value
LAGRANGE_OVERRIDE_DPI=96
```

# 4 MIME hooks

MIME hooks enable piping Gemini responses through external programs for arbitrary processing. This allows leveraging scripting languages and binary executables to perform format conversions, content transformation, and data analysis.

Hooks are configured using the file "mimehooks.txt" in Lagrange's config directory. Each hook has a regexp that is matched against the response MIME type and parameters, and each matching hook is offered the response body via stdin. The called external programs are free to rewrite the entire response, including the MIME type. If one of the hooks returns a valid response, it is used as the final response of the Gemini request.

Example use cases:
* Parsing an Atom XML feed and generating a Gemini feed index page
* Rendering a MIDI file using Timidity as PCM WAV
* Generate a graph PNG based on values in a CSV
* Converting HTML or Markdown to 'text/gemini'
* Language translations

## 4.1 Interface

When a hook is called, it is given the MIME type and parameters via command line arguments. The response body is provided via stdin. The request's URL is available in the REQUEST_URL environment variable.

The MIME type and parameters are split at semicolons, so "text/gemini; lang=ja" would be called as:
```
hookprogram text/gemini lang=ja
```

Output from the program (via stdout) must be a valid "20" Gemini response that includes the new MIME type:
```
20 text/gemini; lang=en\r\n
{...body...}
```

Any output that does not follow this format is considered to mean that the hook refused to process the contents. The next hook will be offered the response instead.

## 4.2 mimehooks.txt syntax

Like other Lagrange configuration lines, mimehooks.txt has a simple line-oriented syntax. Lagrange must be restarted for changes to the configuration file to take effect.

Each hook is specified as three lines:
* A human-readable label (for reporting to the user)
* MIME type/parameter regular expression
* Command to execute, plus additional arguments each separated with semicolons

For example:
```mimehooks.txt
Convert Atom to Gemini feed
application/xml
/usr/bin/python3;/home/jaakko/atomconv.py
```

The hook program is executed directly without involving the shell. This means scripts must be invoked via the interpreter executable.

## 4.3 Example: Converting from Atom to Gemini

The following simple Python script demonstrates how a MIME hook could be used to parse an Atom XML document using Python 3 and output a Gemini feed index page based on the parsed entries. This is just a simple example; a more robust script could include more content from the Atom feed and handle errors, too.
```python
import sys
import xml.etree.ElementTree as ET

def atomtag(n):
return '{http://www.w3.org/2005/Atom}' + n

root = ET.fromstring(sys.stdin.read())
if root.tag != atomtag('feed'):
sys.exit(0)
feed_title = ''
feed_author = ''
feed_entries = []
for child in root:
if child.tag == atomtag('title'):
feed_title = child.text
elif child.tag == atomtag('entry'):
feed_entries.append(child)
print("20 text/gemini\r")
print(f'# {feed_title}')
for entry in feed_entries:
entry_date = ''
entry_title = ''
entry_link = ''
for child in entry:
if child.tag == atomtag('updated'):
entry_date = child.text[:10]
elif child.tag == atomtag('title'):
entry_title = child.text
elif child.tag == atomtag('link'):
entry_link = child.attrib['href']
print(f'=> {entry_link} {entry_date} {entry_title}')
```

# 5 Fontpacks

Fontpack is a file format defined by Lagrange that is used to combine a set of font files with configuration metadata. The (unregistered) media type for .fontpack files is 'application/lagrange-fontpack+zip'.

A fontpack is a ZIP archive that must have a "fontpack.ini" file at the root level.

```fontpack.ini from firasans.fontpack
version = 1

[firasans]
name = "Fira Sans"
glyphscale = 0.85
regular = "FiraSans-Regular.ttf"
italic = "FiraSans-Italic.ttf"
light = "FiraSans-Light.ttf"
semibold = "FiraSans-SemiBold.ttf"
bold = "FiraSans-Bold.ttf"
```

Fontpacks may use the Deflate compression method, but that can slow down launching the app because each font must then be decompressed before loading. Therefore, it is recommended to use the -0 (--compression-method store) option when creating the archive. You may also find the -j (--junk-paths) option helpful if the current working directory is not the one where fontpack.ini is located.

Each fontpack has an ID that comes from the file name: the ID of "firasans.fontpack" would be "firasans". Space characters are not allowed in the ID.

Fontpacks are versioned, i.e., they have a version number in their metadata. This makes it possible to tell when a fontpack is an updated version of an existing one. The fontpack ID (file name) must remain the same, though, regardless of the version number.

The "fontpack.ini" file uses TOML syntax and can specify any number of typefaces. In the example above, the line `[firasans]` begins the definition of a typeface called "firasans". If the same typeface is found in multiple fontpacks, only the first one that gets loaded is used; the rest are ignored. Typeface IDs can be the same or different than fontpack IDs; they exist in different namespaces. The typeface ID is what is actually used in "prefs.cfg" to save your font preferences.

## 5.1 Fontpack properties

`version` defines the version number of the fontpack. It is a single integer, and if omitted, defaults to zero. It has no specific meaning except that larger values are considered newer versions.

## 5.2 Typeface properties

### 5.2.1 General
* `name` (string) is the human-readable name of the typeface. This is used in the Preferences dialog and elsewhere in the UI.

### 5.2.2 Prioritization and exclusion
The same character's glyph(s) may be found in several fonts, so a prioritization is applied to pick the most appropriate font. Font selection may also depend on the context, for example preformatted blocks must be displayed using monospace fonts. These properties control when and if the typeface will be used.

* `priority` (integer) defines a sort order for typefaces. The ones with the highest priority are checked first.
* `override` (bool): whether this typeface is always checked first before any other one, in any context. Only one typeface can use this flag.
* `monospace` (bool): is this a monospace typeface and therefore suitable for preformatted blocks and monospace body text.
* `auxiliary` (bool): if true, this typeface is not included in Preferences as a font choice, but is still checked for glyphs if other fonts do not provide them. Suitable for miscellaneous symbols or additional languages, for examples.
* `allowspace` (bool): if true, an auxiliary font's metrics for space characters are used. Sometimes symbol fonts have extra wide spaces, so for example a space next to an Emoji would be too wide. This has no effect for non-auxiliary typefaces.

### 5.2.3 Metrics
These properties can be used to modify the height and spacing of the font.

* `height` (float) is a multiplier to alter the height of the font. It can be at most 2.0, to double the height. This simply scales the font smaller or larger without altering spacing.
* `glyphscale` (float) scales glyphs smaller without changing the height of the font. The value must be 1.0 or smaller. In effect, this lets you increase the spacing between consecutive lines of text. It can be combined with `height` to keep glyphs the same size but just increase line spacing. For example, `glyphscale` 0.833 would counter the scaling caused by `height` 1.2, increasing line spacing by 1.2x.
* `voffset` (float) is multiplier applied to the vertical offset that normally centers scaled glyphs on the line. This allows fine-tuning where the baseline of scaled glyphs ends up. Setting this to 1.0 means that glyphs are vertically centered after scaling with `glyphscale`; 0.0 would disable the centering. Reasonable values are likely in the 0.5…1.5 range, depending on the amount of scaling.

Changing only the `glyphscale` property is the recommended way to alter line spacing. This makes it easier to mix and match fonts on a single line without having to deal with changes in text height. Compare your adjusted scaling to see if it looks suitable next to normal body text.

Each of these properties can be set separately for UI text and page content by using the prefixes `ui.` and `doc.`. For example, to only scale the font when used in the UI, set `ui.height` instead of `height`.

### 5.2.4 Font files
A single typeface can use up to five font files.

* `regular` (string): path of a font file for the regular style. A relative path means that the file is loaded from inside the fontpack archive. Absolute paths can be used to refer to files on the local system.
* `italic` (string): path of a font file for the italic style.
* `light` (string): path of a font file for the light weight.
* `semibold` (string): path of a font file for the semibold weight.
* `bold` (string): path of a font file for the bold weight.

Only the regular style is required. Undefined styles fall back to the closest available style. The same file path can be used in multiple styles; only one copy of the file will be loaded to memory.

When the path refers to a TrueType Collection (.ttc), the font index to use must be appended to the file name:
```.ttc example
regular = "NotoSansCJK-Regular.ttc:2"
```

# 6 User data archives

Lagrange user data archives are compressed ZIP archives that contain browsing history, identities, bookmarks, text snippets, site-specific settings, and/or trusted server certificate fingerprints.

An export archive largely mirrors the contents of the runtime directory (section 3.5). However, the "lagrange-export.ini" metadata file must also be present:

```lagrange-export.ini
# Lagrange user data exported on 2022-04-01 13:34
version = "1.12.0"
timestamp = 1648809264
```
* `version` (string): Version of the app that generated the archive.
* `timestamp` (integer): Time of generation as a UNIX timestamp.

# Open source licenses

=> about:license
“The ultimate test of a moral society is the kind of world it leaves to its children.” ~ Dietrich Bonhoeffer
User avatar
Atruepatriot
Posts: 12151
Joined: Tue Feb 25, 2020 11:55 am

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Atruepatriot »

In discussing off grid web platforms with Clayton I realized I need to explain a little more about how Gemini actually works. The Gemini is not the average chat/messaging/file sharing/Discord style app system. Gemini is actually a whole unique alternate independent "internet" of it's own. Like the current protocol public "Geminispace" eludes to, all it does is provide a unique web space to build or browse what you would like in that independent internet.

All it does is provide a way to build a whole privately served alternative web independent from the World Wide Web. If we were to build our own that is independent from the current public Geminispace, we would have to build the websites to fill that alternate internet. The protocol has several client options and server options that are available to use this alternative internet.

Serving up the personal websites within that internet is actually pretty easy. The servers are small and easy to use once installed, and the websites are tiny and minimal depending on what content you want to fill them up with. Text blogs are tiny, BBS/forum boards are a little larger because of more content to store, and something like an image gallery would be bigger because of the image file sizes.

But what kind of site and content you want to serve up is all up to you. You don't even have to serve anything if you like and just browse and interact with what others have served up in this alternative internet. But of course, more personal servers shared, the more content within the unique private internet. Sites can be read only or interactive like the search engines or community BBS forums. You can even make simple interactive game sites if you like.

So the protocol deserves to be thought of as an "internet" full of assorted personal websites, not a communication app like most others are. The "communication" comes later in BBS/forum websites that are created within that Geminiweb internet. Or on Blogs with interactive commenting. The current public Geminispace has Blogs, BBS/forums, directories of sites in the unique web, search engines for the unique web, image galleries, music sites, game sites, wikis, FAQs, Educational, file sites, Etc. Just like the internet the options are endless what kind of site can be created as one likes.

So if you choose to install a client like Lagrange with Gemini included it will simply be like installing a new browser to browse the internet. But it will be it's own independent internet built by users personally you will be browsing. You will not be installing a real time communication app like Discord or qTox or other similar.
“The ultimate test of a moral society is the kind of world it leaves to its children.” ~ Dietrich Bonhoeffer
User avatar
Atruepatriot
Posts: 12151
Joined: Tue Feb 25, 2020 11:55 am

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Atruepatriot »

Gemini protocol specification
## Speculative specification
v0.14.2, July 2nd 2020

This is an increasingly less rough sketch of an actual spec for Project Gemini. Although not finalised yet, further changes to the specification are likely to be relatively small. You can write code to this pseudo-specification and be confident that it probably won't become totally non-functional due to massive changes next week, but you are still urged to keep an eye on ongoing development of the protocol and make changes as required.

This is provided mostly so that people can quickly get up to speed on what I'm thinking without having to read lots and lots of old phlog posts and keep notes.

Feedback on any part of this is extremely welcome, please email solderpunk@posteo.net.

Gemini is a client-server protocol featuring request-response transactions, broadly similar to gopher or HTTP. Connections are closed at the end of a single transaction and cannot be reused. When Gemini is served over TCP/IP, servers should listen on port 1965 (the first manned Gemini mission, Gemini 3, flew in March '65). This is an unprivileged port, so it's very easy to run a server as a "nobody" user, even if e.g. the server is written in Go and so can't drop privileges in the traditional fashion.

## 1.1 Gemini transactions
There is one kind of Gemini transaction, roughly equivalent to a gopher request or a HTTP "GET" request. Transactions happen as follows:

C: Opens connection S: Accepts connection C/S: Complete TLS handshake (see section 4) C: Validates server certificate (see 4.2) C: Sends request (one CRLF terminated line) (see section 2) S: Sends response header (one CRLF terminated line), closes connection under non-success conditions (see 3.1 and 3.2) S: Sends response body (text or binary data) (see 3.3) S: Closes connection C: Handles response (see 3.4)

## 1.2 Gemini URI scheme
Resources hosted via Gemini are identified using URIs with the scheme "gemini". This scheme is syntactically compatible with the generic URI syntax defined in RFC 3986, but does not support all components of the generic syntax. In particular, the authority component is allowed and required, but its userinfo subcomponent is NOT allowed. The host subcomponent is required. The port subcomponent is optional, with a default value of 1965. The path, query and fragment components are allowed and have no special meanings beyond those defined by the generic syntax. Spaces in gemini URIs should be encoded as %20, not +.

Gemini requests are a single CRLF-terminated line with the following structure:

<URL><CR><LF>

<URL> is a UTF-8 encoded absolute URL, of maximum length 1024 bytes. If the scheme of the URL is not specified, a scheme of gemini:// is implied.

Sending an absolute URL instead of only a path or selector is effectively equivalent to building in a HTTP "Host" header. It permits virtual hosting of multiple Gemini domains on the same IP address. It also allows servers to optionally act as proxies. Including schemes other than gemini:// in requests allows servers to optionally act as protocol-translating gateways to e.g. fetch gopher resources over Gemini. Proxying is optional and the vast majority of servers are expected to only respond to requests for resources at their own domain(s).

Gemini response consist of a single CRLF-terminated header line, optionally followed by a response body.

## 3.1 Response headers
Gemini response headers look like this:

<STATUS><SPACE><META><CR><LF>

<STATUS> is a two-digit numeric status code, as described below in 3.2 and in Appendix 1.

<SPACE> is a single space character, i.e. the byte 0x20.

<META> is a UTF-8 encoded string of maximum length 1024 bytes, whose meaning is <STATUS> dependent.

<STATUS> and <META> are separated by a single space character.

If <STATUS> does not belong to the "SUCCESS" range of codes, then the server MUST close the connection after sending the header and MUST NOT send a response body.

If a server sends a <STATUS> which is not a two-digit number or a <META> which exceeds 1024 bytes in length, the client SHOULD close the connection and disregard the response header, informing the user of an error.

## 3.2 Status codes
Gemini uses two-digit numeric status codes. Related status codes share the same first digit. Importantly, the first digit of Gemini status codes do not group codes into vague categories like "client error" and "server error" as per HTTP. Instead, the first digit alone provides enough information for a client to determine how to handle the response. By design, it is possible to write a simple but feature complete client which only looks at the first digit. The second digit provides more fine-grained information, for unambiguous server logging, to allow writing comfier interactive clients which provide a slightly more streamlined user interface, and to allow writing more robust and intelligent automated clients like content aggregators, search engine crawlers, etc.

The first digit of a response code unambiguously places the response into one of six categories, which define the semantics of the <META> line.

### 3.2.1 1x (INPUT)
Status codes beginning with 1 are INPUT status codes, meaning:

The requested resource accepts a line of textual user input. The <META> line is a prompt which should be displayed to the user. The same resource should then be requested again with the user's input included as a query component. Queries are included in requests as per the usual generic URL definition in RFC3986, i.e. separated from the path by a ?. Reserved characters used in the user's input must be "percent-encoded" as per RFC3986, and space characters should also be percent-encoded.

### 3.2.2 2x (SUCCESS)
Status codes beginning with 2 are SUCCESS status codes, meaning:

The request was handled successfully and a response body will follow the response header. The <META> line is a MIME media type which applies to the response body.

### 3.2.3 3x (REDIRECT)
Status codes beginning with 3 are REDIRECT status codes, meaning:

The server is redirecting the client to a new location for the requested resource. There is no response body. <META> is a new URL for the requested resource. The URL may be absolute or relative. The redirect should be considered temporary, i.e. clients should continue to request the resource at the original address and should not performance convenience actions like automatically updating bookmarks. There is no response body.

### 3.2.4 4x (TEMPORARY FAILURE)
Status codes beginning with 4 are TEMPORARY FAILURE status codes, meaning:

The request has failed. There is no response body. The nature of the failure is temporary, i.e. an identical request MAY succeed in the future. The contents of <META> may provide additional information on the failure, and should be displayed to human users.

### 3.2.5 5x (PERMANENT FAILURE)
Status codes beginning with 5 are PERMANENT FAILURE status codes, meaning:

The request has failed. There is no response body. The nature of the failure is permanent, i.e. identical future requests will reliably fail for the same reason. The contents of <META> may provide additional information on the failure, and should be displayed to human users. Automatic clients such as aggregators or indexing crawlers should not repeat this request.

### 3.2.6 6x (CLIENT CERTIFICATE REQUIRED)
Status codes beginning with 6 are CLIENT CERTIFICATE REQUIRED status codes, meaning:

The requested resource requires a client certificate to access. If the request was made without a certificate, it should be repeated with one. If the request was made with a certificate, the server did not accept it and the request should be repeated with a different certificate. The contents of <META> (and/or the specific 6x code) may provide additional information on certificate requirements or the reason a certificate was rejected.

### 3.2.7 Notes
Note that for basic interactive clients for human use, errors 4 and 5 may be effectively handled identically, by simply displaying the contents of <META> under a heading of "ERROR". The temporary/permanent error distinction is primarily relevant to well-behaving automated clients. Basic clients may also choose not to support client-certificate authentication, in which case only four distinct status handling routines are required (for statuses beginning with 1, 2, 3 or a combined 4-or-5).

The full two-digit system is detailed in Appendix 1. Note that for each of the six valid first digits, a code with a second digit of zero corresponds is a generic status of that kind with no special semantics. This means that basic servers without any advanced functionality need only be able to return codes of 10, 20, 30, 40 or 50.

The Gemini status code system has been carefully designed so that the increased power (and correspondingly increased complexity) of the second digits is entirely "opt-in" on the part of both servers and clients.

## 3.3 Response bodies
Response bodies are just raw content, text or binary, ala gopher. There is no support for compression, chunking or any other kind of content or transfer encoding. The server closes the connection after the final byte, there is no "end of response" signal like gopher's lonely dot.

Response bodies only accompany responses whose header indicates a SUCCESS status (i.e. a status code whose first digit is 2). For such responses, <META> is a MIME media type as defined in RFC 2046.

Internet media types are registered with a canonical form. Content transferred via Gemini MUST be represented in the appropriate canonical form prior to its transmission except for "text" types, as defined in the next paragraph.

When in canonical form, media subtypes of the "text" type use CRLF as the text line break. Gemini relaxes this requirement and allows the transport of text media with plain LF alone (but NOT a plain CR alone) representing a line break when it is done consistently for an entire response body. Gemini clients MUST accept CRLF and bare LF as being representative of a line break in text media received via Gemini.

If a MIME type begins with "text/" and no charset is explicitly given, the charset should be assumed to be UTF-8. Compliant clients MUST support UTF-8-encoded text/* responses. Clients MAY optionally support other encodings. Clients receiving a response in a charset they cannot decode SHOULD gracefully inform the user what happened instead of displaying garbage.

If <META> is an empty string, the MIME type MUST default to "text/gemini; charset=utf-8". The text/gemini media type is defined in section 5.

## 3.4 Response body handling
Response handling by clients should be informed by the provided MIME type information. Gemini defines one MIME type of its own (text/gemini) whose handling is discussed below in section 5. In all other cases, clients should do "something sensible" based on the MIME type. Minimalistic clients might adopt a strategy of printing all other text/* responses to the screen without formatting and saving all non-text responses to the disk. Clients for unix systems may consult /etc/mailcap to find installed programs for handling non-text types.

Use of TLS for Gemini transactions is mandatory.

Use of the Server Name Indication (SNI) extension to TLS is also mandatory, to facilitate name-based virtual hosting.

## 4.1 Version requirements
Servers MUST use TLS version 1.2 or higher and SHOULD use TLS version 1.3 or higher. TLS 1.2 is reluctantly permitted for now to avoid drastically reducing the range of available implementation libraries. Hopefully TLS 1.3 or higher can be specced in the near future. Clients who wish to be "ahead of the curve MAY refuse to connect to servers using TLS version 1.2 or lower.

## 4.2 Server certificate validation
Clients can validate TLS connections however they like (including not at all) but the strongly RECOMMENDED approach is to implement a lightweight "TOFU" certificate-pinning system which treats self-signed certificates as first- class citizens. This greatly reduces TLS overhead on the network (only one cert needs to be sent, not a whole chain) and lowers the barrier to entry for setting up a Gemini site (no need to pay a CA or setup a Let's Encrypt cron job, just make a cert and go).

TOFU stands for "Trust On First Use" and is public-key security model similar to that used by OpenSSH. The first time a Gemini client connects to a server, it accepts whatever certificate it is presented. That certificate's fingerprint and expiry date are saved in a persistent database (like the .known_hosts file for SSH), associated with the server's hostname. On all subsequent connections to that hostname, the received certificate's fingerprint is computed and compared to the one in the database. If the certificate is not the one previously received, but the previous certificate's expiry date has not passed, the user is shown a warning, analogous to the one web browser users are shown when receiving a certificate without a signature chain leading to a trusted CA.

This model is by no means perfect, but it is not awful and is vastly superior to just accepting self-signed certificates unconditionally.

## 4.3 Client certificates
Although rarely seen on the web, TLS permits clients to identify themselves to servers using certificates, in exactly the same way that servers traditionally identify themselves to the client. Gemini includes the ability for servers to request in-band that a client repeats a request with a client certificate. This is a very flexible, highly secure but also very simple notion of client identity with several applications:

* Short-lived client certificates which are generated on demand and deleted immediately after use can be used as "session identifiers" to maintain server-side state for applications. In this role, client certificates act as a substitute for HTTP cookies, but unlike cookies they are generated voluntarily by the client, and once the client deletes a certificate and its matching key, the server cannot possibly "resurrect" the same value later (unlike so-called "super cookies").
* Long-lived client certificates can reliably identify a user to a multi-user application without the need for passwords which may be brute-forced. Even a stolen database table mapping certificate hashes to user identities is not a security risk, as rainbow tables for certificates are not feasible.
* Self-hosted, single-user applications can be easily and reliably secured in a manner familiar from OpenSSH: the user generates a self-signed certificate and adds its hash to a server-side list of permitted certificates, analogous to the .authorized_keys file for SSH).
Gemini requests will typically be made without a client certificate. If a requested resource requires a client certificate and one is not included in a request, the server can respond with a status code of 60, 61 or 62 (see Appendix 1 below for a description of all status codes related to client certificates). A client certificate which is generated or loaded in response to such a status code has its scope bound to the same hostname as the request URL and to all paths below the path of the request URL path. E.g. if a request for gemini://example.com/foo returns status 60 and the user chooses to generate a new client certificate in response to this, that same certificate should be used for subsequent requests to gemini://example.com/foo, gemini://example.com/foo/bar/, gemini://example.com/foo/bar/baz, etc., until such time as the user decides to delete the certificate or to temporarily deactivate it. Interactive clients for human users are strongly recommended to make such actions easy and to generally give users full control over the use of client certificates.

## 5.1 Overview
In the same sense that HTML is the "native" response format of HTTP and plain text is the native response format of gopher, Gemini defines its own native response format - though of course, thanks to the inclusion of a MIME type in the response header Gemini can be used to serve plain text, rich text, HTML, Markdown, LaTeX, etc.

Response bodies of type "text/gemini" are a kind of lightweight hypertext format, which takes inspiration from gophermaps and from Markdown. The format permits richer typographic possibilities than the plain text of Gopher, but remains extremely easy to parse. The format is line-oriented, and a satisfactory rendering can be achieved with a single pass of a document, processing each line independently. As per gopher, links can only be displayed one per line, encouraging neat, list-like structure.

Similar to how the two-digit Gemini status codes were designed so that simple clients can function correctly while ignoring the second digit, the text/gemini format has been designed so that simple clients can ignore the more advanced features and still remain very usable.

## 5.2 Parameters
As a subtype of the top-level media type "text", "text/gemini" inherits the "charset" parameter defined in RFC 2046. However, as noted in 3.3, the default value of "charset" is "UTF-8" for "text" content transferred via Gemini.

A single additional parameter specific to the "text/gemini" subtype is defined: the "lang" parameter. The value of "lang" denotes the natural language or language(s) in which the textual content of a "text/gemini" document is written. The presence of the "lang" parameter is optional. When the "lang" parameter is present, its interpretation is defined entirely by the client. For example, clients which use text-to-speech technology to make Gemini content accessible to visually impaired users may use the value of "lang" to achieve improve pronounciation of content. Clients which render text to a screen may use the value of "lang" to determine whether text should be displayed left-to-right or right-to-left. Simple clients for users who only read languages written left-to-right may simply ignore the value of "lang". When the "lang" parameter is not present, no default value should be assumed and clients which require some notion of a language in order to process the content (such as text-to-speech screen readers) should rely on user-input to determine how to proceed in the absence of a "lang" parameter.

Valid values for the "lang" parameter are comma-separated lists of one or more language tags as defined in RFC4646. For example:

* "text/gemini; lang=en" Denotes a text/gemini document written in English
* "text/gemini; lang=fr" Denotes a text/gemini document written in French
* "text/gemini; lang=en,fr" Denotes a text/gemini document written in a mixture of English and French
* "text/gemini; lang=de-CH" Denotes a text/gemini document written in Swiss German
* "text/gemini; lang=sr-Cyrl" Denotes a text/gemini document written in Serbian using the Cyrllic script
* "text/gemini; lang=zh-Hans-CN" Denotes a text/gemini document written in Chinese using the Simplified script as used in mainland China
## 5.3 Line-orientation
As mentioned, the text/gemini format is line-oriented. Each line of a text/gemini document has a single "line type". It is possible to unambiguously determine a line's type purely by inspecting its first three characters. A line's type determines the manner in which it should be presented to the user. Any details of presentation or rendering associated with a particular line type are strictly limited in scope to that individual line.

There are 7 different line types in total. However, a fully functional and specification compliant Gemini client need only recognise and handle 4 of them - these are the "core line types", (see 5.4). Advanced clients can also handle the additional "advanced line types" (see 5.5). Simple clients can treat all advanced line types as equivalent to one of the core line types and still offer an adequate user experience.

## 5.4 Core line types
The four core line types are:

### 5.4.1 Text lines
Text lines are the most fundamental line type - any line which does not match the definition of another line type defined below defaults to being a text line. The majority of lines in a typical text/gemini document will be text lines.

Text lines should be presented to the user, after being wrapped to the appropriate width for the client's viewport (see below). Text lines may be presented to the user in a visually pleasing manner for general reading, the precise meaning of which is at the client's discretion. For example, variable width fonts may be used, spacing may be normalised, with spaces between sentences being made wider than spacing between words, and other such typographical niceties may be applied. Clients may permit users to customise the appearance of text lines by altering the font, font size, text and background colour, etc. Authors should not expect to exercise any control over the precise rendering of their text lines, only of their actual textual content. Content such as ASCII art, computer source code, etc. which may appear incorrectly when treated as such should be enclosed between preformatting toggle lines (see 5.4.3).

Blank lines are instances of text lines and have no special meaning. They should be rendered individually as vertical blank space each time they occur. In this way they are analogous to <br/> tags in HTML. Consecutive blank lines should NOT be collapsed into a fewer blank lines. Note also that consecutive non-blank text lines do not form any kind of coherent unit or block such as a "paragraph": all text lines are independent entities.

Text lines which are longer than can fit on a client's display device SHOULD be "wrapped" to fit, i.e. long lines should be split (ideally at whitespace or at hyphens) into multiple consecutive lines of a device-appropriate width. This wrapping is applied to each line of text independently. Multiple consecutive lines which are shorter than the client's display device MUST NOT be combined into fewer, longer lines.

In order to take full advantage of this method of text formatting, authors of text/gemini content SHOULD avoid hard-wrapping to a specific fixed width, in contrast to the convention in Gopherspace where text is typically wrapped at 80 characters or fewer. Instead, text which should be displayed as a contiguous block should be written as a single long line. Most text editors can be configured to "soft-wrap", i.e. to write this kind of file while displaying the long lines wrapped at word boundaries to fit the author's display device.

Authors who insist on hard-wrapping their content MUST be aware that the content will display neatly on clients whose display device is as wide as the hard-wrapped length or wider, but will appear with irregular line widths on narrower clients.

### 5.4.2 Link lines
Lines beginning with the two characters "=>" are link lines, which have the following syntax:


```
=>[<whitespace>]<URL>[<whitespace><USER-FRIENDLY LINK NAME>]

```
where:

* <whitespace> is any non-zero number of consecutive spaces or tabs
* Square brackets indicate that the enclosed content is optional.
* <URL> is a URL, which may be absolute or relative. If the URL does not include a scheme, a scheme of gemini:// is implied.
All the following examples are valid link lines:


```
=> gemini://example.org/
=> gemini://example.org/ An example link
=> gemini://example.org/foo Another example link at the same host
=>gemini://example.org/bar Yet another example link at the same host
=> foo/bar/baz.txt A relative link
=> gopher://example.org:70/1 A gopher link

```
URLs in link lines must have reserved characters and spaces percent-encoded as per RFC 3986.

Note that link URLs may have schemes other than gemini://. This means that Gemini documents can simply and elegantly link to documents hosted via other protocols, unlike gophermaps which can only link to non-gopher content via a non-standard adaptation of the


```
h

```
item-type.

Clients can present links to users in whatever fashion the client author wishes, however clients MUST NOT automatically make any network connections as part of displaying links whose scheme corresponds to a network protocol (e.g. gemini://, gopher://, https://, ftp://, etc.).

### 5.4.3 Preformatting toggle lines
Any line whose first three characters are "```" (i.e. three consecutive back ticks with no leading whitespace) are preformatted toggle lines. These lines should NOT be included in the rendered output shown to the user. Instead, these lines toggle the parser between preformatted mode being "on" or "off". Preformatted mode should be "off" at the beginning of a document. The current status of preformatted mode is the only internal state a parser is required to maintain. When preformatted mode is "on", the usual rules for identifying line types are suspended, and all lines should be identified as preformatted text lines (see 5.4.4).

Preformatting toggle lines can be thought of as analogous to <pre> and </pre> tags in HTML.

Any text following the leading "```" of a preformat toggle line which toggles preformatted mode on MAY be interpreted by the client as "alt text" pertaining to the preformatted text lines which follow the toggle line. Use of alt text is at the client's discretion, and simple clients may ignore it. Alt text is recommended for ASCII art or similar non-textual content which, for example, cannot be meaningfully understood when rendered through a screen reader or usefully indexed by a search engine. Alt text may also be used for computer source code to identify the programming language which advanced clients may use for syntax highlighting.

Any text following the leading "```" of a preformat toggle line which toggles preformatted mode off MUST be ignored by clients.

### 5.4.4 Preformatted text lines
Preformatted text lines should be presented to the user in a "neutral", monowidth font without any alteration to whitespace or stylistic enhancements. Graphical clients should use scrolling mechanisms to present preformatted text lines which are longer than the client viewport, in preference to wrapping. In displaying preformatted text lines, clients should keep in mind applications like ASCII art and computer source code: in particular, source code in languages with significant whitespace (e.g. Python) should be able to be copied and pasted from the client into a file and interpreted/compiled without any problems arising from the client's manner of displaying them.

## 5.5 Advanced line types
The following advanced line types MAY be recognised by advanced clients. Simple clients may treat them all as text lines as per 5.4.1 without any loss of essential function.

### 5.5.1 Heading lines
Lines beginning with "#" are heading lines. Heading lines consist of one, two or three consecutive "#" characters, followed by optional whitespace, followed by heading text. The number of # characters indicates the "level" of header; #, ## and ### can be thought of as analogous to <h1>, <h2> and <h3> in HTML.

Heading text should be presented to the user, and clients MAY use special formatting, e.g. a larger or bold font, to indicate its status as a header (simple clients may simply print the line, including its leading #s, without any styling at all). However, the main motivation for the definition of heading lines is not stylistic but to provide a machine-readable representation of the internal structure of the document. Advanced clients can use this information to, e.g. display an automatically generated and hierarchically formatted "table of contents" for a long document in a side-pane, allowing users to easily jump to specific sections without excessive scrolling. CMS-style tools automatically generating menus or Atom/RSS feeds for a directory of text/gemini files can use first heading in the file as a human-friendly title.

### 5.5.2 Unordered list items
Lines beginning with "* " are unordered list items. This line type exists purely for stylistic reasons. The * may be replaced in advanced clients by a bullet symbol. Any text after the "* " should be presented to the user as if it were a text line, i.e. wrapped to fit the viewport and formatted "nicely". Advanced clients can take the space of the bullet symbol into account when wrapping long list items to ensure that all lines of text corresponding to the item are offset an equal distance from the left of the screen.

### 5.5.3 Quote lines
Lines beginning with ">" are quote lines. This line type exists so that advanced clients may use distinct styling to convey to readers the important semantic information that certain text is being quoted from an external source. For example, when wrapping long lines to the the viewport, each resultant line may have a ">" symbol placed at the front.

## 10 INPUT
As per definition of single-digit code 1 in 3.2.

## 11 SENSITIVE INPUT
As per status code 10, but for use with sensitive input such as passwords. Clients should present the prompt as per status code 10, but the user's input should not be echoed to the screen to prevent it being read by "shoulder surfers".

## 20 SUCCESS
As per definition of single-digit code 2 in 3.2.

## 30 REDIRECT - TEMPORARY
As per definition of single-digit code 3 in 3.2.

## 31 REDIRECT - PERMANENT
The requested resource should be consistently requested from the new URL provided in future. Tools like search engine indexers or content aggregators should update their configurations to avoid requesting the old URL, and end-user clients may automatically update bookmarks, etc. Note that clients which only pay attention to the initial digit of status codes will treat this as a temporary redirect. They will still end up at the right place, they just won't be able to make use of the knowledge that this redirect is permanent, so they'll pay a small performance penalty by having to follow the redirect each time.

## 40 TEMPORARY FAILURE
As per definition of single-digit code 4 in 3.2.

## 41 SERVER UNAVAILABLE
The server is unavailable due to overload or maintenance. (cf HTTP 503)

## 42 CGI ERROR
A CGI process, or similar system for generating dynamic content, died unexpectedly or timed out.

## 43 PROXY ERROR
A proxy request failed because the server was unable to successfully complete a transaction with the remote host. (cf HTTP 502, 504)

## 44 SLOW DOWN
Rate limiting is in effect. <META> is an integer number of seconds which the client must wait before another request is made to this server. (cf HTTP 429)

## 50 PERMANENT FAILURE
As per definition of single-digit code 5 in 3.2.

## 51 NOT FOUND
The requested resource could not be found but may be available in the future. (cf HTTP 404) (struggling to remember this important status code? Easy: you can't find things hidden at Area 51!)

## 52 GONE
The resource requested is no longer available and will not be available again. Search engines and similar tools should remove this resource from their indices. Content aggregators should stop requesting the resource and convey to their human users that the subscribed resource is gone. (cf HTTP 410)

## 53 PROXY REQUEST REFUSED
The request was for a resource at a domain not served by the server and the server does not accept proxy requests.

## 59 BAD REQUEST
The server was unable to parse the client's request, presumably due to a malformed request. (cf HTTP 400)

## 60 CLIENT CERTIFICATE REQUIRED
As per definition of single-digit code 6 in 3.2.

## 61 CERTIFICATE NOT AUTHORISED
The supplied client certificate is not authorised for accessing the particular requested resource. The problem is not with the certificate itself, which may be authorised for other resources.

## 62 CERTIFICATE NOT VALID
The supplied client certificate was not accepted because it is not valid. This indicates a problem with the certificate in and of itself, with no consideration of the particular requested resource. The most likely cause is that the certificate's validity start date is in the future or its expiry date has passed, but this code may also indicate an invalid signature, or a violation of a X509 standard requirements. The <META> should provide more information about the exact error.


## Generated from source URL:
=> https://gemini.circumlunar.space/docs/s ... ation.html
“The ultimate test of a moral society is the kind of world it leaves to its children.” ~ Dietrich Bonhoeffer
User avatar
Atruepatriot
Posts: 12151
Joined: Tue Feb 25, 2020 11:55 am

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Atruepatriot »

How do I write this when only GET like request is valid?

That's the question. how this text is published if gemini only supports get like requests and the request only contains the url.

=> /s/Gemini Posted in: s/Gemini
=> /u/norayr 🐙 norayr
Nov 19 · 1 day ago

## Actions
=> /comment/11835 💬 Comment
=> /like/11835 👍 Like
=> /react/11835 😄 React
=> /thanks/11835 🙏 Give thanks
=> 11835/more More...

=> /dashboard 🚀 Minko_Ikana: Dashboard

## 4 Comments ↑

=> /u/clseibold/11850 🚀 clseibold · 15 hours ago:
GET and POST don't directly correlate to Gemini because Gemini is not based off of HTTP. Gemini has request strings, and part of the request string can be a query, which is just information that you are sending to the server. So, I would say it's not equivalent to GET nor to POST.

I will relent that it's *almost* like GET in that it gets a response back, and that HTTP GET can also have a query string, but the similarities end there. HTTP GET requests can have a bunch of headers, and even whole payloads. Gemini requests don't use any of that.

=> /u/skyjake/11847 🚀 skyjake · 20 hours ago:
The URL still needs to be percent-encoded, so an arbitrary file must be really small to fit into 1024 bytes.

Yes, Titan is a better choice for uploading data to a server. It uses TLS just like Gemini, so it is encrypted. The server can define the maximum upload size limitation.

=> /u/norayr/11844 🐙 norayr · 21 hours ago:
or a file of size not more than 1024 bytes, right?
otherwise, if we upload bigger file or comment, that would go via titan?

titan is encrypted right?
does it have request size limitation?

=> /u/skyjake/11843 🚀 skyjake · Nov 19 at 06:06:
Gemini URLs can contain a query string. The server can interpret the query string however it wants, in this case it is the text that is being posted.

The requested URL can be up to 1024 bytes long in total, so that allows posting a couple of short paragraphs worth of text with a single request.
“The ultimate test of a moral society is the kind of world it leaves to its children.” ~ Dietrich Bonhoeffer
User avatar
Atruepatriot
Posts: 12151
Joined: Tue Feb 25, 2020 11:55 am

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Atruepatriot »

Atruepatriot wrote: Mon Nov 20, 2023 2:57 am How do I write this when only GET like request is valid?

That's the question. how this text is published if gemini only supports get like requests and the request only contains the url.

=> /s/Gemini Posted in: s/Gemini
=> /u/norayr 🐙 norayr
Nov 19 · 1 day ago

## Actions
=> /comment/11835 💬 Comment
=> /like/11835 👍 Like
=> /react/11835 😄 React
=> /thanks/11835 🙏 Give thanks
=> 11835/more More...

=> /dashboard 🚀 Minko_Ikana: Dashboard

## 4 Comments ↑

=> /u/clseibold/11850 🚀 clseibold · 15 hours ago:
GET and POST don't directly correlate to Gemini because Gemini is not based off of HTTP. Gemini has request strings, and part of the request string can be a query, which is just information that you are sending to the server. So, I would say it's not equivalent to GET nor to POST.

I will relent that it's *almost* like GET in that it gets a response back, and that HTTP GET can also have a query string, but the similarities end there. HTTP GET requests can have a bunch of headers, and even whole payloads. Gemini requests don't use any of that.

=> /u/skyjake/11847 🚀 skyjake · 20 hours ago:
The URL still needs to be percent-encoded, so an arbitrary file must be really small to fit into 1024 bytes.

Yes, Titan is a better choice for uploading data to a server. It uses TLS just like Gemini, so it is encrypted. The server can define the maximum upload size limitation.

=> /u/norayr/11844 🐙 norayr · 21 hours ago:
or a file of size not more than 1024 bytes, right?
otherwise, if we upload bigger file or comment, that would go via titan?

titan is encrypted right?
does it have request size limitation?

=> /u/skyjake/11843 🚀 skyjake · Nov 19 at 06:06:
Gemini URLs can contain a query string. The server can interpret the query string however it wants, in this case it is the text that is being posted.

The requested URL can be up to 1024 bytes long in total, so that allows posting a couple of short paragraphs worth of text with a single request.
Related...

Me:

I apologize for misspeaking. What I meant to say was the character "limit" hinders the replies to your thoughtful posts. Some messages and ideology can't be condensed much without losing the full scope. How do you add so many characters to your posts without hitting a character limit?

oldernow · 9 hours ago:

When a dialog that allows a limited amount of text appears, I type a colon, then hit <enter>. That results in a new dialog with a bigger buffer appearing, along with something about how that its contents will be uploaded via "Titan".
“The ultimate test of a moral society is the kind of world it leaves to its children.” ~ Dietrich Bonhoeffer
User avatar
Machine Trooper
Posts: 1004
Joined: Mon Jan 10, 2022 8:29 pm

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Machine Trooper »

Back when I first discovered the Net, everything was text-based and you had to access it with VAX or UNIX. This sounds similar.

If it's all P2P, then are sites hosted by the users on their PCs? Sorry if that was explained and I missed it.

I've believed for decades that the (actual) Church would have to go underground at some point. Something like this could be crucial.

I'll try this out when I get some time.
User avatar
Macaque Mentality
Posts: 6689
Joined: Sun May 15, 2022 9:46 pm

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Macaque Mentality »

Machine Trooper wrote: Mon Dec 25, 2023 8:50 pm I've believed for decades that the (actual) Church would have to go underground at some point. Something like this could be crucial.
I strongly believe that this is happening now. We are already underground to a large extent, but I believe more and more of our more blue-pilled brethren are joining us. I'm seeing more (actual) Bible believers leaving conventional churches in my area than ever before and God providentially having their paths cross with mine.
User avatar
Machine Trooper
Posts: 1004
Joined: Mon Jan 10, 2022 8:29 pm

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Machine Trooper »

Macaque Mentality wrote: Mon Dec 25, 2023 9:14 pm
Machine Trooper wrote: Mon Dec 25, 2023 8:50 pm I've believed for decades that the (actual) Church would have to go underground at some point. Something like this could be crucial.
I strongly believe that this is happening now. We are already underground to a large extent, but I believe more and more of our more blue-pilled brethren are joining us. I'm seeing more (actual) Bible believers leaving conventional churches in my area than ever before and God providentially having their paths cross with mine.
That is awesome news, MM.

:bouncy

The church I'm going to is literally dying (old folks with health problems going from bad to worse to gone), and the preacher still takes the MSM seriously (despite knowing it is "biased"--I guess he's still stuck in the '70s), but he speaks the Word boldly. I'm fortunate that way. But y'all here on TA are my strongest connection to the underground church thus far.
User avatar
Atruepatriot
Posts: 12151
Joined: Tue Feb 25, 2020 11:55 am

Re: Gemini project & Lagrange, a Browser for Gemini

Post by Atruepatriot »

Machine Trooper wrote: Mon Dec 25, 2023 8:50 pm Back when I first discovered the Net, everything was text-based and you had to access it with VAX or UNIX. This sounds similar.

If it's all P2P, then are sites hosted by the users on their PCs? Sorry if that was explained and I missed it.

I've believed for decades that the (actual) Church would have to go underground at some point. Something like this could be crucial.

I'll try this out when I get some time.
It is almost exactly the same as those old days with slightly improved capabilities. Tiny minimalistic static text sites with no bling or fanfare like Usenet and "rings" used to be. Yes, self hosted personal servers as a second and separate option if you want to share personal content, a community BBS board, or Etc. It "lives" in it's own internet "realm" with it's own port assignment and addressing system and is not part of the HTTP or WWW addressing protocols. So like the TOR "onion" (dot) net it does not have to answer to the authority, control, indexing, or regulation of the normal net.

Now keep in mind what I have proposed is not to actually use the existing "Geminispace" they already have established. Because there are also a lot of woke developers in there and it is global, Russians and all. But what I propose instead is to utilize the open source and open licensed software and create our own unique and personal "internet of websites" with our own custom porting and addressing. But please do go get the client and go check it out to see what a cool concept it really is!, and why it would be perfect for communities to go stealth.

Please let me know if you do and I will post a list of good websites to bookmark!

The Linux version of best client can be found in the software manager and you want "Lagrange" client/browser. And for windows it is on this page:

https://git.skyjake.fi/gemini/lagrange/releases

But as always a backup or a restore point to roll back to is suggested just in case. But I can testify that it works flawlessly for me on Linux and they have made zero complaints about the windows version. I asked the developers of Lagrange themselves personally to make sure:

"I have several folks talked into coming to take a look at Gemini. They long for the old days of simple sites. I have suggested using Lagrange because it works flawlessly for me on Linux. They use windows and I was curious if there are any known issues to look for with Lagrange on windows? All versions including Win 11 good to go? Just wanted to check and make sure all is good to go or if there are any precautions before they pull the trigger? I personally don't know because I don't use windows. Any help would be be much appreciated!

THANK YOU! :)"

=> /u/ 🚀
Dec 04 · 3 weeks ago · 👍 gemalaya, clseibold, Yretek

## Actions
=> /edit/12331 ✏️ Edit post
=> /comment/12331 💬 Comment
=> 12331/more More...

## 4 Comments ↑

=> /u/N10A/12337 👻 N10A · Dec 05 at 00:34:
yeah using lagrange on windows wasn't a problem for me, felt like using any other app.

=> /u//12336 🚀 · Dec 05 at 00:33:
@flipperzero, @clseibold. Thank you! As close tabs as @skyjake keeps on it I had already figured it was good to go without any issues! Version compatibility was my only real worry. :)

=> /u/clseibold/12334 🚀 clseibold · Dec 04 at 23:46:
Lagrange works well on Windows. I use it on Windows 11, so there should be no problems, afaik.

=> /u/flipperzero/12333 😎 flipperzero · Dec 04 at 23:44:
I'm using it on Win10 Home Edition right now (Lenovo Thinkpad i440 w/ dual-boot between Win10 and MX Linux)

Seems fine to me, no problems here. Renders here as fine as it does over Linux.
“The ultimate test of a moral society is the kind of world it leaves to its children.” ~ Dietrich Bonhoeffer
Post Reply