530 lines
23 KiB
HTML
530 lines
23 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width" />
|
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
|
|
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
|
|
<link rel="manifest" href="/site.webmanifest" />
|
|
<link rel="me" href="https://pouet.chapril.org/@gna" />
|
|
<link rel="stylesheet" href="https://gna.org/main.css" />
|
|
<link
|
|
rel="stylesheet"
|
|
media="screen and (max-width: 1300px)"
|
|
href="https://gna.org/mobile.css"
|
|
/>
|
|
|
|
<meta name="referrer" content="no-referrer-when-downgrade" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="https://gna.org/main.css" />
|
|
<link
|
|
rel="stylesheet"
|
|
media="screen and (max-width: 1300px)"
|
|
href="https://gna.org/mobile.css"
|
|
/>
|
|
|
|
<meta name="referrer" content="no-referrer-when-downgrade" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
|
|
<title>Project plans for a hosted Gitea online service | Gna!: Managed Forgejo Hosting </title>
|
|
<meta name="referrer" content="no-referrer-when-downgrade" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
|
|
<meta name="description" content="When an organization asks me about Gitea, I would like to direct them to a provider where they can rent an instance and just use it" />
|
|
|
|
|
|
<meta property="og:title" content="Project plans for a hosted Gitea online service | Gna!: Managed Forgejo Hosting " />
|
|
<meta property="og:type" content="article" />
|
|
<meta property="og:url" content="https://gna.org" />
|
|
|
|
<meta property="og:description" content="When an organization asks me about Gitea, I would like to direct them to a provider where they can rent an instance and just use it" />
|
|
<meta
|
|
property="og:site_name"
|
|
content="Project plans for a hosted Gitea online service | Gna!: Managed Forgejo Hosting "
|
|
/>
|
|
<link
|
|
rel="apple-touch-icon"
|
|
sizes="57x57"
|
|
href="https://gna.org/apple-icon-57x57.png?h=c21de14cfdf862a6472ae977557fa048a7c36d39337e61d3274705e9bd8e857f"
|
|
/>
|
|
<link
|
|
rel="apple-touch-icon"
|
|
sizes="60x60"
|
|
href="https://gna.org/apple-icon-60x60.png?h=67089d9025a52d0d1ddce450078c7acefe2c150a2427dec9f5e13c6314f74281"
|
|
/>
|
|
<link
|
|
rel="apple-touch-icon"
|
|
sizes="72x72"
|
|
href="https://gna.org/apple-icon-72x72.png?h=70725943de8884804f9da28202ced0ad6fed483ae9cf8f6d874aa133e30cb693"
|
|
/>
|
|
<link
|
|
rel="apple-touch-icon"
|
|
sizes="76x76"
|
|
href="https://gna.org/apple-icon-76x76.png?h=1e6e8072df3b21bdcea254a42aac6e993611e845f91ddd79f6f35a6c441710a5"
|
|
/>
|
|
<link
|
|
rel="apple-touch-icon"
|
|
sizes="114x114"
|
|
href="https://gna.org/apple-icon-114x114.png?h=c20099f8190ed3962fab5726c5594857a871cdb3ee98439343c622cd3727fed6"
|
|
/>
|
|
<link
|
|
rel="apple-touch-icon"
|
|
sizes="120x120"
|
|
href="https://gna.org/apple-icon-120x120.png?h=4df78e402e60b58c6d44764678bdd737b5b6a836aeb85fb75fa49f706f7e8c81"
|
|
/>
|
|
<link
|
|
rel="apple-touch-icon"
|
|
sizes="144x144"
|
|
href="https://gna.org/apple-icon-144x144.png?h=0c44e6655d714f89ee95cc151032d1f0dc3204bd24d1ca2ee9d94692d4ede84d"
|
|
/>
|
|
<link
|
|
rel="apple-touch-icon"
|
|
sizes="152x152"
|
|
href="https://gna.org/apple-icon-152x152.png?h=157918f883ff95d4eeb6452d0ebb61ca5e21ea0dcac1aefe825f3e2f3999052f"
|
|
/>
|
|
<link
|
|
rel="apple-touch-icon"
|
|
sizes="180x180"
|
|
href="https://gna.org/apple-icon-180x180.png?h=7d5c16d379b7db6d8ea5aae64921d7162b84f543763acd8fc7c107f80a600213"
|
|
/>
|
|
<link
|
|
rel="icon"
|
|
type="image/png"
|
|
sizes="192x192"
|
|
href="https://gna.org/android-icon-192x192.png?h=095e3835b082dba07f606c33fa6f71bcd671a71e987b0ab2e46dcddceef52b9c"
|
|
/>
|
|
<link
|
|
rel="icon"
|
|
type="image/png"
|
|
sizes="32x32"
|
|
href="https://gna.org/favicon-32x32.png?h=1bf54bf111572b1d1639192b5360ee4345f702e563aa71bb66610a95a7290437"
|
|
/>
|
|
<link
|
|
rel="icon"
|
|
type="image/png"
|
|
sizes="96x96"
|
|
href="https://gna.org/favicon-96x96.png?h=5a6ed96c09f5055526e3b236867a1272a26f7ba957d48b267bccd51ef0845fbe"
|
|
/>
|
|
<link
|
|
rel="icon"
|
|
type="image/png"
|
|
sizes="16x16"
|
|
href="https://gna.org/favicon-16x16.png?h=1e5fa59ae78516055f662e40bb2599dc3828a7adb34567e9d8d2cfcaa6b7aa5f"
|
|
/>
|
|
<link
|
|
rel="manifest"
|
|
href="https://gna.org/manifest.json?h=27eca3e8297eb7ff340deb3849b210185a459b3845456aa4d0036f6d966b3518"
|
|
/>
|
|
<meta name="msapplication-TileColor" content="#ffffff" />
|
|
<meta
|
|
name="msapplication-TileImage"
|
|
content="https://gna.org/ms-icon-144x144.png?h=8170ab51b871b84b8f98bd03cf441afdffb2998b7dfffb04abb7ebf5deeb1f94"
|
|
/>
|
|
<meta name="theme-color" content="#ffffff" />
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
</head>
|
|
<body class="base">
|
|
<header>
|
|
<nav class="nav__container">
|
|
<input type="checkbox" class="nav__toggle" id="nav__toggle" />
|
|
|
|
<div class="nav__header">
|
|
<a class="nav__logo-container" href="/">
|
|
|
|
<img src="https://gna.org/gna-logo-rectangle-48px.png?h=ba9eab043277265f94c51b87d5e14f9ca35789403ecb8afc9bd1e33b13c6a2a5" alt="Gna!"/>
|
|
</a>
|
|
<label class="nav__hamburger-menu" for="nav__toggle">
|
|
<span class="nav__hamburger-inner"></span>
|
|
</label>
|
|
</div>
|
|
<div class="nav__spacer--small"></div>
|
|
<div class="nav__link-group">
|
|
|
|
<div class="nav__link-container">
|
|
<a class="nav__link" rel="noreferrer" href="/about/">About</a>
|
|
</div>
|
|
|
|
|
|
<div class="nav__link-container">
|
|
<a class="nav__link" rel="noreferrer" href="/blog/">Blog</a>
|
|
</div>
|
|
|
|
|
|
<div class="nav__link-container">
|
|
<a class="nav__link" rel="noreferrer" href="https://matrix.to/#/#gna:matrix.batsense.net">Chat</a>
|
|
</div>
|
|
|
|
|
|
<div class="nav__link-container">
|
|
<a class="nav__link" rel="noreferrer" href="/forgejo-clinic/">Clinic</a>
|
|
</div>
|
|
|
|
|
|
<div class="nav__link-container">
|
|
<a class="nav__link" rel="noreferrer" href="https://forum.gna.org">Forum</a>
|
|
</div>
|
|
|
|
|
|
<div class="nav__link-container">
|
|
<a class="nav__link" rel="noreferrer" href="https://pouet.chapril.org/@gna">Mastodon</a>
|
|
</div>
|
|
|
|
</div>
|
|
<div class="nav__spacer"></div>
|
|
<div class="nav__link-group--small">
|
|
|
|
<div class="nav__link-container">
|
|
<a class="nav__link" rel="noreferrer" href="https://hosteadashboard.gna.org/login/">Login</a>
|
|
</div>
|
|
|
|
|
|
<div class="nav__link-container--action">
|
|
<a class="nav__link" rel="noreferrer" href="https://hosteadashboard.gna.org/register/">Join</a>
|
|
</div>
|
|
|
|
</div>
|
|
</nav>
|
|
|
|
</header>
|
|
<!-- See ../sass/main.scss. Required for pushing footer to the very
|
|
bottom of the page -->
|
|
<div class="main__content-container">
|
|
<main>
|
|
|
|
|
|
<div class="page__container">
|
|
<h1 class="page__group-title">Project plans for a hosted Gitea online service</h1>
|
|
<p class="blog__post-meta">
|
|
|
|
|
|
|
|
<a href="https://dachary.org" class="post__author">Loïc Dachary</a>
|
|
|
|
|
|
|
|
|
|
· 18
|
|
April
|
|
|
|
,
|
|
2022 · <b>11 min read</b>
|
|
</p>
|
|
|
|
|
|
<div class="blog__content">
|
|
<p><em>This post was originally published on <a href="https://blog.dachary.org/2022/02/16/project-plans-for-a-hosted-gitea-online-service/">Loïc Dachary's
|
|
blog</a>.</em></p>
|
|
<hr />
|
|
<p>When an organization asks me about Gitea, I would like to direct them to
|
|
a provider where they can rent an instance and just use it, in the same
|
|
way they can go to https://discourse.org for a forum, or
|
|
https://nextcloud.com for storage. Instead of waiting for that to
|
|
happen, <a href="https://batsense.net/about/">Aravinth</a> and
|
|
<a href="https://dachary.org/">myself</a> decided to do something about it, in a
|
|
way that is in line with our shared values: transparency and Free
|
|
Software.</p>
|
|
<p>After doing some research we found counter examples that showed the
|
|
pitfalls to avoid. GitLab because its business model heavily relies on
|
|
selling proprietary licenses. CiviCRM because setting it up is complex
|
|
and requires training: users can't figure it out on their own. Gitea
|
|
images provided by Digital Ocean because they do not include security
|
|
upgrades. MySQL configured and run by AWS because of the vendor lock-in
|
|
that makes it impossible to self-host.</p>
|
|
<p>We concluded that an online service such as Gitea can be hosted in a
|
|
sustainable way as long as:</p>
|
|
<ul>
|
|
<li>It is well maintained and upgrades itself</li>
|
|
<li>It can be self-hosted</li>
|
|
<li>The service can automatically be restored from backups when the
|
|
underlying resources fail</li>
|
|
</ul>
|
|
<p>GitHub and GitLab make it look like there is a market around software
|
|
forges. It is however impossible to figure out if this market exists
|
|
only because it is based on proprietary software. How many of these
|
|
customers would pay for a Free Software hosted Gitea instance?</p>
|
|
<p>Even if these customers do exist, a new service provider would have to
|
|
figure out how to convince them to subscribe. The technical development
|
|
of the service can be done within weeks but building a sustainable
|
|
business takes much longer. Again, there were examples of what can go
|
|
wrong, for instance ElasticSearch. After years of work developing a
|
|
successful online service and a customer base, AWS entered the
|
|
competition and started to take it away from them.</p>
|
|
<p>The sustainability of the Free Software ecosystem is a new and very
|
|
difficult problem to solve. It is discussed more than it ever was in the
|
|
wake of security breaches originating from widely used and yet abandoned
|
|
library or disillusioned Free Software authors self-sabotaging their
|
|
next release, and everyone has diverging opinions. It falls on each Free
|
|
Software author to spend time to think about their own projects because
|
|
there are no handbook or good examples to follow. That is what Aravinth
|
|
and myself did to find a semblance of clarity and decide how to go about
|
|
this hosted Gitea service idea.</p>
|
|
<h1 id="sustaining-free-software-online-services">Sustaining Free Software online services<a class="zola-anchor" href="#sustaining-free-software-online-services" aria-label="Anchor link for: sustaining-free-software-online-services"
|
|
><span class="anchor-icon">#</span></a
|
|
>
|
|
</h1>
|
|
<h2 id="more-mature-online-services-mean-less-opportunities-to-sell-services">More mature online services mean less opportunities to sell services<a class="zola-anchor" href="#more-mature-online-services-mean-less-opportunities-to-sell-services" aria-label="Anchor link for: more-mature-online-services-mean-less-opportunities-to-sell-services"
|
|
><span class="anchor-icon">#</span></a
|
|
>
|
|
</h2>
|
|
<p>Ideally the software running an online service is rock solid and bugs
|
|
are so rare that it can run unattended. This is true of
|
|
https://wordpress.org and it is not uncommon for an instance to run for
|
|
years while upgrading themselves to get security patches. The cost of
|
|
maintaining such a service is negligible and hosting companies can offer
|
|
it for free to their customers. They make their profit by renting the
|
|
machines on which the service runs.</p>
|
|
<p>When the software is not as mature, it is more expensive to run. Bugs
|
|
need fixing, upgrades require manual intervention, users must be trained
|
|
to overcome the complexity of the user experience, etc. Well known
|
|
examples are Discourse or CiviCRM for which companies sell services to
|
|
overcome these issues.</p>
|
|
<p>But when an organization is both the author of the software and the
|
|
provider of paid services to compensate for its lack of maturity, it
|
|
creates a conflict of interest. Should they focus their effort on making
|
|
the software more mature, they would harm a business model that is based
|
|
on this very lack of maturity. For instance, if the author of a software
|
|
also sells training courses, they are not motivated to solve user
|
|
experience issues. If they did, it would lower the need for training
|
|
courses and reduce their income.</p>
|
|
<h2 id="free-software-online-services-in-the-wake-of-the-sustainability">Free Software online services in the wake of the sustainability<a class="zola-anchor" href="#free-software-online-services-in-the-wake-of-the-sustainability" aria-label="Anchor link for: free-software-online-services-in-the-wake-of-the-sustainability"
|
|
><span class="anchor-icon">#</span></a
|
|
>
|
|
</h2>
|
|
<p>crisis</p>
|
|
<p>Nowadays all Free Software authors struggle to get enough resources to
|
|
produce a steady stream of releases, even when the project is very
|
|
popular. This sustainability problem is getting more and more attention
|
|
as the number of Free Software projects in use world wide keeps growing.
|
|
Even the simplest online service relies on thousands of Free Software
|
|
projects, each of which needs work to keep going. Accidents caused by
|
|
poorly maintained Free Software projects become more frequent.</p>
|
|
<p>This Free Software sustainability crisis is barely emerging and very
|
|
much resembles ecological problems such as climate change. In both cases
|
|
it is very difficult to figure out how to properly care for the
|
|
resources that are consumed. After decades of advocacy, it is generally
|
|
accepted that fossil energy won't last forever but there still is a long
|
|
way to go. It will also take a long time for the Free Software community
|
|
to answer this simple question: how to sustain an ever growing library
|
|
of Free Software?</p>
|
|
<p>Luckily, it is relatively simpler to solve that problem for an online
|
|
service because it has users. They can be reminded that their assistance
|
|
is needed to keep the project afloat, for instance by a donation. A
|
|
proposition that would be much more difficult to make for the author of
|
|
a cryptographic library. Convincing users to pay for an online service
|
|
has the best chance of success when the author of the software is also
|
|
the service provider. This is the business model of Discourse and
|
|
Weblate, but it is relatively fragile because nothing stands in the way
|
|
of the competition.</p>
|
|
<p>A few years ago ElasticSearch successfully developed an online service
|
|
offering. But when AWS entered the competition and was better at
|
|
marketing it, ElasticSearch quickly realized they would likely go out of
|
|
business. They tried to fight back by <a href="https://www.elastic.co/blog/licensing-change">changing their
|
|
license</a>, which was the
|
|
wrong answer to a real problem. Discourse or Weblate are also likely to
|
|
face competition from hosting companies in the future and they may not
|
|
survive it.</p>
|
|
<p>In the end, the durable source of income for a Free Software online
|
|
service is to rent the resources (CPU/RAM/network/disk) it needs to run.
|
|
In other words only hosting companies can make a profit when running
|
|
such an online service. And for that reason they also need to share part
|
|
of the profits to ensure the sustainability of the Free Software service
|
|
their customers need.</p>
|
|
<h1 id="online-services-vendor-lock-in-is-cured-by-free-software">Online services vendor lock-in is cured by Free Software<a class="zola-anchor" href="#online-services-vendor-lock-in-is-cured-by-free-software" aria-label="Anchor link for: online-services-vendor-lock-in-is-cured-by-free-software"
|
|
><span class="anchor-icon">#</span></a
|
|
>
|
|
</h1>
|
|
<p>When hosting companies offer online services they also provide upgrades
|
|
and transparent recovery when the hardware fails. But none of them allow
|
|
the service to be self-hosted. When their price policy change, or when
|
|
the term of services ban users from a given country, migrating the
|
|
service elsewhere it costly and difficult. For instance when AWS runs
|
|
MySQL for their customers, they allow to download the data but not the
|
|
software that runs the proprietary AWS interface used to configure and
|
|
control the server. Another example is GitHub where the content of the
|
|
git repository can be downloaded but the code that runs GitHub itself is
|
|
not Free Software.</p>
|
|
<p>If a customer cannot run the same software as their service provider,
|
|
they are locked-in, even if they can download their data. It is a common
|
|
misconception to think that there is no vendor lock-in as long as it is
|
|
possible to download the data in an standard format. Migrating the data
|
|
from one software to another is, more often than not, time consuming and
|
|
costly to a point that it is effectively a blocker. A GitHub salesperson
|
|
would argue that it is possible for people to run GitHub Enterprise on
|
|
their own hardware. But the vendor lock-in is still present via the
|
|
proprietary license contract. The user experience, maintenance and
|
|
upgrades are still exclusively controlled by GitHub.</p>
|
|
<p>To guarantee their independence, the customers of an online service need
|
|
to be able to:</p>
|
|
<ul>
|
|
<li>Download their data</li>
|
|
<li>Run the exact same Free Software as their service provider</li>
|
|
<li>Run the exact same Free Software infrastructure as code as their
|
|
service provider</li>
|
|
</ul>
|
|
<p>The requirement regarding Free Software infrastructure as code refers
|
|
to, for instance, the AWS control panel and all that is behind it when
|
|
creating a new MySQL service. It includes whatever a competitor would
|
|
need to run the same online service. An example would be
|
|
https://enough.community, an infrastructure as code dedicated to
|
|
creating the services needed by whistleblowers and human rights
|
|
defenders. It consumes resources rented by hosting providers, assembles
|
|
disks and machines, setup monitoring and intrusion detection, installs
|
|
various online services and upgrades them.</p>
|
|
<p>The availability of the software that creates the infrastructure is not
|
|
only useful to the competitors of a service provider. It also benefits a
|
|
non-profit that wants to provide (for instance) Wordpress instances to
|
|
its members. Without it they would need to create something from scratch
|
|
using building blocks such as CiviCRM. Even though such building blocks
|
|
exist, this is a significant undertaking and effectively a blocker.</p>
|
|
<h1 id="federated-online-services-and-durability">Federated online services and durability<a class="zola-anchor" href="#federated-online-services-and-durability" aria-label="Anchor link for: federated-online-services-and-durability"
|
|
><span class="anchor-icon">#</span></a
|
|
>
|
|
</h1>
|
|
<p>All self-hosted services are in danger of losing the data they contain.
|
|
When a Wordpress service is hosted in a home and the machine dies, it
|
|
must be restored from backups... when there are backups. Hosting
|
|
companies ensure the durability of the data with their own backup
|
|
system. It creates a dilemma for people who are looking into self
|
|
hosting: independence is desirable, but is it worth taking the risk of
|
|
data loss?</p>
|
|
<p>Federated online services do not suffer from this problem, because they
|
|
can mirror each other. A Gitea instance that is federated with another
|
|
will mirror copies of software projects found on its peers. Should one
|
|
instance be destroyed, mirrored projects can be resurrected from the
|
|
federated instance. Not only is it a practical way to ensure the (rare)
|
|
failure of an entire datacenter, it also helps with the (more frequent)
|
|
destruction of self-hosted machines. Contrary to backups that require
|
|
special attention, the replication involved in federated online service
|
|
is built in and works continuously. There is no need for an extra backup
|
|
service that is very rarely used and therefore likely to fail when
|
|
needed.</p>
|
|
<p>Federated services are not yet mainstream and Gitea is one of the rare
|
|
services that started to implement the concept. In the interim,
|
|
customers of an online hosting service will need to worry about backups
|
|
to ensure the durability of their data. But the ultimate solution for
|
|
them won't be the emergence of an ideal backup infrastructure, it will
|
|
be replication (via federated services) that will continuously ensure
|
|
the durability of their data.</p>
|
|
<h1 id="paths-forward">Paths forward<a class="zola-anchor" href="#paths-forward" aria-label="Anchor link for: paths-forward"
|
|
><span class="anchor-icon">#</span></a
|
|
>
|
|
</h1>
|
|
<p>The Gitea project itself, following the footsteps of Discourse or
|
|
Weblate, could provide a hosting service. Part of its current user base
|
|
may become customers and there does not seem to be any blocker to make
|
|
that happen. As with most successful Free Software project, people
|
|
working on Gitea daily are already very busy and cannot engage in such a
|
|
long term project. But Aravinth and myself can, if they will have us.</p>
|
|
<p>Another path forward would be to wrap Gitea into a bundle that existing
|
|
hosting companies could easily use to provide such a service to their
|
|
customers. The biggest hosting companies are unlikely to be interested:
|
|
if Digital Ocean was to provide upgrades on top of their existing Gitea
|
|
image, they are more likely to rely on their internal staff to implement
|
|
that from scratch, as proprietary software integrated into their
|
|
existing infrastructure. But smaller hosting companies such as
|
|
https://Octopuce.fr or https://Easter-Eggs.com, who already deploy Gitea
|
|
instances for their customers, would use it if, for instance, it helped
|
|
with the upgrades. They would then kindly be reminded to give back a
|
|
share of their profits in order to sustain the development of the
|
|
service they deploy.</p>
|
|
<p>Finally it would also be possible to follow the example of GitLab in the
|
|
early days (before it turned to proprietary software) or Codeberg and
|
|
offer a free shared forge hosting service to build a user base. After a
|
|
few years, a percentage of the user base would convert to being paid
|
|
customers or donors to sustain the activity and part of the income would
|
|
be used to sustain the development of the service.</p>
|
|
|
|
</div>
|
|
<br>
|
|
<br>
|
|
<div class="blog__post-tag-container">
|
|
|
|
<a class="blog__post-tag" href="/tags/gna">#gna</a>
|
|
|
|
<a class="blog__post-tag" href="/tags/gitea">#gitea</a>
|
|
|
|
<a class="blog__post-tag" href="/tags/free-software">#free-software</a>
|
|
|
|
<a class="blog__post-tag" href="/tags/free-software-sustainability">#free-software-sustainability</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
</main>
|
|
<footer>
|
|
<div class="footer__container">
|
|
<!-- <div class="footer__column"> --->
|
|
<p class="footer__column license__conatiner">
|
|
All text <a
|
|
class="license__link"
|
|
rel="noreferrer"
|
|
href="http://creativecommons.org/licenses/by-sa/4.0/"
|
|
target="_blank"
|
|
> CC-BY-SA </a
|
|
>
|
|
& code
|
|
<a
|
|
class="license__link"
|
|
rel="noreferrer"
|
|
href="https://www.gnu.org/licenses/agpl-3.0.en.html"
|
|
target="_blank"
|
|
> AGPL </a
|
|
>
|
|
|
|
|
<a
|
|
class="license__link"
|
|
rel="noreferrer"
|
|
href="https://www.eff.org/issues/do-not-track/amp/"
|
|
target="_blank"
|
|
> No AMP </a
|
|
>
|
|
</p>
|
|
<!-- </div> -->
|
|
<div class="footer__column--center">
|
|
<a href="/blog/atom.xml" target="_blank" rel="noopener" title="RSS">
|
|
<img
|
|
src="https://gna.org/icons/rss.svg?h=f6cd584bdbcd2eb4d1b8b84c9cf083ef45f772167c33fdcee754b35ae8ff4c7d"
|
|
class="footer__icon"
|
|
alt="Email icon"
|
|
/>
|
|
</a>
|
|
</div>
|
|
<div class="footer__column">
|
|
<a href="/about" title="About">About</a>
|
|
<a href="/coc" title="Code of Conduct">CoC</a>
|
|
<span class="footer__column-divider--mobile-only">|</span>
|
|
<a href="/legalese" title="Legalese">Legalese</a>
|
|
<a href="/privacy-policy" title="Privacy Policy">Privacy</a>
|
|
<span class="footer__column-divider--mobile-only">|</span>
|
|
<a
|
|
href="https://forgejo.gna.org/Gna"
|
|
rel="noreferrer"
|
|
target="_blank"
|
|
title="Status"
|
|
>Source Code</a
|
|
>
|
|
<a href="/tos" title="Terms of Service">ToS</a>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
</div>
|
|
</body>
|
|
</html>
|