tade is a discussion/forum/link aggregator application. It provides three interfaces: a regular web page, a mailing list bridge and an NNTP server

Overview

tade - web/mailing list/nntp discussions

AGPL-3.0 python3 django3 sqlite3

frontpage screenshot frontpage on mobile screenshot

[tade] † ‡ is a discussion/forum/link aggregator application. It provides three interfaces: a regular web page, a mailing list bridge and an NNTP server.

†. pronounced tA-de, ta- as in tally and -de as in the
‡. τάδε is a Greek pronoun meaning this

Public instance at https://sic.pm | Tor hidden service | IRC: #sic on Libera Chat | [sic] bot on Mastodon

In a nutshell

  • No Javascript necessary. An HTML5 compliant browser is enough; it even runs on w3m, the text web browser.
  • Lightweight, requires only a python3 environment and stores its database in a sqlite3 file.
  • Can be deployed with WSGI compatible servers (Apache/NGINX) or even django's development server if need be.

✒️ Forum features

  • Posts can be text and/or URLs.
  • Posts can optionally have any number of tags.
  • Latest stories RSS and Atom feeds are provided.
  • Post and comment text content support commonmark Markdown syntax.
  • Posts and comments can only be upvoted. Support for flagging (downvoting) will be added soon.

🏷️ Tag and 🗂️ Aggregation system

  • Tags can optionally have any number of parent tags (but cycles are not allowed)
  • Tags can optionally be organised in Aggregations, which are collections of tags with a common theme. A user's frontpage can be either all stories or their subscribed aggregations' stories.
  • Aggregations can optionally be private, public or discoverable by other users.
  • Aggregations can be set as "default" by moderators. New users are subscribed to default aggregations.
  • Users can create their own aggregations at any time.
  • Tags, users and domains can be excluded from an Aggregation via exclude filters.

🔍 Search system

  • Comments and posts are automatically indexed in a separate sqlite database file using the fts5 (full text search) virtual table extension.
  • Posts with URLs can optionally have their remote content fetched and indexed with a django management command (e.g. from within a cron job).

🎛️ Permission and moderation system

  • Users can be inactive, active or banned.
  • Moderators can set the number of days for which an account is considered new. New accounts cannot add tags or perform other potentially destructive actions.
  • Public moderation log.

📨 Notification and email system

  • Mentioning other users in comments notifies them.
  • Users can choose when they receive each kind of notification via email
  • Users can optionally enable a weekly digest email.

👥 Account system

  • Users can either freely sign-up or have to be invited to.
  • Users can optionally request for an invitation (this feature can be turned off).
  • Users can save any story, comment to their bookmarks along with personal notes and export them at any time.
  • Users can add personal metadata in their profile, including an avatar.
  • Users can add "hats" to their account, which are decorations that can optionally be added to a comment. For example a moderator user wanting to comment as a moderator and not as a user would use a hat.
  • Users have a personalised Atom or RSS feed that shows only their subscriptions.

🌐 Web standards

Setup / Deployment

You can use this repository as is by modifying the tade package to fit your needs, or install it with pip as a Django app.

Using it directly

cp tade/local/secret_settings.py{.template,}
vim tade/local/secret_settings.py # REQUIRED: add secret token
vim tade/local/settings_local.py # OPTIONAL: local settings (SMTP etc)
python3 -m venv venv # OPTIONAL: setup virtual python enviroment in 'venv' directory
python3 -m pip install -r requirements.txt # Or 'pip3' install...
python3 manage.py migrate #sets up database
python3 manage.py createsuperuser #selfexplanatory
python3 manage.py runserver # run at 127.0.0.1:8000
python3 manage.py runserver 8001 # or run at 127.0.0.1:8001
python3 manage.py runserver 0.0.0.0:8000 # or run at public-ip:8000

For customization options look at the TadeAppConfig class in tade/apps.py, style.css in tade/static and the templates in tade/templates.

Installing with pip

See DEPLOY.md.

Code style

See CODE_STYLE.md.

Owner
Manos Pitsidianakis
Electrical and Computer Engineering
Manos Pitsidianakis
✨ Un code pour voir les disponibilités des vaccins contre le covid totalement fait en Python par moi, et en français.

Vaccine Notifier ❗ Un chois aléatoire d'un article sur Wikipedia totalement fait en Python par moi, et en français. 🔮 Grâce a une requète API, on peu

