Commit f2c095dba7872cf11e807d21ccf6b1e3f01ebe10

Parents: 80ac55d472ece40e963956273f34f8be7fe9290d

From: Moritz Poldrack <git@moritz.sh>
Date: Fri Jan 26 23:22:39 2024 +0700

chore: make project reuse compliant

		

Stats

.gitignore.license +2/-0
LICENSES/CC0-1.0.txt +121/-0
LICENSES/EUPL-1.2.txt +190/-0
Makefile +2/-0
README.md +6/-0
go.mod +3/-0
go.sum.license +2/-0
internal/config/config.go +3/-0
internal/datastore/interface.go +3/-0
internal/datastore/sqlite/queries.go +3/-0
internal/datastore/sqlite/schema.sql +3/-0
internal/datastore/sqlite/setup.go +3/-0
internal/datastore/sqlite/type.go +3/-0
internal/datastore/types.go +3/-0
main.go +3/-0
ui/.gitignore.license +2/-0
ui/Makefile +2/-0
ui/dist/.gitignore.license +2/-0
ui/elm.json.license +2/-0
ui/html/index.html +4/-0
ui/html/index.js +3/-0
ui/src/Main.elm +3/-0
ui/src/Ports.elm +3/-0

Changeset

  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
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
diff --git a/.gitignore.license b/.gitignore.license
new file mode 100644
index 0000000000000000000000000000000000000000..c1464e9a3503b28f5445fd1f5b5ff3452b8d2247
--- /dev/null
+++ b/.gitignore.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: © nobody
+SPDX-License-Identifier: CC0-1.0
diff --git a/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0e259d42c996742e9e3cba14c677129b2c1b6311
--- /dev/null
+++ b/LICENSES/CC0-1.0.txt
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+    LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+    INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+    REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+    PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+    THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+    HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+  i. the right to reproduce, adapt, distribute, perform, display,
+     communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+     likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+     subject to the limitations in paragraph 4(a), below;
+  v. rights protecting the extraction, dissemination, use and reuse of data
+     in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+     European Parliament and of the Council of 11 March 1996 on the legal
+     protection of databases, and under any national implementation
+     thereof, including any amended or successor version of such
+     directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+     world based on applicable law or treaty, and any national
+     implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+    surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+    warranties of any kind concerning the Work, express, implied,
+    statutory or otherwise, including without limitation warranties of
+    title, merchantability, fitness for a particular purpose, non
+    infringement, or the absence of latent or other defects, accuracy, or
+    the present or absence of errors, whether or not discoverable, all to
+    the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+    that may apply to the Work or any use thereof, including without
+    limitation any person's Copyright and Related Rights in the Work.
+    Further, Affirmer disclaims responsibility for obtaining any necessary
+    consents, permissions or other rights required for any use of the
+    Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+    party to this document and has no duty or obligation with respect to
+    this CC0 or use of the Work.
diff --git a/LICENSES/EUPL-1.2.txt b/LICENSES/EUPL-1.2.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6d8cea430e21d06532225018850da91a3f44abf5
--- /dev/null
+++ b/LICENSES/EUPL-1.2.txt
@@ -0,0 +1,190 @@
+EUROPEAN UNION PUBLIC LICENCE v. 1.2
+EUPL © the European Union 2007, 2016
+
+This European Union Public Licence (the EUPL) applies to the Work (as defined below) which is provided under the
+terms of this Licence. Any use of the Work, other than as authorised under this Licence is prohibited (to the extent such
+use is covered by a right of the copyright holder of the Work).
+The Work is provided under the terms of this Licence when the Licensor (as defined below) has placed the following
+notice immediately following the copyright notice for the Work:
+                          Licensed under the EUPL
+or has expressed by any other means his willingness to license under the EUPL.
+
+1.Definitions
+In this Licence, the following terms have the following meaning:
+ The Licence:this Licence.
+ The Original Work:the work or software distributed or communicated by the Licensor under this Licence, available
+as Source Code and also as Executable Code as the case may be.
+ Derivative Works:the works or software that could be created by the Licensee, based upon the Original Work or
+modifications thereof. This Licence does not define the extent of modification or dependence on the Original Work
+required in order to classify a work as a Derivative Work; this extent is determined by copyright law applicable in
+the country mentioned in Article 15.
+ The Work:the Original Work or its Derivative Works.
+ The Source Code:the human-readable form of the Work which is the most convenient for people to study and
+modify.
+ The Executable Code:any code which has generally been compiled and which is meant to be interpreted by
+a computer as a program.
+ The Licensor:the natural or legal person that distributes or communicates the Work under the Licence.
+ Contributor(s):any natural or legal person who modifies the Work under the Licence, or otherwise contributes to
+the creation of a Derivative Work.
+ The Licensee or You:any natural or legal person who makes any usage of the Work under the terms of the
+Licence.
+ Distribution or Communication:any act of selling, giving, lending, renting, distributing, communicating,
+transmitting, or otherwise making available, online or offline, copies of the Work or providing access to its essential
+functionalities at the disposal of any other natural or legal person.
+
+2.Scope of the rights granted by the Licence
+The Licensor hereby grants You a worldwide, royalty-free, non-exclusive, sublicensable licence to do the following, for
+the duration of copyright vested in the Original Work:
+ use the Work in any circumstance and for all usage,
+ reproduce the Work,
+ modify the Work, and make Derivative Works based upon the Work,
+ communicate to the public, including the right to make available or display the Work or copies thereof to the public
+and perform publicly, as the case may be, the Work,
+ distribute the Work or copies thereof,
+ lend and rent the Work or copies thereof,
+ sublicense rights in the Work or copies thereof.
+Those rights can be exercised on any media, supports and formats, whether now known or later invented, as far as the
+applicable law permits so.
+In the countries where moral rights apply, the Licensor waives his right to exercise his moral right to the extent allowed
+by law in order to make effective the licence of the economic rights here above listed.
+The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to any patents held by the Licensor, to the
+extent necessary to make use of the rights granted on the Work under this Licence.
+
+3.Communication of the Source Code
+The Licensor may provide the Work either in its Source Code form, or as Executable Code. If the Work is provided as
+Executable Code, the Licensor provides in addition a machine-readable copy of the Source Code of the Work along with
+each copy of the Work that the Licensor distributes or indicates, in a notice following the copyright notice attached to
+the Work, a repository where the Source Code is easily and freely accessible for as long as the Licensor continues to
+distribute or communicate the Work.
+
+4.Limitations on copyright
+Nothing in this Licence is intended to deprive the Licensee of the benefits from any exception or limitation to the
+exclusive rights of the rights owners in the Work, of the exhaustion of those rights or of other applicable limitations
+thereto.
+
+5.Obligations of the Licensee
+The grant of the rights mentioned above is subject to some restrictions and obligations imposed on the Licensee. Those
+obligations are the following:
+
+Attribution right: The Licensee shall keep intact all copyright, patent or trademarks notices and all notices that refer to
+the Licence and to the disclaimer of warranties. The Licensee must include a copy of such notices and a copy of the
+Licence with every copy of the Work he/she distributes or communicates. The Licensee must cause any Derivative Work
+to carry prominent notices stating that the Work has been modified and the date of modification.
+
+Copyleft clause: If the Licensee distributes or communicates copies of the Original Works or Derivative Works, this
+Distribution or Communication will be done under the terms of this Licence or of a later version of this Licence unless
+the Original Work is expressly distributed only under this version of the Licence  for example by communicating
+EUPL v. 1.2 only. The Licensee (becoming Licensor) cannot offer or impose any additional terms or conditions on the
+Work or Derivative Work that alter or restrict the terms of the Licence.
+
+Compatibility clause: If the Licensee Distributes or Communicates Derivative Works or copies thereof based upon both
+the Work and another work licensed under a Compatible Licence, this Distribution or Communication can be done
+under the terms of this Compatible Licence. For the sake of this clause, Compatible Licence refers to the licences listed
+in the appendix attached to this Licence. Should the Licensee's obligations under the Compatible Licence conflict with
+his/her obligations under this Licence, the obligations of the Compatible Licence shall prevail.
+
+Provision of Source Code: When distributing or communicating copies of the Work, the Licensee will provide
+a machine-readable copy of the Source Code or indicate a repository where this Source will be easily and freely available
+for as long as the Licensee continues to distribute or communicate the Work.
+Legal Protection: This Licence does not grant permission to use the trade names, trademarks, service marks, or names
+of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and
+reproducing the content of the copyright notice.
+
+6.Chain of Authorship
+The original Licensor warrants that the copyright in the Original Work granted hereunder is owned by him/her or
+licensed to him/her and that he/she has the power and authority to grant the Licence.
+Each Contributor warrants that the copyright in the modifications he/she brings to the Work are owned by him/her or
+licensed to him/her and that he/she has the power and authority to grant the Licence.
+Each time You accept the Licence, the original Licensor and subsequent Contributors grant You a licence to their contributions
+to the Work, under the terms of this Licence.
+
+7.Disclaimer of Warranty
+The Work is a work in progress, which is continuously improved by numerous Contributors. It is not a finished work
+and may therefore contain defects or bugs inherent to this type of development.
+For the above reason, the Work is provided under the Licence on an as is basis and without warranties of any kind
+concerning the Work, including without limitation merchantability, fitness for a particular purpose, absence of defects or
+errors, accuracy, non-infringement of intellectual property rights other than copyright as stated in Article 6 of this
+Licence.
+This disclaimer of warranty is an essential part of the Licence and a condition for the grant of any rights to the Work.
+
+8.Disclaimer of Liability
+Except in the cases of wilful misconduct or damages directly caused to natural persons, the Licensor will in no event be
+liable for any direct or indirect, material or moral, damages of any kind, arising out of the Licence or of the use of the
+Work, including without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, loss
+of data or any commercial damage, even if the Licensor has been advised of the possibility of such damage. However,
+the Licensor will be liable under statutory product liability laws as far such laws apply to the Work.
+
+9.Additional agreements
+While distributing the Work, You may choose to conclude an additional agreement, defining obligations or services
+consistent with this Licence. However, if accepting obligations, You may act only on your own behalf and on your sole
+responsibility, not on behalf of the original Licensor or any other Contributor, and only if You agree to indemnify,
+defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against such Contributor by
+the fact You have accepted any warranty or additional liability.
+
+10.Acceptance of the Licence
+The provisions of this Licence can be accepted by clicking on an icon I agree placed under the bottom of a window
+displaying the text of this Licence or by affirming consent in any other similar way, in accordance with the rules of
+applicable law. Clicking on that icon indicates your clear and irrevocable acceptance of this Licence and all of its terms
+and conditions.
+Similarly, you irrevocably accept this Licence and all of its terms and conditions by exercising any rights granted to You
+by Article 2 of this Licence, such as the use of the Work, the creation by You of a Derivative Work or the Distribution
+or Communication by You of the Work or copies thereof.
+
+11.Information to the public
+In case of any Distribution or Communication of the Work by means of electronic communication by You (for example,
+by offering to download the Work from a remote location) the distribution channel or media (for example, a website)
+must at least provide to the public the information requested by the applicable law regarding the Licensor, the Licence
+and the way it may be accessible, concluded, stored and reproduced by the Licensee.
+
+12.Termination of the Licence
+The Licence and the rights granted hereunder will terminate automatically upon any breach by the Licensee of the terms
+of the Licence.
+Such a termination will not terminate the licences of any person who has received the Work from the Licensee under
+the Licence, provided such persons remain in full compliance with the Licence.
+
+13.Miscellaneous
+Without prejudice of Article 9 above, the Licence represents the complete agreement between the Parties as to the
+Work.
+If any provision of the Licence is invalid or unenforceable under applicable law, this will not affect the validity or
+enforceability of the Licence as a whole. Such provision will be construed or reformed so as necessary to make it valid
+and enforceable.
+The European Commission may publish other linguistic versions or new versions of this Licence or updated versions of
+the Appendix, so far this is required and reasonable, without reducing the scope of the rights granted by the Licence.
+New versions of the Licence will be published with a unique version number.
+All linguistic versions of this Licence, approved by the European Commission, have identical value. Parties can take
+advantage of the linguistic version of their choice.
+
+14.Jurisdiction
+Without prejudice to specific agreement between parties,
+ any litigation resulting from the interpretation of this License, arising between the European Union institutions,
+bodies, offices or agencies, as a Licensor, and any Licensee, will be subject to the jurisdiction of the Court of Justice
+of the European Union, as laid down in article 272 of the Treaty on the Functioning of the European Union,
+ any litigation arising between other parties and resulting from the interpretation of this License, will be subject to
+the exclusive jurisdiction of the competent court where the Licensor resides or conducts its primary business.
+
+15.Applicable Law
+Without prejudice to specific agreement between parties,
+ this Licence shall be governed by the law of the European Union Member State where the Licensor has his seat,
+resides or has his registered office,
+ this licence shall be governed by Belgian law if the Licensor has no seat, residence or registered office inside
+a European Union Member State.
+
+
+                                                         Appendix
+
+Compatible Licences according to Article 5 EUPL are:
+ GNU General Public License (GPL) v. 2, v. 3
+ GNU Affero General Public License (AGPL) v. 3
+ Open Software License (OSL) v. 2.1, v. 3.0
+ Eclipse Public License (EPL) v. 1.0
+ CeCILL v. 2.0, v. 2.1
+ Mozilla Public Licence (MPL) v. 2
+ GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3
+ Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for works other than software
+ European Union Public Licence (EUPL) v. 1.1, v. 1.2
+ Québec Free and Open-Source Licence  Reciprocity (LiLiQ-R) or Strong Reciprocity (LiLiQ-R+).
+
+The European Commission may update this Appendix to later versions of the above licences without producing
+a new version of the EUPL, as long as they provide the rights granted in Article 2 of this Licence and protect the
+covered Source Code from exclusive appropriation.
+All other changes or additions to this Appendix require the production of a new EUPL version.
diff --git a/Makefile b/Makefile
index e033c8c41524ea3c2a92e78cba0ba9b0e339e60f..389eb669df4692d28d46496a3e70c6cf0d6fb3ef 100644
--- a/Makefile
+++ b/Makefile
@@ -1,3 +1,5 @@
+# SPDX-FileCopyrightText: © nobody
+# SPDX-License-Identifier: CC0-1.0
 GO?=$(shell which go)
 GOEXE:=$(shell go env GOEXE)
 BUILD_OPTS?=-trimpath -v
