-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.xml
More file actions
323 lines (314 loc) · 29.1 KB
/
index.xml
File metadata and controls
323 lines (314 loc) · 29.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Pixels</title>
<link>https://bbhtt.in/</link>
<description>Recent content on Pixels</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<copyright>CC BY-NC-SA 4.0</copyright>
<lastBuildDate>Sat, 22 Mar 2025 18:48:40 +0530</lastBuildDate>
<atom:link href="https://bbhtt.in/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Closing the chapter on OpenH264</title>
<link>https://bbhtt.in/posts/closing-the-chapter-on-openh264/</link>
<pubDate>Sat, 22 Mar 2025 18:48:40 +0530</pubDate>
<guid>https://bbhtt.in/posts/closing-the-chapter-on-openh264/</guid>
<description><p>People might have noticed me talking about dropping OpenH264 from
<a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk"target="_blank" rel="noopener noreferrer">Freedesktop SDK</a>.
Here, I&rsquo;ll try to go a bit into the history, the timeline and what led
to the final decision.</p>
<h2 id="a-bit-of-an-introduction">A bit of an introduction</h2>
<p>If you are unfamiliar with the Freedesktop SDK project: it was born out
of the initial <a href="https://github.com/flatpak/freedesktop-sdk-images"target="_blank" rel="noopener noreferrer">1.6 Flatpak runtime image</a>
created by <a href="https://github.com/alexlarsson"target="_blank" rel="noopener noreferrer">Alexander Larsson</a> to
provide a host independent &ldquo;runtime&rdquo; for Flatpaks. Since then, with the
help of <a href="https://www.codethink.co.uk/"target="_blank" rel="noopener noreferrer">Codethink</a> and others, it grew
into an independent project maintained by the community that aims to
provide a &ldquo;A minimal Linux runtime&rdquo;.</p>
<p>Currently that includes the <code>org.freedesktop.{Sdk, Platform}</code>
<a href="https://docs.flatpak.org/en/latest/introduction.html#terminology"target="_blank" rel="noopener noreferrer">Flatpak runtimes</a>,
a bunch of other <a href="https://docs.flatpak.org/en/latest/extension.html"target="_blank" rel="noopener noreferrer">Flatpak extensions</a>
such as the GL (Mesa) extensions, a bootable image stack that includes
things like the Linux kernel, firmware and drivers and a collection
of docker images.</p>
<p>The runtimes (and more broadly the &ldquo;Flatpak&rdquo; stack) form the base for
the <a href="https://gitlab.gnome.org/GNOME/gnome-build-meta/"target="_blank" rel="noopener noreferrer">GNOME</a> and
<a href="https://invent.kde.org/packaging/flatpak-kde-runtime"target="_blank" rel="noopener noreferrer">KDE</a> Flatpak
runtimes which are collectively used by 2000+ Flatpaks, while the
bootable stack along with other parts forms the base for things like
<a href="https://os.gnome.org/"target="_blank" rel="noopener noreferrer">GNOME OS</a>.</p>
<h2 id="some-history">Some history</h2>
<p>H.264 is one of the <a href="https://www.cloudflare.com/learning/video/what-is-h264-avc/"target="_blank" rel="noopener noreferrer">most widely used</a>
codecs today but unfortunately it is patented with several patents
<a href="https://meta.wikimedia.org/wiki/Have_the_patents_for_H.264_MPEG-4_AVC_expired_yet%3F"target="_blank" rel="noopener noreferrer">still active</a>.
Patents like this are a blocker to shipping software dealing with the
codec in the base runtime (since we want it usable by a wide variety of
vendors and free of any legal grey areas) and unfortunately makes life
difficult for everyone involved.</p>
<p>To workaround this and ship working software to users, 6 years ago, in
2019 the precursor to the OpenH264 extension, called the
<a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/commit/1c1d87eb7f1e7952bf79825cfb65225f3a3c3e30"target="_blank" rel="noopener noreferrer">html5-codecs extension</a>
was added to the Freedesktop runtime by Tom Coldrick. The idea was
simple - it would contain support for FFMPEG&rsquo;s internal H.264 decoder
and would be an optional Flatpak extension since we were unable to ship
it in the runtime itself.</p>
<p>Fast-forward a few months, in June 2019, <a href="https://gitlab.com/ramcq"target="_blank" rel="noopener noreferrer">Robert McQueen</a>
opened an <a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/issues/815"target="_blank" rel="noopener noreferrer">issue</a>
to include <a href="https://github.com/cisco/openh264"target="_blank" rel="noopener noreferrer">Cisco&rsquo;s OpenH264</a>
(commonly referred as <code>libopenh264</code> too) as an extension to the runtime.</p>
<p><code>libopenh264</code> code is open source but due to the H.264 patents, no
vendor is legally allowed to distribute their own binaries (some vendors
build it themselves and hand it to Cisco but no one made that arrangement
for us). The solution to this was to distribute Cisco&rsquo;s unmodified
binaries directly to the user which would effectively be free of any
royalties but the catch is, the binaries have
<a href="https://www.openh264.org/BINARY_LICENSE.txt"target="_blank" rel="noopener noreferrer">some license restrictions</a>
on them.</p>
<p>So Endless around that time, added <a href="https://docs.flatpak.org/en/latest/module-sources.html#extra-data"target="_blank" rel="noopener noreferrer">extra-data</a>
support to Flatpak. This meant that the Flatpak extension metadata
would only contain an URL to Cisco&rsquo;s binaries, checksums and a &ldquo;recipe&rdquo;
to make a working extension out of it. The binary would be downloaded
on the end user&rsquo;s machine, inside a sandbox and then the &ldquo;recipe&rdquo;
would be executed to create a working extension. This avoids various
&ldquo;redistribution&rdquo; restrictions entirely since we aren&rsquo;t shipping the
binary itself.</p>
<p>However, one last catch remained with this approach. Unless the end user
system has downloaded the extension, a part of the ABI will be missing
from the base runtime itself. Additionally, the extension would also
get mounted to a non-standard location inside the Flatpak sandbox. So to
build something against that we needed a &ldquo;public&rdquo; library that is
included in the runtime itself.</p>
<p>Endless came up with a stub OpenH264 library called <a href="https://github.com/endlessm/noopenh264/"target="_blank" rel="noopener noreferrer">noopenhh264</a>,
as a solution to this. This would be kept ABI/API compatible to the
actual Cisco&rsquo;s OpenH264 library and would live inside the runtime at
<code>$libdir</code> to allow software to link to libopenh264 and provide a
fallback. At runtime, if the user downloads the actual OpenH264
extension, the stub library would get overridden by the library in
extension through Flatpak&rsquo;s ld.so config and voilà, you have a working
OpenH264 setup!</p>
<h2 id="the-start-of-the-openh264-extension">The start of the openh264 extension</h2>
<p>Following the gruelling details above, in August 2019, Tom Coldrick
<a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/merge_requests/1638"target="_blank" rel="noopener noreferrer">again added</a>
this &ldquo;noopenh264&rdquo; library to the runtime and set up the extension point
called <code>org.freedesktop.Platform.openh264</code>.</p>
<p>Around that time, the development of the &ldquo;stub&rdquo; noopenh264 library also
moved under the <a href="https://gitlab.com/freedesktop-sdk/noopenh264"target="_blank" rel="noopener noreferrer">Freedesktop SDK umbrella</a>
while the development of this extra-data extension was going on in a
<a href="https://gitlab.com/freedesktop-sdk/openh264-extension"target="_blank" rel="noopener noreferrer">dedicated repository</a>.</p>
<p>I talked about a &ldquo;recipe&rdquo; of an extra-data Flatpak extension a while
back, which is nothing but a set of commands in a special file called
<code>apply_extra</code> to stage and install the source. As an example, if it
was a <code>.deb</code> it would be a sequence of <code>ar</code> or <code>bsdtar</code> commands to
extract it, then install it inside Flatpak&rsquo;s extra-data prefix.</p>
<p>The catch here is that using any utility like that makes the extension
directly dependent on a particular branch of the Flatpak runtime and thus
the API/ABI provided by it.</p>
<p>As every yearly major release of the Freedesktop runtime is a completely
new ABI, we would need to continuously spin off new branches of the
OpenH264 extension i.e. for version 2.1.0 of libopenh264 we would need
<code>org.freedesktop.Platform.openh264//2.1.0-{18.08, 19.08, 20.08}</code> branches
for the extension and so on. This would make it a bit of an chore to
update the extension in Freedesktop runtime itself and also for
our downstream runtimes.</p>
<p>As a solution to this, a custom <code>apply_extra</code> script was <a href="https://gitlab.com/freedesktop-sdk/openh264-extension/-/commit/8a80eaaab8cd6b6aa7e241e681bdbaeed5632e56"target="_blank" rel="noopener noreferrer">written</a>,
which utilised only a few standard headers and would be <a href="https://gitlab.com/freedesktop-sdk/openh264-extension/-/commit/98601a6bcfd5a287106653bc69e54b58ce619c9e"target="_blank" rel="noopener noreferrer">built statically</a>
against a fixed toolchain.</p>
<p>The meant a bit of complexity, since we aren&rsquo;t allowed to use most
things that would make this process easier but it also meant the final
extension was independent of the runtime API/ABI and was built on top
of &ldquo;NoRuntime&rdquo;.</p>
<h2 id="the-flaws-start-to-show-up">The flaws start to show up</h2>
<p>This entire setup worked quite well for a long time despite some
maintenance issues from Cisco. However there were some flaws.</p>
<p>A while back I told that every vendor is forced to distribute binaries
hosted by Cisco at <code>https://ciscobinary.openh264.org</code>. Unfortunately
<code>ciscobinary.openh264.org</code> is missing a valid SSL certificate
<a href="https://github.com/cisco/openh264/issues/909#issue-34658985"target="_blank" rel="noopener noreferrer">at least since 2014</a>
and Cisco neither supplies GPG signatures nor strong checksums like
SHA-256 for the binary releases.</p>
<p>This meant that we have no way to verify the authenticity of Cisco&rsquo;s
binaries, opening us to various classes of MiTM and supply-chain
vulnerabilities. We reached out to Mozilla and via Fedora/RedHat to get
Cisco to fix this, as one can see the comments on the thread but
nothing ever happened.</p>
<p>More recently (around 2024-2025), this SSL issue meant that the domain
started getting <a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/merge_requests/24521#note_2329956598"target="_blank" rel="noopener noreferrer">DNS blocked</a>
and would make the extra-data download fail, botching an install.</p>
<p>Another critical issue was that if upstream did security fixes and then
released them with an ABI break, we couldn&rsquo;t fix it for the Flatpak
runtimes. Distributing binaries directly through extra-data meant there
is no scope for cherry-picking patches and the ABI break meant the new
version would only be able go to a new branch of the runtime.</p>
<p>We didn&rsquo;t really have a choice here. If we dropped this extension
considering the potential flaws, the entirety of the Flatpak user base
would loose H.264 decoding and encoding support, so we had to live with
the setup.</p>
<h2 id="the-start-of-the-codecs-extra-extension">The start of the codecs-extra extension</h2>
<p>Around June 2024 <code>gdk-pixbuf</code> due to a series of security issues,
<a href="https://discourse.gnome.org/t/change-in-the-gdk-pixbuf-loaders-built-by-default-in-2-42-11/21845"target="_blank" rel="noopener noreferrer">dropped support</a>
for a lot of &ldquo;fringe&rdquo; loaders. We immediately noticed the change as
we constantly analyse ABI in stable branches.</p>
<p>To compensate for the dropped loaders, we <a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/merge_requests/19916"target="_blank" rel="noopener noreferrer">decided</a>
to add <code>webp, avif, jxl, heif</code> support (with pixbuf loaders) to the
runtime. Around the same time, <a href="https://gitlab.com/wjt"target="_blank" rel="noopener noreferrer">Will Thompson</a>
opened an <a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/issues/1704"target="_blank" rel="noopener noreferrer">issue</a>
to add <code>libheif</code> to the runtime with the problematic HEIC decoder as a
runtime extension.</p>
<p>Consequently, we decided that yet another extension just for two libheif
plugins is not worth the maintenance effort and these would rather be
in the <code>ffmpeg-full</code> extension (This was the successor to the
<code>html5-codecs</code> extension, created around 2019-2020). So I <a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/merge_requests/20268"target="_blank" rel="noopener noreferrer">again</a>
<a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/merge_requests/19942"target="_blank" rel="noopener noreferrer">added</a>
<code>libx265, libde265</code> and the corresponding libheif plugins to the
ffmpeg-full extension. After a few months I also <a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/merge_requests/21970"target="_blank" rel="noopener noreferrer">added</a>
<code>libx264</code> to it too as we were already shipping <code>libx265</code> and Cisco&rsquo;s
OpenH264 had suboptimal encoding performance.</p>
<p>I was happy with the result and all of this shipped in Freedesktop SDK
24.08. But some people were unhappy for valid reasons.</p>
<p>When the <code>ffmpeg-full</code> extension was created, due to various concerns
it was never added to the runtime or SDK manifest; it lived as an
optional &ldquo;app&rdquo; extension - meaning app developers would need to add a
<a href="https://docs.flatpak.org/en/latest/extension.html#loading-existing-extensions"target="_blank" rel="noopener noreferrer">short snippet</a>
in their Flatpak manifest to use it.</p>
<p>This was problematic in some ways - sometimes app developers were
unaware of the extension or that they needed it and the app manifest
was missing the snippet that allowed to use the extension. This made
user and developer experience a bit poor. Once we started
shipping <code>libheif</code> in <code>ffmpeg-full</code>, it became slightly more
problematic as the actual libheif library was in the runtime but without
the extension it cannot decode any HEIF/HEIC image. So the extension
was practically mandatory. <a href="https://github.com/tsdgeos"target="_blank" rel="noopener noreferrer">Albert Astals Cid</a>,
part of the team who maintains KDE Flatpaks on Flathub complained about
this and an <a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/issues/1825"target="_blank" rel="noopener noreferrer">issue was opened by Erick555</a>
to discuss the possibility of making ffmpeg-full a runtime extension.</p>
<p>I was initially reluctant to do this for various reasons and the
situation was again a bit out of our hands (this time due to H.265
patents) but we asked various parties such as Endless and quite
surprisingly it turned out no one really had an objection to making it
a runtime extension or even make it auto-download along with the
runtime.</p>
<p>Along with this change, we decided to rename the <code>ffmpeg-full</code> extension
again, this time to <code>codecs-extra</code> to better reflect the fact that it
will not only contain FFMPEG with patented parts but other libraries
too that deals with patented codecs. This would sort of be an equivalent
to the various &ldquo;meta-packages&rdquo; that distros provide for patented or
restricted codecs.</p>
<p>Thus the seeds were planted and I switched <code>ffmpeg-full</code> to
<code>codecs-extra</code> a <a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/merge_requests/24620"target="_blank" rel="noopener noreferrer">month ago</a>.</p>
<p>This is supposed to ship in Freedesktop SDK 25.08. The major change for
app developers is that there is no longer any need to have something
like</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">add-extensions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">org.freedesktop.Platform.ffmpeg-full</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;24.08&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">directory</span><span class="p">:</span><span class="w"> </span><span class="l">lib/ffmpeg</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">add-ld-path</span><span class="p">:</span><span class="w"> </span><span class="l">.</span><span class="w">
</span></span></span></code></pre></div><p>in the manifest. <code>org.freedesktop.Platform.codecs-extra</code> will be
automatically installed by the runtime and will be available to users.</p>
<h2 id="dropping-the-openh264-extension">Dropping the openh264 extension</h2>
<p>The above <code>codecs-extra</code> change meant that we now didn&rsquo;t really have an
use case for <code>org.freedesktop.Platform.openh264</code> since <code>codecs-extra</code>
had FFMPEG&rsquo;s internal H.264 decoder and the <code>libx264</code> encoder.</p>
<p>So I initially disabled autodownload and considering the various &ldquo;flaws&rdquo;
with OpenH264 discussed above, I <a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/issues/1834"target="_blank" rel="noopener noreferrer">opened an issue</a>
for planned retirement in 26.08.</p>
<p>This was completely overturned when a <a href="https://github.com/cisco/openh264/security/advisories/GHSA-m99q-5j7x-7m9x"target="_blank" rel="noopener noreferrer">high severity flaw</a>
was discovered in libopenh264 affecting versions 2.5.0 and earlier.</p>
<p>The 23.08 branch of the Freedesktop runtime was locked to 2.2.0 and
upgrading to a fixed version was not possible due to multiple ABI breaks
and SONAME bumps upstream. Patching was also not an option as I said
earlier.</p>
<p>We scrambled to mitigate this. For 23.08, we decided to make an
&ldquo;ABI break&rdquo; and <a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/issues/1846"target="_blank" rel="noopener noreferrer">drop the extension</a>
as updating was impossible. So I made a bit of an intimidating <a href="https://discourse.flathub.org/t/upcoming-freedesktop-23-08-runtime-release-will-drop-openh264-extension/9022"target="_blank" rel="noopener noreferrer">announcement</a>.</p>
<p>But we still had 24.08 left which was on 2.4.1 and updating to the fixed
version i.e. 2.6.0 was again blocked due to an ABI bump.</p>
<p>However, looking through the commits between 2.4.1 and 2.6.0 and
analysing the library through libabigail we couldn&rsquo;t find an actual
ABI break that was made and considering Cisco in the past made
unnecessary SONAME bumps, we tried patching the 2.6.0 release to
provide the older ABI.</p>
<p>I <a href="https://gitlab.com/freedesktop-sdk/openh264-extension/-/merge_requests/68"target="_blank" rel="noopener noreferrer">messed</a>
with that venerable apply_extra and wrote a small utility to patch
SONAMEs. But upstream, in time, pointed us to the ABI break
and this idea had to be scrapped entirely. (I later found out why
liabigail was unable to show the ABI break after talking to Dodji
Seketeli, the libabigail maintainer.)</p>
<p>We then <a href="https://github.com/cisco/openh264/issues/3863"target="_blank" rel="noopener noreferrer">asked upstream</a>
to provide a patch release 2.5.1 instead with the old ABI and to our
surprise they did within a few weeks! This shipped in 24.08.15 fixing
the 24.08 branch of the runtime.</p>
<p>After all this debacle and the extra &ldquo;headache&rdquo;, none of us felt
comfortable shipping the openH264 extension anymore. Thus it was
<a href="https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/merge_requests/24871"target="_blank" rel="noopener noreferrer">dropped</a>
for the master branch, which means there won&rsquo;t be any
<code>org.freedesktop.Platform.openh264</code> extension or <code>noopenh264</code> for 25.08+.</p>
<h2 id="epilogue">Epilogue</h2>
<p>Considering all things, I think and hope we made the correct decision
and hopefully the new <code>org.freedesktop.Platform.codecs-extra</code> works
out. <code>libx264, libx265</code> and others are built from source and there
are no binaries or extra-data involved. So we should theoretically be
able to patch and fix any issues that come up in the future.</p>
<p>Apart from all this, I&rsquo;m slightly worried at the prospects of legal
issues cropping up with this setup and also that the new extension
contains &ldquo;too much&rdquo;, but we will have to see where things flow.</p>
<p>As a fun tidbit, I wasn&rsquo;t aware that Fedora was also using our
<code>org.freedesktop.Platform.openh264</code> extension. I caused a bit of work
for them as noopenh264 <a href="https://gitlab.com/freedesktop-sdk/noopenh264/-/commit/2177b9cb3542d0c9ccba4d20e56516118f8e747d"target="_blank" rel="noopener noreferrer">moved home</a>
once again, now to Fedora and they are looking for ways to make their
own OpenH264 extension similar to how we did.</p>
<p>I hope the experience here helps anyone in the future wanting to maintain
such an extension and this will also serve as a reminder to how much
extra work patents like these causes.</p>
<p>Lastly I&rsquo;d like to thank Endless for giving us not only noopenh264 but
also extra-data support in Flatpak that made all this possible;
<a href="https://gitlab.com/TheRealMichaelCatanzaro"target="_blank" rel="noopener noreferrer">Michael Catanzaro</a> and <a href="https://gitlab.com/nanonyme"target="_blank" rel="noopener noreferrer">Seppo Yli-Olli</a>
for maintaining this setup for a long time; <a href="https://gitlab.com/valentindavid"target="_blank" rel="noopener noreferrer">Valentin David</a>
for helping me in the last few days and everyone else who worked on
this ❤️</p></description>
</item>
<item>
<title>Hello, World</title>
<link>https://bbhtt.in/posts/hello-world/</link>
<pubDate>Fri, 05 Apr 2024 09:32:40 +0530</pubDate>
<guid>https://bbhtt.in/posts/hello-world/</guid>
<description><p align="center">
<img src="./cat.png" alt="A cat standing on two legs with one hand on a bed and the other one stretched in the opposite direction - in a stuck position" />
</p>
</description>
</item>
<item>
<title>About</title>
<link>https://bbhtt.in/about/</link>
<pubDate>Fri, 07 Jul 2023 12:44:33 +0530</pubDate>
<guid>https://bbhtt.in/about/</guid>
<description><blockquote>
<p><em>I’m Nobody! Who are you? Are you – Nobody – too? Then there’s a pair of us!</em> ~ Emily Dickinson</p>
</blockquote>
<p>Hello and welcome to my little corner of the internet!</p>
<p>You might know me by my online alias, <em>bbhtt</em>, which is just a blend of
some letters of my real name, Boudhayan Bhattcharya. I live in India and
completed my B.Sc. (Honours) in 2021 and M.Sc. in Mathematics in 2023.
Currently, I&rsquo;m pursuing a Ph.D. in Mathematics. I teach Mathematics
for work and occasionally contribute to <a href="https://en.wikipedia.org/wiki/Free_and_open-source_software"target="_blank" rel="noopener noreferrer">FOSS projects</a>
during my free time.</p>
<p>I love watching <a href="https://letterboxd.com/bbhtt/films/"target="_blank" rel="noopener noreferrer">movies</a>,
TV shows, and <a href="https://anidb.net/user/983003"target="_blank" rel="noopener noreferrer">anime</a>, and I&rsquo;m always
listening to <a href="https://open.spotify.com/user/m18qz71984e1gjbkfbd36zwmi"target="_blank" rel="noopener noreferrer">music</a>.
Although, most of the time, I&rsquo;m lost in some random YouTube binge.</p>
<p>I also try to read books and play some games on <a href="https://steamcommunity.com/id/bbhtt/"target="_blank" rel="noopener noreferrer">Steam</a>
every now and then, and sometimes I mess around with casual online chess
on Lichess.</p>
<p>You can contact me via:</p>
<ul>
<li>Email: <a href="mailto:bbhtt@bbhtt.in">bbhtt@bbhtt.in</a>. My GPG key
is <a href="./bbhtt.pub">D26D 7533 9500 9DB2 B3B2 6094 0C32 51A2 4745 E484</a></li>
<li><a href="https://matrix.org/"target="_blank" rel="noopener noreferrer">[matrix]</a>: <a href="https://matrix.to/#/@bbhtt:matrix.org"target="_blank" rel="noopener noreferrer">@bbhtt:matrix.org</a></li>
<li>IRC: bbhtt on <a href="ircs://irc.libera.chat/bbhtt,isuser">Libera.chat</a>, <a href="ircs://irc.oftc.net/bbhtt,isuser">OFTC</a></li>
</ul>
<p>Unless otherwise stated, all textual content here is licensed under
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/"target="_blank" rel="noopener noreferrer">CC BY-NC-SA 4.0</a>.</p>
</description>
</item>
</channel>
</rss>