+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Consumer that generates user mentions for comments."""
from amqpy import Message
diff --git a/tildes/consumers/topic_metadata_generator.py b/tildes/consumers/topic_metadata_generator.py
index fc8fa92..d1710ef 100644
--- a/tildes/consumers/topic_metadata_generator.py
+++ b/tildes/consumers/topic_metadata_generator.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Consumer that generates content_metadata for topics."""
from typing import Sequence
diff --git a/tildes/scripts/breached_passwords.py b/tildes/scripts/breached_passwords.py
index aaa025d..234f9cf 100644
--- a/tildes/scripts/breached_passwords.py
+++ b/tildes/scripts/breached_passwords.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Command-line tools for managing a breached-passwords bloom filter.
This tool will help with creating and updating a bloom filter in Redis (using ReBloom:
diff --git a/tildes/scripts/clean_private_data.py b/tildes/scripts/clean_private_data.py
index cb0d84c..f7ec808 100644
--- a/tildes/scripts/clean_private_data.py
+++ b/tildes/scripts/clean_private_data.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Script for cleaning up private/deleted data.
Other things that should probably be added here eventually:
diff --git a/tildes/scripts/initialize_db.py b/tildes/scripts/initialize_db.py
index c7bd111..e0655a9 100644
--- a/tildes/scripts/initialize_db.py
+++ b/tildes/scripts/initialize_db.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Script for doing the initial setup of database tables."""
# pylint: disable=wrong-import-order
diff --git a/tildes/scripts/site-icons-spriter/css_template.jinja2 b/tildes/scripts/site-icons-spriter/css_template.jinja2
index c58b9fa..aafbb3f 100644
--- a/tildes/scripts/site-icons-spriter/css_template.jinja2
+++ b/tildes/scripts/site-icons-spriter/css_template.jinja2
@@ -1,3 +1,6 @@
+{# Copyright (c) 2018 Tildes contributors #}
+{# SPDX-License-Identifier: AGPL-3.0-or-later #}
+
{% for r, ratio in ratios.items() %}
{% if ratio.ratio == 1.0 %}
.topic-icon {
diff --git a/tildes/scss/_base.scss b/tildes/scss/_base.scss
index 61eda0e..a00b34b 100644
--- a/tildes/scss/_base.scss
+++ b/tildes/scss/_base.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
// Styles for base elements only (no classes, IDs, etc.)
// Includes overrides for Spectre.css base element styles as well
diff --git a/tildes/scss/_layout.scss b/tildes/scss/_layout.scss
index 543c7cc..6c30906 100644
--- a/tildes/scss/_layout.scss
+++ b/tildes/scss/_layout.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
body {
@supports (display: grid) {
display: grid;
diff --git a/tildes/scss/_mixins.scss b/tildes/scss/_mixins.scss
index afba587..ea10a14 100644
--- a/tildes/scss/_mixins.scss
+++ b/tildes/scss/_mixins.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
// shrinks a font size by 0.1rem on mobile screen sizes
@mixin font-shrink-on-mobile($base-size) {
font-size: $base-size - 0.1rem;
diff --git a/tildes/scss/_themes.scss b/tildes/scss/_themes.scss
index ac82454..a6cce8c 100644
--- a/tildes/scss/_themes.scss
+++ b/tildes/scss/_themes.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
// This file should only contain rules that need to differ between the
// different themes, defined inside the `theme-dependent` mixin below.
// Note that all rules inside the mixin will be included in the compiled CSS
diff --git a/tildes/scss/modules/_btn.scss b/tildes/scss/modules/_btn.scss
index 7acc525..46311d2 100644
--- a/tildes/scss/modules/_btn.scss
+++ b/tildes/scss/modules/_btn.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.btn {
@include min-touch-size;
diff --git a/tildes/scss/modules/_comment.scss b/tildes/scss/modules/_comment.scss
index 8ac06be..e826769 100644
--- a/tildes/scss/modules/_comment.scss
+++ b/tildes/scss/modules/_comment.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.comment {
border-left: 1px solid;
margin-bottom: 0.4rem;
diff --git a/tildes/scss/modules/_divider.scss b/tildes/scss/modules/_divider.scss
index e80428b..e549f4f 100644
--- a/tildes/scss/modules/_divider.scss
+++ b/tildes/scss/modules/_divider.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.divider, .divider[data-content] {
margin: 1rem;
}
diff --git a/tildes/scss/modules/_empty.scss b/tildes/scss/modules/_empty.scss
index 6d344f4..143c6f2 100644
--- a/tildes/scss/modules/_empty.scss
+++ b/tildes/scss/modules/_empty.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.empty {
background: inherit;
color: inherit;
diff --git a/tildes/scss/modules/_form.scss b/tildes/scss/modules/_form.scss
index c179059..41e400c 100644
--- a/tildes/scss/modules/_form.scss
+++ b/tildes/scss/modules/_form.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.form-narrow {
max-width: 20rem;
}
diff --git a/tildes/scss/modules/_group.scss b/tildes/scss/modules/_group.scss
index d5a15bc..e4cab14 100644
--- a/tildes/scss/modules/_group.scss
+++ b/tildes/scss/modules/_group.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.group-list {
.link-group {
font-weight: bold;
diff --git a/tildes/scss/modules/_heading.scss b/tildes/scss/modules/_heading.scss
index e28cb47..1839a60 100644
--- a/tildes/scss/modules/_heading.scss
+++ b/tildes/scss/modules/_heading.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.heading-main {
font-weight: bold;
}
diff --git a/tildes/scss/modules/_input.scss b/tildes/scss/modules/_input.scss
index 9940d70..d115d8f 100644
--- a/tildes/scss/modules/_input.scss
+++ b/tildes/scss/modules/_input.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.input-invite-code {
margin-bottom: 0.4rem;
}
diff --git a/tildes/scss/modules/_label.scss b/tildes/scss/modules/_label.scss
index 82a5421..5eb6414 100644
--- a/tildes/scss/modules/_label.scss
+++ b/tildes/scss/modules/_label.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.label {
font-size: 0.6rem;
}
diff --git a/tildes/scss/modules/_link.scss b/tildes/scss/modules/_link.scss
index 52418e5..79357f2 100644
--- a/tildes/scss/modules/_link.scss
+++ b/tildes/scss/modules/_link.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
a.link-user, a.link-group {
&:visited {
color: $blue;
diff --git a/tildes/scss/modules/_listing.scss b/tildes/scss/modules/_listing.scss
index 94210af..e5677b0 100644
--- a/tildes/scss/modules/_listing.scss
+++ b/tildes/scss/modules/_listing.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.listing-options {
display: flex;
flex-wrap: wrap;
diff --git a/tildes/scss/modules/_logged-in-user.scss b/tildes/scss/modules/_logged-in-user.scss
index fcd22df..64db3c7 100644
--- a/tildes/scss/modules/_logged-in-user.scss
+++ b/tildes/scss/modules/_logged-in-user.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.logged-in-user-info {
font-size: 0.8rem;
diff --git a/tildes/scss/modules/_message.scss b/tildes/scss/modules/_message.scss
index e962f6a..2fb347a 100644
--- a/tildes/scss/modules/_message.scss
+++ b/tildes/scss/modules/_message.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.message {
margin-bottom: 0.4rem;
border: 1px solid;
diff --git a/tildes/scss/modules/_nav.scss b/tildes/scss/modules/_nav.scss
index 415a09e..f5611aa 100644
--- a/tildes/scss/modules/_nav.scss
+++ b/tildes/scss/modules/_nav.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.nav {
li {
font-size: 0.6rem;
diff --git a/tildes/scss/modules/_pagination.scss b/tildes/scss/modules/_pagination.scss
index 0493f70..243cddc 100644
--- a/tildes/scss/modules/_pagination.scss
+++ b/tildes/scss/modules/_pagination.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.page-item {
font-size: 0.6rem;
height: auto;
diff --git a/tildes/scss/modules/_post-buttons.scss b/tildes/scss/modules/_post-buttons.scss
index d7a5fe1..19c345d 100644
--- a/tildes/scss/modules/_post-buttons.scss
+++ b/tildes/scss/modules/_post-buttons.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.post-buttons {
display: flex;
flex-wrap: wrap;
diff --git a/tildes/scss/modules/_post.scss b/tildes/scss/modules/_post.scss
index 81269ee..86d45dc 100644
--- a/tildes/scss/modules/_post.scss
+++ b/tildes/scss/modules/_post.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.post-listing {
list-style-type: none;
margin-left: 0;
diff --git a/tildes/scss/modules/_settings.scss b/tildes/scss/modules/_settings.scss
index c6bfcae..d962c81 100644
--- a/tildes/scss/modules/_settings.scss
+++ b/tildes/scss/modules/_settings.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.settings-list {
list-style-type: none;
diff --git a/tildes/scss/modules/_sidebar.scss b/tildes/scss/modules/_sidebar.scss
index 7106908..20211cf 100644
--- a/tildes/scss/modules/_sidebar.scss
+++ b/tildes/scss/modules/_sidebar.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
#sidebar {
p {
margin-bottom: 0.4rem;
diff --git a/tildes/scss/modules/_site-footer.scss b/tildes/scss/modules/_site-footer.scss
index ae87b9e..d9c6924 100644
--- a/tildes/scss/modules/_site-footer.scss
+++ b/tildes/scss/modules/_site-footer.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
#site-footer {
padding: 0.2rem;
padding-bottom: 1rem;
diff --git a/tildes/scss/modules/_site-header.scss b/tildes/scss/modules/_site-header.scss
index 708d5a9..0c84b82 100644
--- a/tildes/scss/modules/_site-header.scss
+++ b/tildes/scss/modules/_site-header.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
#site-header {
.logged-in-user-info {
// hidden on small screens
diff --git a/tildes/scss/modules/_tab.scss b/tildes/scss/modules/_tab.scss
index 9bd7a19..4bf9c51 100644
--- a/tildes/scss/modules/_tab.scss
+++ b/tildes/scss/modules/_tab.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.tab-listing-order {
flex-wrap: nowrap;
padding-left: 0;
diff --git a/tildes/scss/modules/_text.scss b/tildes/scss/modules/_text.scss
index 4a03812..e5c4f2f 100644
--- a/tildes/scss/modules/_text.scss
+++ b/tildes/scss/modules/_text.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.text-small {
font-size: 0.6rem;
line-height: 0.9rem;
diff --git a/tildes/scss/modules/_time.scss b/tildes/scss/modules/_time.scss
index 795658d..5ee7295 100644
--- a/tildes/scss/modules/_time.scss
+++ b/tildes/scss/modules/_time.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
// abbreviated timestamp - only displays on small screens
.time-responsive::after {
content: attr(data-abbreviated);
diff --git a/tildes/scss/modules/_toast.scss b/tildes/scss/modules/_toast.scss
index 879e93c..2a7aaea 100644
--- a/tildes/scss/modules/_toast.scss
+++ b/tildes/scss/modules/_toast.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.toast {
margin: 1rem 0;
font-weight: bold;
diff --git a/tildes/scss/modules/_topic.scss b/tildes/scss/modules/_topic.scss
index 2307fcc..57789b9 100644
--- a/tildes/scss/modules/_topic.scss
+++ b/tildes/scss/modules/_topic.scss
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
.topic-listing {
list-style-type: none;
margin: 0;
diff --git a/tildes/sql/init/insert_base_data.sql b/tildes/sql/init/insert_base_data.sql
index 574b0d8..9b1b3bc 100644
--- a/tildes/sql/init/insert_base_data.sql
+++ b/tildes/sql/init/insert_base_data.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
-- add an "unknown user" for re-assigning deleted comments to after they're
-- outside the retention period, and similar uses
INSERT INTO users (user_id, username, password_hash)
diff --git a/tildes/sql/init/rabbitmq_functions.sql b/tildes/sql/init/rabbitmq_functions.sql
index 576ca7d..0284d6b 100644
--- a/tildes/sql/init/rabbitmq_functions.sql
+++ b/tildes/sql/init/rabbitmq_functions.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
CREATE OR REPLACE FUNCTION send_rabbitmq_message(routing_key TEXT, message TEXT) RETURNS VOID AS $$
SELECT pg_notify('pgsql_events', routing_key || '|' || message);
$$ STABLE LANGUAGE SQL;
diff --git a/tildes/sql/init/triggers/comment_notifications/users.sql b/tildes/sql/init/triggers/comment_notifications/users.sql
index f7c8dbc..a433993 100644
--- a/tildes/sql/init/triggers/comment_notifications/users.sql
+++ b/tildes/sql/init/triggers/comment_notifications/users.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
CREATE OR REPLACE FUNCTION update_users_num_unread_notifications() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
diff --git a/tildes/sql/init/triggers/comment_votes/comments.sql b/tildes/sql/init/triggers/comment_votes/comments.sql
index 39578c4..1bd31d1 100644
--- a/tildes/sql/init/triggers/comment_votes/comments.sql
+++ b/tildes/sql/init/triggers/comment_votes/comments.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
CREATE OR REPLACE FUNCTION update_comment_num_votes() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
diff --git a/tildes/sql/init/triggers/comments/comment_notifications.sql b/tildes/sql/init/triggers/comments/comment_notifications.sql
index 3a91e53..e211c46 100644
--- a/tildes/sql/init/triggers/comments/comment_notifications.sql
+++ b/tildes/sql/init/triggers/comments/comment_notifications.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
-- delete any notifications related to a comment when it's deleted or removed
CREATE OR REPLACE FUNCTION delete_comment_notifications() RETURNS TRIGGER AS $$
BEGIN
diff --git a/tildes/sql/init/triggers/comments/comments.sql b/tildes/sql/init/triggers/comments/comments.sql
index 46427ab..6f99e13 100644
--- a/tildes/sql/init/triggers/comments/comments.sql
+++ b/tildes/sql/init/triggers/comments/comments.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
-- set comment.deleted_time when is_deleted changes
CREATE OR REPLACE FUNCTION set_comment_deleted_time() RETURNS TRIGGER AS $$
BEGIN
diff --git a/tildes/sql/init/triggers/comments/rabbitmq.sql b/tildes/sql/init/triggers/comments/rabbitmq.sql
index 819ed1a..457ed1a 100644
--- a/tildes/sql/init/triggers/comments/rabbitmq.sql
+++ b/tildes/sql/init/triggers/comments/rabbitmq.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
CREATE OR REPLACE FUNCTION send_rabbitmq_message_for_comment() RETURNS TRIGGER AS $$
DECLARE
affected_row RECORD;
diff --git a/tildes/sql/init/triggers/comments/topic_visits.sql b/tildes/sql/init/triggers/comments/topic_visits.sql
index 3a2e048..73e4e40 100644
--- a/tildes/sql/init/triggers/comments/topic_visits.sql
+++ b/tildes/sql/init/triggers/comments/topic_visits.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
-- increment a user's topic visit comment count when they post a comment
CREATE OR REPLACE FUNCTION increment_user_topic_visit_num_comments() RETURNS TRIGGER AS $$
BEGIN
diff --git a/tildes/sql/init/triggers/comments/topics.sql b/tildes/sql/init/triggers/comments/topics.sql
index c274431..ec35903 100644
--- a/tildes/sql/init/triggers/comments/topics.sql
+++ b/tildes/sql/init/triggers/comments/topics.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
CREATE OR REPLACE FUNCTION update_topics_num_comments() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
diff --git a/tildes/sql/init/triggers/group_subscriptions/groups.sql b/tildes/sql/init/triggers/group_subscriptions/groups.sql
index ab661c0..383de12 100644
--- a/tildes/sql/init/triggers/group_subscriptions/groups.sql
+++ b/tildes/sql/init/triggers/group_subscriptions/groups.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
CREATE OR REPLACE FUNCTION update_group_subscription_count() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
diff --git a/tildes/sql/init/triggers/message_conversations/users.sql b/tildes/sql/init/triggers/message_conversations/users.sql
index 9e09fbd..b4ec185 100644
--- a/tildes/sql/init/triggers/message_conversations/users.sql
+++ b/tildes/sql/init/triggers/message_conversations/users.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
CREATE OR REPLACE FUNCTION update_users_num_unread_messages() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
diff --git a/tildes/sql/init/triggers/message_replies/message_conversations.sql b/tildes/sql/init/triggers/message_replies/message_conversations.sql
index b0f48fb..8d89b1f 100644
--- a/tildes/sql/init/triggers/message_replies/message_conversations.sql
+++ b/tildes/sql/init/triggers/message_replies/message_conversations.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
CREATE OR REPLACE FUNCTION update_conversation() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
diff --git a/tildes/sql/init/triggers/topic_votes/topics.sql b/tildes/sql/init/triggers/topic_votes/topics.sql
index 60bc558..d52f8ad 100644
--- a/tildes/sql/init/triggers/topic_votes/topics.sql
+++ b/tildes/sql/init/triggers/topic_votes/topics.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
CREATE OR REPLACE FUNCTION update_topic_num_votes() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
diff --git a/tildes/sql/init/triggers/topics/rabbitmq.sql b/tildes/sql/init/triggers/topics/rabbitmq.sql
index ffec211..670e6ee 100644
--- a/tildes/sql/init/triggers/topics/rabbitmq.sql
+++ b/tildes/sql/init/triggers/topics/rabbitmq.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
CREATE OR REPLACE FUNCTION send_rabbitmq_message_for_topic() RETURNS TRIGGER AS $$
DECLARE
affected_row RECORD;
diff --git a/tildes/sql/init/triggers/topics/topics.sql b/tildes/sql/init/triggers/topics/topics.sql
index 6825a85..55424f5 100644
--- a/tildes/sql/init/triggers/topics/topics.sql
+++ b/tildes/sql/init/triggers/topics/topics.sql
@@ -1,3 +1,6 @@
+-- Copyright (c) 2018 Tildes contributors
+-- SPDX-License-Identifier: AGPL-3.0-or-later
+
-- set topic.deleted_time when it's deleted
CREATE OR REPLACE FUNCTION set_topic_deleted_time() RETURNS TRIGGER AS $$
BEGIN
diff --git a/tildes/static/js/behaviors/auto-focus.js b/tildes/static/js/behaviors/auto-focus.js
index 4f3252a..cb1cf63 100644
--- a/tildes/static/js/behaviors/auto-focus.js
+++ b/tildes/static/js/behaviors/auto-focus.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-auto-focus]', function() {
$input = $(this);
diff --git a/tildes/static/js/behaviors/autoselect-input.js b/tildes/static/js/behaviors/autoselect-input.js
index 5cd6118..5a3061f 100644
--- a/tildes/static/js/behaviors/autoselect-input.js
+++ b/tildes/static/js/behaviors/autoselect-input.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-autoselect-input]', function() {
$(this).click(function(event) {
$(this).select();
diff --git a/tildes/static/js/behaviors/autosubmit-on-change.js b/tildes/static/js/behaviors/autosubmit-on-change.js
index 4f1c5bf..bfcdc7c 100644
--- a/tildes/static/js/behaviors/autosubmit-on-change.js
+++ b/tildes/static/js/behaviors/autosubmit-on-change.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-autosubmit-on-change]', function() {
$(this).change(function(event) {
$(this).closest('form').submit();
diff --git a/tildes/static/js/behaviors/cancel-button.js b/tildes/static/js/behaviors/cancel-button.js
index 7fec9ed..a063a96 100644
--- a/tildes/static/js/behaviors/cancel-button.js
+++ b/tildes/static/js/behaviors/cancel-button.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-cancel-button]', function() {
$(this).click(function(event) {
var $parentForm = $(this).closest('form');
diff --git a/tildes/static/js/behaviors/comment-collapse-all-button.js b/tildes/static/js/behaviors/comment-collapse-all-button.js
index d90190b..40ab46f 100644
--- a/tildes/static/js/behaviors/comment-collapse-all-button.js
+++ b/tildes/static/js/behaviors/comment-collapse-all-button.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-comment-collapse-all-button]', function() {
$(this).click(function(event) {
// first uncollapse any individually collapsed comments
diff --git a/tildes/static/js/behaviors/comment-collapse-button.js b/tildes/static/js/behaviors/comment-collapse-button.js
index f277838..390e3a5 100644
--- a/tildes/static/js/behaviors/comment-collapse-button.js
+++ b/tildes/static/js/behaviors/comment-collapse-button.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-comment-collapse-button]', function() {
$(this).click(function(event) {
$this = $(this);
diff --git a/tildes/static/js/behaviors/comment-expand-all-button.js b/tildes/static/js/behaviors/comment-expand-all-button.js
index 53c5ce5..510b179 100644
--- a/tildes/static/js/behaviors/comment-expand-all-button.js
+++ b/tildes/static/js/behaviors/comment-expand-all-button.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-comment-expand-all-button]', function() {
$(this).click(function(event) {
$('.is-comment-collapsed, .is-comment-collapsed-individual').each(
diff --git a/tildes/static/js/behaviors/comment-parent-button.js b/tildes/static/js/behaviors/comment-parent-button.js
index d73d591..d250837 100644
--- a/tildes/static/js/behaviors/comment-parent-button.js
+++ b/tildes/static/js/behaviors/comment-parent-button.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-comment-parent-button]', function() {
$(this).click(function(event) {
var $comment = $(this).parents('.comment').first();
diff --git a/tildes/static/js/behaviors/comment-reply-button.js b/tildes/static/js/behaviors/comment-reply-button.js
index 40a0f13..016a0b9 100644
--- a/tildes/static/js/behaviors/comment-reply-button.js
+++ b/tildes/static/js/behaviors/comment-reply-button.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-comment-reply-button]', function() {
$(this).click(function(event) {
event.preventDefault();
diff --git a/tildes/static/js/behaviors/comment-tag-button.js b/tildes/static/js/behaviors/comment-tag-button.js
index b0b6ef7..4c354f8 100644
--- a/tildes/static/js/behaviors/comment-tag-button.js
+++ b/tildes/static/js/behaviors/comment-tag-button.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-comment-tag-button]', function() {
$(this).click(function(event) {
event.preventDefault();
diff --git a/tildes/static/js/behaviors/confirm-leave-page-unsaved.js b/tildes/static/js/behaviors/confirm-leave-page-unsaved.js
index 03a3f7d..fb83003 100644
--- a/tildes/static/js/behaviors/confirm-leave-page-unsaved.js
+++ b/tildes/static/js/behaviors/confirm-leave-page-unsaved.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-confirm-leave-page-unsaved]', function() {
$form = $(this);
$form.areYouSure();
diff --git a/tildes/static/js/behaviors/ctrl-enter-submit-form.js b/tildes/static/js/behaviors/ctrl-enter-submit-form.js
index 3e8715c..67c4e38 100644
--- a/tildes/static/js/behaviors/ctrl-enter-submit-form.js
+++ b/tildes/static/js/behaviors/ctrl-enter-submit-form.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-ctrl-enter-submit-form]', function() {
$(this).keydown(function(event) {
if ((event.ctrlKey || event.metaKey) &&
diff --git a/tildes/static/js/behaviors/external-links-new-tabs.js b/tildes/static/js/behaviors/external-links-new-tabs.js
index 20b90f3..fc3c58d 100644
--- a/tildes/static/js/behaviors/external-links-new-tabs.js
+++ b/tildes/static/js/behaviors/external-links-new-tabs.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-external-links-new-tabs]', function() {
// Open external links in topic, comment, and message text in new tabs
$(this).find('a').each(function() {
diff --git a/tildes/static/js/behaviors/fadeout-parent-on-success.js b/tildes/static/js/behaviors/fadeout-parent-on-success.js
index 9eae946..464f24a 100644
--- a/tildes/static/js/behaviors/fadeout-parent-on-success.js
+++ b/tildes/static/js/behaviors/fadeout-parent-on-success.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-fadeout-parent-on-success]', function() {
$(this).on('after.success.ic', function() {
$(this).parent().fadeOut('fast');
diff --git a/tildes/static/js/behaviors/hide-sidebar-if-open.js b/tildes/static/js/behaviors/hide-sidebar-if-open.js
index 19c0339..12e5806 100644
--- a/tildes/static/js/behaviors/hide-sidebar-if-open.js
+++ b/tildes/static/js/behaviors/hide-sidebar-if-open.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-hide-sidebar-if-open]', function() {
$(this).on('click', function(event) {
if ($('#sidebar').hasClass('is-sidebar-displayed')) {
diff --git a/tildes/static/js/behaviors/prevent-double-submit.js b/tildes/static/js/behaviors/prevent-double-submit.js
index 982f955..09302d8 100644
--- a/tildes/static/js/behaviors/prevent-double-submit.js
+++ b/tildes/static/js/behaviors/prevent-double-submit.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-prevent-double-submit]', function() {
$(this).on('beforeSend.ic', function(evt, elt, data, settings, xhr, requestId) {
var $form = $(this);
diff --git a/tildes/static/js/behaviors/remove-on-click.js b/tildes/static/js/behaviors/remove-on-click.js
index 51fd759..de38b0b 100644
--- a/tildes/static/js/behaviors/remove-on-click.js
+++ b/tildes/static/js/behaviors/remove-on-click.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-remove-on-click]', function() {
$(this).on('click', function() {
$(this).remove();
diff --git a/tildes/static/js/behaviors/remove-on-success.js b/tildes/static/js/behaviors/remove-on-success.js
index a1977dd..58ea210 100644
--- a/tildes/static/js/behaviors/remove-on-success.js
+++ b/tildes/static/js/behaviors/remove-on-success.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-remove-on-success]', function() {
$(this).on('after.success.ic', function() {
$(this).remove();
diff --git a/tildes/static/js/behaviors/sidebar-toggle.js b/tildes/static/js/behaviors/sidebar-toggle.js
index 3914646..570d820 100644
--- a/tildes/static/js/behaviors/sidebar-toggle.js
+++ b/tildes/static/js/behaviors/sidebar-toggle.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-sidebar-toggle]', function() {
$(this).click(function(event) {
event.preventDefault();
diff --git a/tildes/static/js/behaviors/theme-selector.js b/tildes/static/js/behaviors/theme-selector.js
index c05ac2c..53d70ec 100644
--- a/tildes/static/js/behaviors/theme-selector.js
+++ b/tildes/static/js/behaviors/theme-selector.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-theme-selector]', function() {
$(this).change(function(event) {
event.preventDefault();
diff --git a/tildes/static/js/behaviors/time-period-select.js b/tildes/static/js/behaviors/time-period-select.js
index 4605f60..bcd0284 100644
--- a/tildes/static/js/behaviors/time-period-select.js
+++ b/tildes/static/js/behaviors/time-period-select.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$.onmount('[data-js-time-period-select]', function() {
$(this).change(function(event) {
var periodValue = this.value;
diff --git a/tildes/static/js/scripts.js b/tildes/static/js/scripts.js
index f68023f..9ef0c79 100644
--- a/tildes/static/js/scripts.js
+++ b/tildes/static/js/scripts.js
@@ -1,3 +1,6 @@
+// Copyright (c) 2018 Tildes contributors
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
$(function() {
$.onmount();
diff --git a/tildes/tests/conftest.py b/tildes/tests/conftest.py
index 8877798..1cb8228 100644
--- a/tildes/tests/conftest.py
+++ b/tildes/tests/conftest.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from http.cookiejar import CookieJar
import os
diff --git a/tildes/tests/fixtures.py b/tildes/tests/fixtures.py
index abda44c..1a9f78b 100644
--- a/tildes/tests/fixtures.py
+++ b/tildes/tests/fixtures.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from pytest import fixture
from tildes.models.comment import Comment
diff --git a/tildes/tests/test_comment.py b/tildes/tests/test_comment.py
index 633bdb1..1f93889 100644
--- a/tildes/tests/test_comment.py
+++ b/tildes/tests/test_comment.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from datetime import timedelta
from freezegun import freeze_time
diff --git a/tildes/tests/test_comment_user_mentions.py b/tildes/tests/test_comment_user_mentions.py
index 5bd2b2e..a85d850 100644
--- a/tildes/tests/test_comment_user_mentions.py
+++ b/tildes/tests/test_comment_user_mentions.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from pytest import fixture
from sqlalchemy import and_
diff --git a/tildes/tests/test_datetime.py b/tildes/tests/test_datetime.py
index 04355e4..7826174 100644
--- a/tildes/tests/test_datetime.py
+++ b/tildes/tests/test_datetime.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from datetime import datetime, timedelta, timezone
from tildes.lib.datetime import descriptive_timedelta, utc_now
diff --git a/tildes/tests/test_group.py b/tildes/tests/test_group.py
index 99a8b59..0494d62 100644
--- a/tildes/tests/test_group.py
+++ b/tildes/tests/test_group.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from pytest import raises
from sqlalchemy.exc import IntegrityError
diff --git a/tildes/tests/test_hash.py b/tildes/tests/test_hash.py
index ac5d169..dabffe8 100644
--- a/tildes/tests/test_hash.py
+++ b/tildes/tests/test_hash.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from tildes.lib.hash import hash_string, is_match_for_hash
diff --git a/tildes/tests/test_id.py b/tildes/tests/test_id.py
index b4fb6a8..6224eb6 100644
--- a/tildes/tests/test_id.py
+++ b/tildes/tests/test_id.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Tests for ID-related functions."""
from pytest import raises
diff --git a/tildes/tests/test_markdown.py b/tildes/tests/test_markdown.py
index e0be956..9b500cf 100644
--- a/tildes/tests/test_markdown.py
+++ b/tildes/tests/test_markdown.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from tildes.lib.markdown import convert_markdown_to_safe_html
diff --git a/tildes/tests/test_markdown_field.py b/tildes/tests/test_markdown_field.py
index 788cc7d..bfaf34d 100644
--- a/tildes/tests/test_markdown_field.py
+++ b/tildes/tests/test_markdown_field.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from marshmallow import Schema, ValidationError
from pytest import raises
diff --git a/tildes/tests/test_messages.py b/tildes/tests/test_messages.py
index bf3824c..6e4002c 100644
--- a/tildes/tests/test_messages.py
+++ b/tildes/tests/test_messages.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from pyramid.security import principals_allowed_by_permission
from pytest import fixture, raises
diff --git a/tildes/tests/test_metrics.py b/tildes/tests/test_metrics.py
index 3d5a85e..db73ae9 100644
--- a/tildes/tests/test_metrics.py
+++ b/tildes/tests/test_metrics.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from tildes.metrics import _COUNTERS, _HISTOGRAMS
diff --git a/tildes/tests/test_ratelimit.py b/tildes/tests/test_ratelimit.py
index 5daaae6..bcddcbe 100644
--- a/tildes/tests/test_ratelimit.py
+++ b/tildes/tests/test_ratelimit.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from datetime import timedelta
from itertools import permutations
from random import randint
diff --git a/tildes/tests/test_simplestring_field.py b/tildes/tests/test_simplestring_field.py
index 919ddfe..2249df4 100644
--- a/tildes/tests/test_simplestring_field.py
+++ b/tildes/tests/test_simplestring_field.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from marshmallow import Schema, ValidationError
from pytest import raises
diff --git a/tildes/tests/test_string.py b/tildes/tests/test_string.py
index 795199c..4d20f12 100644
--- a/tildes/tests/test_string.py
+++ b/tildes/tests/test_string.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from tildes.lib.string import (
convert_to_url_slug,
truncate_string,
diff --git a/tildes/tests/test_title.py b/tildes/tests/test_title.py
index 3152332..a1db5bf 100644
--- a/tildes/tests/test_title.py
+++ b/tildes/tests/test_title.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from marshmallow.exceptions import ValidationError
from pytest import fixture, raises
diff --git a/tildes/tests/test_topic.py b/tildes/tests/test_topic.py
index e9c21fd..ba32e80 100644
--- a/tildes/tests/test_topic.py
+++ b/tildes/tests/test_topic.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from datetime import timedelta
from freezegun import freeze_time
diff --git a/tildes/tests/test_topic_permissions.py b/tildes/tests/test_topic_permissions.py
index b75721e..5663f33 100644
--- a/tildes/tests/test_topic_permissions.py
+++ b/tildes/tests/test_topic_permissions.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from pyramid.security import Authenticated, Everyone, principals_allowed_by_permission
diff --git a/tildes/tests/test_topic_tags.py b/tildes/tests/test_topic_tags.py
index 8db39a0..5fc8104 100644
--- a/tildes/tests/test_topic_tags.py
+++ b/tildes/tests/test_topic_tags.py
@@ -1,3 +1,7 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
+
def test_tags_whitespace_stripped(text_topic):
"""Ensure excess whitespace around tags gets stripped."""
text_topic.tags = [" one", "two ", " three "]
diff --git a/tildes/tests/test_triggers_comments.py b/tildes/tests/test_triggers_comments.py
index 7289f0b..454c6a8 100644
--- a/tildes/tests/test_triggers_comments.py
+++ b/tildes/tests/test_triggers_comments.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from tildes.models.comment import Comment
diff --git a/tildes/tests/test_url.py b/tildes/tests/test_url.py
index d55ab82..e284e6c 100644
--- a/tildes/tests/test_url.py
+++ b/tildes/tests/test_url.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from pytest import raises
from tildes.lib.url import get_domain_from_url
diff --git a/tildes/tests/test_user.py b/tildes/tests/test_user.py
index bdde590..5313525 100644
--- a/tildes/tests/test_user.py
+++ b/tildes/tests/test_user.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from marshmallow.exceptions import ValidationError
from pytest import raises
from sqlalchemy.exc import IntegrityError
diff --git a/tildes/tests/test_username.py b/tildes/tests/test_username.py
index 83b5028..05aa977 100644
--- a/tildes/tests/test_username.py
+++ b/tildes/tests/test_username.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from itertools import product
from tildes.schemas.user import (
diff --git a/tildes/tests/test_webassets.py b/tildes/tests/test_webassets.py
index 89a84d8..4385bd2 100644
--- a/tildes/tests/test_webassets.py
+++ b/tildes/tests/test_webassets.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
from webassets.loaders import YAMLLoader
diff --git a/tildes/tests/webtests/test_user_page.py b/tildes/tests/webtests/test_user_page.py
index 51254d4..6522ad3 100644
--- a/tildes/tests/webtests/test_user_page.py
+++ b/tildes/tests/webtests/test_user_page.py
@@ -1,3 +1,7 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
+
def test_loggedout_username_leak(webtest_loggedout, session_user):
"""Ensure responses from existing and nonexistent users are the same.
diff --git a/tildes/tests/webtests/test_user_settings.py b/tildes/tests/webtests/test_user_settings.py
index 6e61358..7ed59d2 100644
--- a/tildes/tests/webtests/test_user_settings.py
+++ b/tildes/tests/webtests/test_user_settings.py
@@ -1,3 +1,7 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
+
def test_render_theme_options(webtest):
"""Test that theme settings are being rendered."""
settings = webtest.get("/settings")
diff --git a/tildes/tildes/__init__.py b/tildes/tildes/__init__.py
index 6ec4b2f..ba8dfe1 100644
--- a/tildes/tildes/__init__.py
+++ b/tildes/tildes/__init__.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Configure and initialize the Pyramid app."""
from typing import Any, Callable, Dict, Optional, Tuple
diff --git a/tildes/tildes/api.py b/tildes/tildes/api.py
index dfa401d..c69ed44 100644
--- a/tildes/tildes/api.py
+++ b/tildes/tildes/api.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Versioned API classes (wrappers around cornice.Service)."""
from typing import Any
diff --git a/tildes/tildes/auth.py b/tildes/tildes/auth.py
index 8d3def3..be1a2ef 100644
--- a/tildes/tildes/auth.py
+++ b/tildes/tildes/auth.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Configuration and functionality related to authentication/authorization."""
from typing import Any, Optional, Sequence
diff --git a/tildes/tildes/database.py b/tildes/tildes/database.py
index 31c3777..0ddf888 100644
--- a/tildes/tildes/database.py
+++ b/tildes/tildes/database.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the database-related config updates and request methods."""
from typing import Callable, Type
diff --git a/tildes/tildes/enums.py b/tildes/tildes/enums.py
index 1492a15..66df640 100644
--- a/tildes/tildes/enums.py
+++ b/tildes/tildes/enums.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains Enum classes."""
import enum
diff --git a/tildes/tildes/jinja.py b/tildes/tildes/jinja.py
index 1b5f3ed..26e68b8 100644
--- a/tildes/tildes/jinja.py
+++ b/tildes/tildes/jinja.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains configuration, functions, etc. for the Jinja template system."""
from typing import Any
diff --git a/tildes/tildes/json.py b/tildes/tildes/json.py
index c5c6acd..57313f3 100644
--- a/tildes/tildes/json.py
+++ b/tildes/tildes/json.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains custom JSON serializers for Pyramid's renderer."""
from pyramid.config import Configurator
diff --git a/tildes/tildes/lib/amqp.py b/tildes/tildes/lib/amqp.py
index 391e631..b55461f 100644
--- a/tildes/tildes/lib/amqp.py
+++ b/tildes/tildes/lib/amqp.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains classes related to handling AMQP (rabbitmq) messages."""
from abc import abstractmethod
diff --git a/tildes/tildes/lib/database.py b/tildes/tildes/lib/database.py
index e046c4f..05d255a 100644
--- a/tildes/tildes/lib/database.py
+++ b/tildes/tildes/lib/database.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Constants/classes/functions related to the database."""
import enum
diff --git a/tildes/tildes/lib/datetime.py b/tildes/tildes/lib/datetime.py
index 640b421..d1027e3 100644
--- a/tildes/tildes/lib/datetime.py
+++ b/tildes/tildes/lib/datetime.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Functions/classes related to dates and times."""
from datetime import datetime, timedelta, timezone
diff --git a/tildes/tildes/lib/hash.py b/tildes/tildes/lib/hash.py
index 0116264..ecadfb3 100644
--- a/tildes/tildes/lib/hash.py
+++ b/tildes/tildes/lib/hash.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Functions/constants related to hashing."""
from argon2 import PasswordHasher
diff --git a/tildes/tildes/lib/id.py b/tildes/tildes/lib/id.py
index e2e71bb..6b331e6 100644
--- a/tildes/tildes/lib/id.py
+++ b/tildes/tildes/lib/id.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Library code related to IDs, ID36s, and so on."""
import re
diff --git a/tildes/tildes/lib/markdown.py b/tildes/tildes/lib/markdown.py
index 42b878b..523fc42 100644
--- a/tildes/tildes/lib/markdown.py
+++ b/tildes/tildes/lib/markdown.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Functions/constants related to markdown handling."""
import re
diff --git a/tildes/tildes/lib/message.py b/tildes/tildes/lib/message.py
index 9d4ad7d..d11c52f 100644
--- a/tildes/tildes/lib/message.py
+++ b/tildes/tildes/lib/message.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Functions/constants related to messages."""
WELCOME_MESSAGE_SUBJECT = "Welcome to the Tildes alpha"
diff --git a/tildes/tildes/lib/password.py b/tildes/tildes/lib/password.py
index 6d3abb6..9d857f3 100644
--- a/tildes/tildes/lib/password.py
+++ b/tildes/tildes/lib/password.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Functions/constants related to user passwords."""
from hashlib import sha1
diff --git a/tildes/tildes/lib/ratelimit.py b/tildes/tildes/lib/ratelimit.py
index 7046736..0edcee0 100644
--- a/tildes/tildes/lib/ratelimit.py
+++ b/tildes/tildes/lib/ratelimit.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Classes and constants related to rate-limited actions."""
from datetime import timedelta
diff --git a/tildes/tildes/lib/string.py b/tildes/tildes/lib/string.py
index 96df9fc..b61f6c0 100644
--- a/tildes/tildes/lib/string.py
+++ b/tildes/tildes/lib/string.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Functions related to processing/manipulating strings."""
import re
diff --git a/tildes/tildes/lib/url.py b/tildes/tildes/lib/url.py
index 72bc92c..ed88bed 100644
--- a/tildes/tildes/lib/url.py
+++ b/tildes/tildes/lib/url.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Functions related to URLs."""
from urllib.parse import urlparse
diff --git a/tildes/tildes/metrics.py b/tildes/tildes/metrics.py
index bee5220..c4268f0 100644
--- a/tildes/tildes/metrics.py
+++ b/tildes/tildes/metrics.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains Prometheus metric objects and functions for instrumentation."""
# The prometheus_client classes work in a pretty crazy way, need to disable these pylint
diff --git a/tildes/tildes/models/comment/comment.py b/tildes/tildes/models/comment/comment.py
index acac119..1cd2081 100644
--- a/tildes/tildes/models/comment/comment.py
+++ b/tildes/tildes/models/comment/comment.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the Comment class."""
from collections import Counter
diff --git a/tildes/tildes/models/comment/comment_notification.py b/tildes/tildes/models/comment/comment_notification.py
index c4cd48b..e075862 100644
--- a/tildes/tildes/models/comment/comment_notification.py
+++ b/tildes/tildes/models/comment/comment_notification.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the CommentNotification class."""
from datetime import datetime
diff --git a/tildes/tildes/models/comment/comment_notification_query.py b/tildes/tildes/models/comment/comment_notification_query.py
index b473947..71cc2ac 100644
--- a/tildes/tildes/models/comment/comment_notification_query.py
+++ b/tildes/tildes/models/comment/comment_notification_query.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the CommentNotificationQuery class."""
from typing import Any
diff --git a/tildes/tildes/models/comment/comment_query.py b/tildes/tildes/models/comment/comment_query.py
index a263683..de6e042 100644
--- a/tildes/tildes/models/comment/comment_query.py
+++ b/tildes/tildes/models/comment/comment_query.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the CommentQuery class."""
from typing import Any
diff --git a/tildes/tildes/models/comment/comment_tag.py b/tildes/tildes/models/comment/comment_tag.py
index fa782ee..f7c7a33 100644
--- a/tildes/tildes/models/comment/comment_tag.py
+++ b/tildes/tildes/models/comment/comment_tag.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the CommentTag class."""
from datetime import datetime
diff --git a/tildes/tildes/models/comment/comment_tree.py b/tildes/tildes/models/comment/comment_tree.py
index 424beb0..5a7bb1e 100644
--- a/tildes/tildes/models/comment/comment_tree.py
+++ b/tildes/tildes/models/comment/comment_tree.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the CommentTree class."""
from datetime import datetime
diff --git a/tildes/tildes/models/comment/comment_vote.py b/tildes/tildes/models/comment/comment_vote.py
index 6de55da..b982716 100644
--- a/tildes/tildes/models/comment/comment_vote.py
+++ b/tildes/tildes/models/comment/comment_vote.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the CommentVote class."""
from datetime import datetime
diff --git a/tildes/tildes/models/database_model.py b/tildes/tildes/models/database_model.py
index f49e187..2b59414 100644
--- a/tildes/tildes/models/database_model.py
+++ b/tildes/tildes/models/database_model.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the base DatabaseModel class."""
from typing import Any, Optional, Type, TypeVar
diff --git a/tildes/tildes/models/group/group.py b/tildes/tildes/models/group/group.py
index d970545..aa35438 100644
--- a/tildes/tildes/models/group/group.py
+++ b/tildes/tildes/models/group/group.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the Group class."""
from datetime import datetime
diff --git a/tildes/tildes/models/group/group_query.py b/tildes/tildes/models/group/group_query.py
index 13f8e4a..e2255b0 100644
--- a/tildes/tildes/models/group/group_query.py
+++ b/tildes/tildes/models/group/group_query.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the GroupQuery class."""
from typing import Any
diff --git a/tildes/tildes/models/group/group_subscription.py b/tildes/tildes/models/group/group_subscription.py
index 60fb1ef..109de11 100644
--- a/tildes/tildes/models/group/group_subscription.py
+++ b/tildes/tildes/models/group/group_subscription.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the GroupSubscription class."""
from datetime import datetime
diff --git a/tildes/tildes/models/log/log.py b/tildes/tildes/models/log/log.py
index a342fea..e8f9eaa 100644
--- a/tildes/tildes/models/log/log.py
+++ b/tildes/tildes/models/log/log.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the Log class."""
# pylint: disable=too-many-branches,too-many-return-statements
diff --git a/tildes/tildes/models/message/message.py b/tildes/tildes/models/message/message.py
index 203ff45..3451788 100644
--- a/tildes/tildes/models/message/message.py
+++ b/tildes/tildes/models/message/message.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the MessageConversation and MessageReply classes.
Note the difference between these two classes - MessageConversation represents both the
diff --git a/tildes/tildes/models/model_query.py b/tildes/tildes/models/model_query.py
index 3be0c6a..27b7b0f 100644
--- a/tildes/tildes/models/model_query.py
+++ b/tildes/tildes/models/model_query.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the ModelQuery class, a specialized SQLAlchemy Query subclass."""
# pylint: disable=self-cls-assignment
diff --git a/tildes/tildes/models/pagination.py b/tildes/tildes/models/pagination.py
index 73cfe14..162d6ca 100644
--- a/tildes/tildes/models/pagination.py
+++ b/tildes/tildes/models/pagination.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the PaginatedQuery and PaginatedResults classes."""
from typing import Any, Iterator, List, Optional, TypeVar
diff --git a/tildes/tildes/models/topic/topic.py b/tildes/tildes/models/topic/topic.py
index 876a8ed..523f586 100644
--- a/tildes/tildes/models/topic/topic.py
+++ b/tildes/tildes/models/topic/topic.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the Topic class."""
from datetime import datetime, timedelta
diff --git a/tildes/tildes/models/topic/topic_query.py b/tildes/tildes/models/topic/topic_query.py
index 5273acf..7c8ea83 100644
--- a/tildes/tildes/models/topic/topic_query.py
+++ b/tildes/tildes/models/topic/topic_query.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the TopicQuery class."""
from typing import Any, Sequence
diff --git a/tildes/tildes/models/topic/topic_visit.py b/tildes/tildes/models/topic/topic_visit.py
index 48a74ac..28e98c2 100644
--- a/tildes/tildes/models/topic/topic_visit.py
+++ b/tildes/tildes/models/topic/topic_visit.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the TopicVisit class."""
from datetime import datetime
diff --git a/tildes/tildes/models/topic/topic_vote.py b/tildes/tildes/models/topic/topic_vote.py
index 81f74fd..b5f9aa1 100644
--- a/tildes/tildes/models/topic/topic_vote.py
+++ b/tildes/tildes/models/topic/topic_vote.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the TopicVote class."""
from datetime import datetime
diff --git a/tildes/tildes/models/user/user.py b/tildes/tildes/models/user/user.py
index a0cf1f1..2a06d51 100644
--- a/tildes/tildes/models/user/user.py
+++ b/tildes/tildes/models/user/user.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the User class."""
from datetime import datetime
diff --git a/tildes/tildes/models/user/user_group_settings.py b/tildes/tildes/models/user/user_group_settings.py
index 893eff3..6ce48d2 100644
--- a/tildes/tildes/models/user/user_group_settings.py
+++ b/tildes/tildes/models/user/user_group_settings.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the UserGroupSettings class."""
from typing import Optional
diff --git a/tildes/tildes/models/user/user_invite_code.py b/tildes/tildes/models/user/user_invite_code.py
index 0249581..381b5b7 100644
--- a/tildes/tildes/models/user/user_invite_code.py
+++ b/tildes/tildes/models/user/user_invite_code.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains the UserInviteCode class."""
from datetime import datetime
diff --git a/tildes/tildes/resources/__init__.py b/tildes/tildes/resources/__init__.py
index 0e2a592..0406b95 100644
--- a/tildes/tildes/resources/__init__.py
+++ b/tildes/tildes/resources/__init__.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Contains Pyramid "resource" related code, such as root factories."""
from pyramid.httpexceptions import HTTPForbidden, HTTPNotFound
diff --git a/tildes/tildes/resources/comment.py b/tildes/tildes/resources/comment.py
index 026902a..7650788 100644
--- a/tildes/tildes/resources/comment.py
+++ b/tildes/tildes/resources/comment.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Root factories for comments."""
from pyramid.httpexceptions import HTTPForbidden
diff --git a/tildes/tildes/resources/group.py b/tildes/tildes/resources/group.py
index 3e43b12..f8cc84d 100644
--- a/tildes/tildes/resources/group.py
+++ b/tildes/tildes/resources/group.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Root factories for groups."""
from pyramid.httpexceptions import HTTPMovedPermanently
diff --git a/tildes/tildes/resources/message.py b/tildes/tildes/resources/message.py
index 7e1b1f8..25c30db 100644
--- a/tildes/tildes/resources/message.py
+++ b/tildes/tildes/resources/message.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Root factories for messages."""
from pyramid.request import Request
diff --git a/tildes/tildes/resources/topic.py b/tildes/tildes/resources/topic.py
index 9f4f6bc..3cac7f4 100644
--- a/tildes/tildes/resources/topic.py
+++ b/tildes/tildes/resources/topic.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Root factories for topics."""
from pyramid.httpexceptions import HTTPFound
diff --git a/tildes/tildes/resources/user.py b/tildes/tildes/resources/user.py
index 5d1ed6d..7ce31cb 100644
--- a/tildes/tildes/resources/user.py
+++ b/tildes/tildes/resources/user.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Root factories for users."""
from pyramid.request import Request
diff --git a/tildes/tildes/routes.py b/tildes/tildes/routes.py
index a29e09c..b2bfe60 100644
--- a/tildes/tildes/routes.py
+++ b/tildes/tildes/routes.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Configuration of application routes for URL dispatch."""
from typing import Any
diff --git a/tildes/tildes/schemas/comment.py b/tildes/tildes/schemas/comment.py
index b5530aa..130787b 100644
--- a/tildes/tildes/schemas/comment.py
+++ b/tildes/tildes/schemas/comment.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Validation/dumping schema for comments."""
from marshmallow import Schema
diff --git a/tildes/tildes/schemas/fields.py b/tildes/tildes/schemas/fields.py
index 644e3ae..c1c0a48 100644
--- a/tildes/tildes/schemas/fields.py
+++ b/tildes/tildes/schemas/fields.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Custom schema field definitions."""
import enum
diff --git a/tildes/tildes/schemas/group.py b/tildes/tildes/schemas/group.py
index 1c24a35..ed00850 100644
--- a/tildes/tildes/schemas/group.py
+++ b/tildes/tildes/schemas/group.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Validation/dumping schema for groups."""
import re
diff --git a/tildes/tildes/schemas/message.py b/tildes/tildes/schemas/message.py
index c99a547..ac9c168 100644
--- a/tildes/tildes/schemas/message.py
+++ b/tildes/tildes/schemas/message.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Validation/dumping schemas for messages."""
from marshmallow import Schema
diff --git a/tildes/tildes/schemas/topic.py b/tildes/tildes/schemas/topic.py
index dac3ab8..b6843bc 100644
--- a/tildes/tildes/schemas/topic.py
+++ b/tildes/tildes/schemas/topic.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Validation/dumping schema for topics."""
import re
diff --git a/tildes/tildes/schemas/topic_listing.py b/tildes/tildes/schemas/topic_listing.py
index 109b76c..ca055b2 100644
--- a/tildes/tildes/schemas/topic_listing.py
+++ b/tildes/tildes/schemas/topic_listing.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Validation schema for topic listing views."""
from marshmallow import pre_load, Schema, validates_schema, ValidationError
diff --git a/tildes/tildes/schemas/user.py b/tildes/tildes/schemas/user.py
index 6abc5ea..20e65f3 100644
--- a/tildes/tildes/schemas/user.py
+++ b/tildes/tildes/schemas/user.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2018 Tildes contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
"""Validation/dumping schema for users."""
import re
diff --git a/tildes/tildes/templates/base.jinja2 b/tildes/tildes/templates/base.jinja2
index 274fd56..f947771 100644
--- a/tildes/tildes/templates/base.jinja2
+++ b/tildes/tildes/templates/base.jinja2
@@ -1,3 +1,6 @@
+{# Copyright (c) 2018 Tildes contributors #}
+{# SPDX-License-Identifier: AGPL-3.0-or-later #}
+
{% from 'macros/user.jinja2' import logged_in_user_info with context %}
diff --git a/tildes/tildes/templates/base_no_sidebar.jinja2 b/tildes/tildes/templates/base_no_sidebar.jinja2
index 8d98d78..57b4948 100644
--- a/tildes/tildes/templates/base_no_sidebar.jinja2
+++ b/tildes/tildes/templates/base_no_sidebar.jinja2
@@ -1,3 +1,6 @@
+{# Copyright (c) 2018 Tildes contributors #}
+{# SPDX-License-Identifier: AGPL-3.0-or-later #}
+
{% extends 'base.jinja2' %}
{% block body_tag %}
diff --git a/tildes/tildes/templates/base_user_menu.jinja2 b/tildes/tildes/templates/base_user_menu.jinja2
index 003be42..898d496 100644
--- a/tildes/tildes/templates/base_user_menu.jinja2
+++ b/tildes/tildes/templates/base_user_menu.jinja2
@@ -1,3 +1,6 @@
+{# Copyright (c) 2018 Tildes contributors #}
+{# SPDX-License-Identifier: AGPL-3.0-or-later #}
+
{% extends 'base.jinja2' %}
{% from 'macros/user_menu.jinja2' import render_user_menu with context %}
diff --git a/tildes/tildes/templates/donate_stripe.jinja2 b/tildes/tildes/templates/donate_stripe.jinja2
index 5cb6f28..f9c59ec 100644
--- a/tildes/tildes/templates/donate_stripe.jinja2
+++ b/tildes/tildes/templates/donate_stripe.jinja2
@@ -1,3 +1,6 @@
+{# Copyright (c) 2018 Tildes contributors #}
+{# SPDX-License-Identifier: AGPL-3.0-or-later #}
+
{% extends 'base_no_sidebar.jinja2' %}
{% block title %}Stripe donation{% endblock %}
diff --git a/tildes/tildes/templates/error_403.jinja2 b/tildes/tildes/templates/error_403.jinja2
index 857ab94..1650af6 100644
--- a/tildes/tildes/templates/error_403.jinja2
+++ b/tildes/tildes/templates/error_403.jinja2
@@ -1,3 +1,6 @@
+{# Copyright (c) 2018 Tildes contributors #}
+{# SPDX-License-Identifier: AGPL-3.0-or-later #}
+
{% extends 'base_no_sidebar.jinja2' %}
{% block title %}
diff --git a/tildes/tildes/templates/error_group_not_found.jinja2 b/tildes/tildes/templates/error_group_not_found.jinja2
index 0380ec7..bfacb14 100644
--- a/tildes/tildes/templates/error_group_not_found.jinja2
+++ b/tildes/tildes/templates/error_group_not_found.jinja2
@@ -1,3 +1,6 @@
+{# Copyright (c) 2018 Tildes contributors #}
+{# SPDX-License-Identifier: AGPL-3.0-or-later #}
+
{% extends 'base_no_sidebar.jinja2' %}
{% from 'macros/links.jinja2' import group_linked %}
diff --git a/tildes/tildes/templates/groups.jinja2 b/tildes/tildes/templates/groups.jinja2
index 1526868..102095a 100644
--- a/tildes/tildes/templates/groups.jinja2
+++ b/tildes/tildes/templates/groups.jinja2
@@ -1,3 +1,6 @@
+{# Copyright (c) 2018 Tildes contributors #}
+{# SPDX-License-Identifier: AGPL-3.0-or-later #}
+
{% extends 'base_no_sidebar.jinja2' %}
{% from 'macros/groups.jinja2' import render_group_subscription_box with context %}
diff --git a/tildes/tildes/templates/home.jinja2 b/tildes/tildes/templates/home.jinja2
index f22aa21..74aa4e9 100644
--- a/tildes/tildes/templates/home.jinja2
+++ b/tildes/tildes/templates/home.jinja2
@@ -1,3 +1,6 @@
+{# Copyright (c) 2018 Tildes contributors #}
+{# SPDX-License-Identifier: AGPL-3.0-or-later #}
+
{% extends 'topic_listing.jinja2' %}
{% from 'macros/forms.jinja2' import search_form %}
diff --git a/tildes/tildes/templates/includes/password_restrictions.jinja2 b/tildes/tildes/templates/includes/password_restrictions.jinja2
index 12a83b7..574a28d 100644
--- a/tildes/tildes/templates/includes/password_restrictions.jinja2
+++ b/tildes/tildes/templates/includes/password_restrictions.jinja2
@@ -1,3 +1,6 @@
+{# Copyright (c) 2018 Tildes contributors #}
+{# SPDX-License-Identifier: AGPL-3.0-or-later #}
+
Password restrictions
diff --git a/tildes/tildes/templates/includes/topic_tags.jinja2 b/tildes/tildes/templates/includes/topic_tags.jinja2
index 50f6f42..894c3b2 100644
--- a/tildes/tildes/templates/includes/topic_tags.jinja2
+++ b/tildes/tildes/templates/includes/topic_tags.jinja2
@@ -1,3 +1,6 @@
+{# Copyright (c) 2018 Tildes contributors #}
+{# SPDX-License-Identifier: AGPL-3.0-or-later #}
+