diff --git a/README.md b/README.md
index fd098ce7b4d6ea92fa917e169a8dabcc4d350191..98d78ef60f8a658a8c9d7003d27eb4e03a1d6763 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,10 @@
+<!--
+SPDX-FileCopyrightText: © nobody
+SPDX-License-Identifier: CC0-1.0
+-->
 # 4WD
+
+[![REUSE status](https://api.reuse.software/badge/git.sr.ht/~mpldr/4wd)](https://api.reuse.software/info/git.sr.ht/~mpldr/4wd)
 
 Get forwarded.
 
diff --git a/go.mod b/go.mod
index be0da5a25e121e84d1a1041d69f9ab5ddf62da36..af12bfaa07c7a51a96a04f51dacfe3c59945c365 100644
--- a/go.mod
+++ b/go.mod
@@ -1,5 +1,8 @@
 module mpldr.codes/4wd
 
+// SPDX-FileCopyrightText: © nobody
+// SPDX-License-Identifier: CC0-1.0
+
 go 1.21.6
 
 require (
diff --git a/go.sum.license b/go.sum.license
new file mode 100644
index 0000000000000000000000000000000000000000..c1464e9a3503b28f5445fd1f5b5ff3452b8d2247
--- /dev/null
+++ b/go.sum.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: © nobody
+SPDX-License-Identifier: CC0-1.0
diff --git a/internal/config/config.go b/internal/config/config.go
index 805770e870202e0a5e2ab881ba7b92c78d3d1d97..e9048b0b08c811b54a76ec89ee101e5ea6df3792 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -1,5 +1,8 @@
 package config
 
+// SPDX-FileCopyrightText: © Moritz Poldrack & AUTHORS
+// SPDX-License-Identifier: EUPL-1.2
+
 import "github.com/caarlos0/env/v10"
 
 type Cfg struct {
diff --git a/internal/datastore/interface.go b/internal/datastore/interface.go
index 41714d6ee2c3b9053489ea724f7baa0f89dff8c8..d11368af0a1c0b4d9e071242d5ebc936942d0412 100644
--- a/internal/datastore/interface.go
+++ b/internal/datastore/interface.go
@@ -1,5 +1,8 @@
 package datastore
 
+// SPDX-FileCopyrightText: © Moritz Poldrack & AUTHORS
+// SPDX-License-Identifier: EUPL-1.2
+
 import "errors"
 
 type Interface interface {
diff --git a/internal/datastore/sqlite/queries.go b/internal/datastore/sqlite/queries.go
index e9e5cdb4548aaf0fc471e161209e932bf8b4554c..016c0d07e314f15750adc8f6da0a93ecec02481f 100644
--- a/internal/datastore/sqlite/queries.go
+++ b/internal/datastore/sqlite/queries.go
@@ -1,5 +1,8 @@
 package sqlite
 
+// SPDX-FileCopyrightText: © Moritz Poldrack & AUTHORS
+// SPDX-License-Identifier: EUPL-1.2
+
 import (
 	"database/sql"
 	"fmt"
diff --git a/internal/datastore/sqlite/schema.sql b/internal/datastore/sqlite/schema.sql
index e8cf947d9b429b91485ecd7de0b6414ada8844e4..0a8fd86797d096066e1c6c662e545d3128d9b3fb 100644
--- a/internal/datastore/sqlite/schema.sql
+++ b/internal/datastore/sqlite/schema.sql
@@ -1,3 +1,6 @@
+-- SPDX-FileCopyrightText: © Moritz Poldrack & AUTHORS
+-- SPDX-License-Identifier: EUPL-1.2
+
 CREATE TABLE redirections (
 	"ID"	TEXT NOT NULL,
 	"Destination"	TEXT NOT NULL,
diff --git a/internal/datastore/sqlite/setup.go b/internal/datastore/sqlite/setup.go
index e44827db400a5c4c78b85cecf6525eb7aa750abb..f3c210d99c1ce50197c9782542644a0db6bdf183 100644
--- a/internal/datastore/sqlite/setup.go
+++ b/internal/datastore/sqlite/setup.go
@@ -1,5 +1,8 @@
 package sqlite
 
+// SPDX-FileCopyrightText: © Moritz Poldrack & AUTHORS
+// SPDX-License-Identifier: EUPL-1.2
+
 import (
 	"database/sql"
 	_ "embed"
diff --git a/internal/datastore/sqlite/type.go b/internal/datastore/sqlite/type.go
index c9b8046b6f0b1c725e2bfa142b6d628e33aa58cc..bc848fdf4ea35b607bd8f7aaf65f5a497ffd6700 100644
--- a/internal/datastore/sqlite/type.go
+++ b/internal/datastore/sqlite/type.go
@@ -1,5 +1,8 @@
 package sqlite
 
+// SPDX-FileCopyrightText: © Moritz Poldrack & AUTHORS
+// SPDX-License-Identifier: EUPL-1.2
+
 import (
 	"database/sql"
 	"errors"
diff --git a/internal/datastore/types.go b/internal/datastore/types.go
index 849451e8429ae410512b57ffde29809843c3b780..565f814b33602bf3f08fc2d3fe768d4b3fee963d 100644
--- a/internal/datastore/types.go
+++ b/internal/datastore/types.go
@@ -1,5 +1,8 @@
 package datastore
 
+// SPDX-FileCopyrightText: © Moritz Poldrack & AUTHORS
+// SPDX-License-Identifier: EUPL-1.2
+
 type Redirect struct {
 	Short string
 	URL   string
diff --git a/main.go b/main.go
index 67ba7bb297c1b401684c3bdc83cbe00a95260892..2c5cbfe33362120a3392c4c63f465d4ecd9238fc 100644
--- a/main.go
+++ b/main.go
@@ -1,5 +1,8 @@
 package main
 
+// SPDX-FileCopyrightText: © Moritz Poldrack & AUTHORS
+// SPDX-License-Identifier: EUPL-1.2
+
 import (
 	"fmt"
 	"net/url"
diff --git a/ui/.gitignore.license b/ui/.gitignore.license
new file mode 100644
index 0000000000000000000000000000000000000000..c1464e9a3503b28f5445fd1f5b5ff3452b8d2247
--- /dev/null
+++ b/ui/.gitignore.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: © nobody
+SPDX-License-Identifier: CC0-1.0
diff --git a/ui/Makefile b/ui/Makefile
index 1d2160c3517307d50e7705d876d2ccb5f41d264d..515c504f628d2464088950dbe13159efcfa5ebf3 100644
--- a/ui/Makefile
+++ b/ui/Makefile
@@ -1,3 +1,5 @@
+# SPDX-FileCopyrightText: © nobody
+# SPDX-License-Identifier: CC0-1.0
 WEBSRC!=find html/ -type f
 WEBTARGETS:=$(subst html/,dist/,$(WEBSRC))
 
diff --git a/ui/dist/.gitignore.license b/ui/dist/.gitignore.license
new file mode 100644
index 0000000000000000000000000000000000000000..c1464e9a3503b28f5445fd1f5b5ff3452b8d2247
--- /dev/null
+++ b/ui/dist/.gitignore.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: © nobody
+SPDX-License-Identifier: CC0-1.0
diff --git a/ui/elm.json.license b/ui/elm.json.license
new file mode 100644
index 0000000000000000000000000000000000000000..b54dad90bbee9f9dab99a0ac09c36dc5497fe833
--- /dev/null
+++ b/ui/elm.json.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: © Moritz Poldrack & AUTHORS
+SPDX-License-Identifier: EUPL-1.2
diff --git a/ui/html/index.html b/ui/html/index.html
index 794385e5013af8a0349a7f5ac5410a3db447367a..18c678678614d94723228839a262f3c166c2abe9 100644
--- a/ui/html/index.html
+++ b/ui/html/index.html
@@ -1,4 +1,8 @@
 <!DOCTYPE html>
+<!--
+SPDX-FileCopyrightText: © nobody
+SPDX-License-Identifier: EUPL-1.2
+-->
 <html>
 	<head>
 		<title>4WD</title>
diff --git a/ui/html/index.js b/ui/html/index.js
index 734619a92b1caef27513ac49cac238372fc484c9..4150d3c903dd06dc965efdd888e1d53779518965 100644
--- a/ui/html/index.js
+++ b/ui/html/index.js
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: © Moritz Poldrack & AUTHORS
+// SPDX-License-Identifier: EUPL-1.2
+
 function getCookie(name) {
 	const value = `; ${document.cookie}`;
 	const parts = value.split(`; ${name}=`);
diff --git a/ui/src/Main.elm b/ui/src/Main.elm
index 33529b52bcc3d3600f4fa82ff00e1bb6caadd22a..9f338bb42791d2770ff1858754c8141ee3d9c184 100644
--- a/ui/src/Main.elm
+++ b/ui/src/Main.elm
@@ -1,5 +1,8 @@
 module Main exposing (..)
 
+-- SPDX-FileCopyrightText: © Moritz Poldrack & AUTHORS
+-- SPDX-License-Identifier: EUPL-1.2
+
 import Browser
 import Html exposing (Html, div, form, input, button, text, section, footer, h1, h2, table, thead, th, tr, tbody, td, a, p, strong)
 import Html.Attributes exposing (placeholder, type_, class, href, title)
diff --git a/ui/src/Ports.elm b/ui/src/Ports.elm
index 738ecb441f3145d6586f2652bbd6b536edf84247..1dd8414b3cb196e5480708f388e45e4ec97f2087 100644
--- a/ui/src/Ports.elm
+++ b/ui/src/Ports.elm
@@ -1,4 +1,7 @@
 port module Ports exposing (fetchUserToken,tokenReceiver)
 
+-- SPDX-FileCopyrightText: © Moritz Poldrack & AUTHORS
+-- SPDX-License-Identifier: EUPL-1.2
+
 port fetchUserToken : () -> Cmd msg
 port tokenReceiver : (String -> msg) -> Sub msg