MrGabin 3 Jun 06, 2021
A simple dork generator written in python that outputs dorks with the domain extensions you enter

Dork Gen A simple dork generator written in python that outputs dorks with the domain extensions you enter in a ".txt file". Usage The code is pretty

Z3NToX 4 Oct 30, 2022
An okayish python script to generate a random Euler circuit with given number of vertices and edges.

Euler-Circuit-Test-Case-Generator An okayish python script to generate a random Euler circuit with given number of vertices and edges. Executing the S

Alen Antony 1 Nov 13, 2021
UUID version 7, which are time-sortable (following the Peabody RFC4122 draft)

uuid7 - time-sortable UUIDs This module implements the version 7 UUIDs, proposed by Peabody and Davis in https://www.ietf.org/id/draft-peabody-dispatc

Steve Simmons 22 Dec 20, 2022
PyGMT - A Python interface for the Generic Mapping Tools

PyGMT A Python interface for the Generic Mapping Tools Documentation (development version) | Contact | Try Online Why PyGMT? A beautiful map is worth

The Generic Mapping Tools (GMT) 564 Dec 28, 2022
Functional UUIDs for Python.

🏷️FUUID stands for Functional Universally Unique IDentifier. FUUIDs are compatible with regular UUIDs but are naturally ordered by generation time, collision-free and support succinct representations

Phil Demetriou 147 Oct 27, 2022
A script to check for common mistakes in LaTeX source files of scientific papers.

LaTeX Paper Linter This script checks for common mistakes in LaTeX source files of scientific papers. Usage python3 paperlint.py file.tex [-i/x inc

Michael Schwarz 12 Nov 16, 2022
Simple collection of GTPS Flood in Python.

GTPS Flood Simple collection of GTPS Flood in Python. NOTE Give me credit if you use this source, don't trade/sell this tool, And USE AT YOUR OWN RISK

PhynX 6 Dec 07, 2021
Application for easy configuration of swap file and swappiness priority in slackware and others linux distributions.

Swap File Program created with the objective of assisting in the configuration of swap file in Distributions such as Slackware. Required packages: pyt

Mauricio Ferrari 3 Aug 06, 2022
A simple package for handling variables in string.

A simple package for handling string variables. Welcome! This is a simple package for handling variables in string, You can add or remove variables wi

1 Dec 31, 2021
An OData v4 query parser and transpiler for Python

odata-query is a library that parses OData v4 filter strings, and can convert them to other forms such as Django Queries, SQLAlchemy Queries, or just plain SQL.

Gorilla 39 Jan 05, 2023
Export watched content from Tautulli to the Letterboxd CSV Import Format

Export watched content from Tautulli to the Letterboxd CSV Import Format

Evan J 5 Aug 31, 2022
Python HTTP Agent Parser

Features Fast Detects OS and Browser. Does not aim to be a full featured agent parser Will not turn into django-httpagentparser ;) Usage import ht

Shekhar 213 Dec 06, 2022
Yet another retry utility in Python

Yet another retry utility in Python, avereno being the Malagasy word for retry.

Haute École d'Informatique de Madagascar 4 Nov 02, 2021
cpp20.py is a Python script to compile C++20 code using modules.

cpp20.py is a Python script to compile C++20 code using modules. It browses the source files to determine their dependencies. Then, it compiles then in order using the correct flags.

Julien VERNAY 6 Aug 26, 2022
Python script to get some stats on nodes in a Blender material nodetree

Python script to get some stats on nodes in a Blender material nodetree. It counts the nodes, the node types and the max deep level for group nodes.

Alek Mugnozzo 2 Sep 03, 2022
Dependency Injector is a dependency injection framework for Python.

What is Dependency Injector? Dependency Injector is a dependency injection framework for Python. It helps implementing the dependency injection princi

ETS Labs 2.6k Jan 04, 2023
Factoral Methods using two different method

Factoral-Methods-using-two-different-method Here, I am finding the factorial of a number by using two different method. The first method is by using f

Sachin Vinayak Dabhade 4 Sep 24, 2021
Teleport Ur Logs with Love

Whatever you pipe into tull, will get a unique UUID and the data gets stored locally - accessible via a flask server with simple endpoints. You can use ngrok or localtunnel then to share it outside L

Lokendra Sharma 11 Jul 30, 2021
Bounding Boxes Python Utils

Bounding Boxes Python Utils

Vadim 4 May 01, 2022