A Django blog app implemented in Wagtail

Overview

Puput

https://travis-ci.org/APSL/puput.svg?branch=master https://readthedocs.org/projects/puput/badge/?version=latest https://api.codacy.com/project/badge/grade/f96e31ee1b8c4aa2b1402f12308afe96

Puput is a powerful and simple Django app to manage a blog. It uses the awesome Wagtail CMS as content management system.

Puput is the catalan name for Hoopoe which is indeed a beautiful bird.

http://i.imgur.com/3ByGQb6.png

Visit the documentation for an in-depth look at Puput.

Features

  • Built with Wagtail CMS and Django
  • Inspired in Wordpress and Zinnia
  • Simple & responsive HTML template by default
  • SEO friendly urls
  • Support for Disqus comments
  • Entries by author, tags, categories, archives and search term
  • Last & popular entries
  • Configurable sidebar widgets
  • RSS feeds
  • Related entries
  • Extensible entry model
  • Configurable default template color
  • Social share of blog entries (Facebook, Twitter and LinkedIn)

http://i.imgur.com/d13sGI3.png

Examples of blog sites made with Puput

Setup

The setup process is explained here.

Related repositories

Comments
  • Initial Attempt at a stream_body field

    Initial Attempt at a stream_body field

    This PR adds a "stream_body" StreamField to EntryPage. It leaves the existing "body" field, but allows it to be blank. The "stream_body" StreamField allows building dynamic page content using several blocks:

    • Heading
    • Paragraph
    • Syntax Highlighted Code (in many languages)
    • Video Embed
    • Table (You can copy / paste from Excel, as well!)
    • Captioned Image

    It could use a little CSS love - not my forte, for example, on tables - but I figured it was worth getting pulled in for discussion.

    opened by FlipperPA 63
  • Body content as StreamField

    Body content as StreamField

    Maybe the WordPress way is not the best way, but I think some of the WordPress options to create diferent kind of posts is a very good idea.

    Something like custom_post_types

    What do you think about that. Is it too opinionated aproach?. Should those be pluggins?

    enhancement 
    opened by iampbernardo 31
  • Adding support for Django 2.0 and Wagtail 2.0

    Adding support for Django 2.0 and Wagtail 2.0

    This PR enables the support for Wagtail 2.0, I've tested almost all the features in a test blog I have and it seemed to be working fine.

    For now there's no support for highlighted code blocks for Draftail in this PR but I'm in contact with some of the Wagtail's core devs and they suggested to me to develop that feature as a separated package which could be added to Wagtail's core in the future, so that's my next step and after that I'll be adding that feature here in Pupput.

    Also, for now I've added Blockquotes and Code Lines (like this -> this_is_a_method()) support for the Puput's Draftail, let me know if there is another Inline or Block feature you want us to support here.

    opened by MiltonLn 20
  • puput.models.DoesNotExist: BlogPage matching query does not exist.

    puput.models.DoesNotExist: BlogPage matching query does not exist.

    Thanks a lot for providing puput package. I am trying to use it for my website. However, I have some issues in making it work.

    I can access the blog_admin site but not the blog site. When I try to fix the tree in wagtail using './manage.py fixtree', I get the following error:

    puput.models.DoesNotExist: BlogPage matching query does not exist.

    I accidentally deleted the blog page from the blog_admin page. I was thinking that it's a normal django admin page, where you can add/delete anything. Is there a way to make it work again?

    Could you please help me with this issue.

    Best regards, Amit

    documentation 
    opened by zugspitze 11
  • Stream body

    Stream body

    Hello,

    This is a continuation for the pull request #83 merging with https://github.com/APSL/puput/compare/body_streams

    I have dropped the Heading, Video Embed, Captioned Image and Table blocks supported on pull request #83 because each one of those can be handled with Rich Text Block or Markdown Block, but the CodeBlock implementation with Pygments is still there.

    From (https://github.com/APSL/puput/compare/body_streams) i have added the QuoteBlocks and RawHTML support and finished the MarkdownBlock work.

    For Markdown support i have extracted a few ideas from https://github.com/torchbox/wagtail-markdown but creating a 'puput_markdown' package inside puput, please let me know if this needs to be handled outside. I have used the SimpleMDE plugin for handling the Markdown editor and for parsing i have used bleach and python-markdown with some extensions, this Markdown implementation uses Pygments too for code highlighting and it looks exactly the same as de CodeBlock (I think we can drop the CodeBlock, is easier to handle code snippets with markdown editor)

    I am having troubles with the RichTextBlock displaying but i think it's a Wagtail issue, on StreamFields it displays this way: image

    but the proper way to display it is this: image

    Any idea of how to solve it?

    Some captures of the work:

    image

    image

    Please let me know what else can i do, documentation? testing? some extra explanation?

    I'm very looking forward for merging and uploading to Pypi this feature. Thanks!

    • Milton Lenis PS: I can speak spanish too
    opened by MiltonLn 11
  • Substitute Category model

    Substitute Category model

    Hi,

    is there anyway substitute the puput category model with a custom one? I'm trying to install puput over an existing django project. All has gone very well, but my project already has his own category model that can't be substitute.

    Best,

    Fabio

    enhancement 
    opened by fab10m 11
  • Support wagtail 2.4

    Support wagtail 2.4

    Wagtail 2.3 keeps telling me that it has a newer version available. I tracked the cause down to puput's dependency on wagtail < 2.4. puput 1.0.3 has requirement wagtail<2.4,>=2.0, but you'll have wagtail 2.4 which is incompatible.

    Is it a trivial fix to support the newer Wagtail or is 2.4 specifically excluded?

    opened by matburnham 9
  • PUPUT_USERNAME_FIELD

    PUPUT_USERNAME_FIELD

    get_entries() in puput.models BlogPage raises an error.

    def get_entries(self):
        field_name = 'owner__%s' % getattr(settings, 'PUPUT_USERNAME_FIELD', 'username')
        return EntryPage.objects.descendant_of(self).live().order_by('-date')#.select_related(field_name)
    
    

    This results in select_related('owner__username') which is wrong and shoud be select_related('owner')

    bug 
    opened by robslotboom 9
  • Add support for other comment systems

    Add support for other comment systems

    It would be interesting to have support for other comment systems like Facebook comments. Before that the following things are needed:

    • [x] Remove tapioca-disqus from setup.py
    • [x] Refactor EntryPageUpdateCommentsView to suport other comment systems
    • [x] Refactor js code that update the number of comments of an entry.
    enhancement 
    opened by marctc 9
  • Circular Import Error with 'include('puput.urls')' in Django urls.py

    Circular Import Error with 'include('puput.urls')' in Django urls.py

    Per the puput documentation for configuring a standalone blog app, when adding 'path(' ', include('puput.urls'))', to my urls.py, I receive a circlar import error when get_entry_url and get_feeds_url are imported . See below.

    Note: I am attempting to add Puput to a django 3.14 installation.

    Traceback (most recent call last): File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/template/backends/django.py", line 121, in get_package_libraries module = import_module(entry[1]) File "/usr/lib/python3.8/importlib/init.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "", line 1014, in _gcd_import File "", line 991, in _find_and_load File "", line 975, in _find_and_load_unlocked File "", line 671, in _load_unlocked File "", line 783, in exec_module File "", line 219, in _call_with_frames_removed File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/puput/templatetags/puput_tags.py", line 10, in from ..urls import get_entry_url, get_feeds_url ImportError: cannot import name 'get_entry_url' from partially initialized module 'puput.urls' (most likely due to a circular import) (/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/puput/urls.py)

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last): File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner self.run() File "/usr/lib/python3.8/threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/utils/autoreload.py", line 53, in wrapper fn(*args, **kwargs) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/core/management/commands/runserver.py", line 118, in inner_run self.check(display_num_errors=True) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/core/management/base.py", line 392, in check all_issues = checks.run_checks( File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/core/checks/registry.py", line 70, in run_checks new_errors = check(app_configs=app_configs, databases=databases) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/core/checks/urls.py", line 13, in check_url_config return check_resolver(resolver) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/core/checks/urls.py", line 23, in check_resolver return check_method() File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 408, in check for pattern in self.url_patterns: File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/utils/functional.py", line 48, in get res = instance.dict[self.name] = self.func(instance) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 589, in url_patterns patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/utils/functional.py", line 48, in get res = instance.dict[self.name] = self.func(instance) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 582, in urlconf_module return import_module(self.urlconf_name) File "/usr/lib/python3.8/importlib/init.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "", line 1014, in _gcd_import File "", line 991, in _find_and_load File "", line 975, in _find_and_load_unlocked File "", line 671, in _load_unlocked File "", line 783, in exec_module File "", line 219, in _call_with_frames_removed File "/home/thedern/code/python/django/test/djangox/config/urls.py", line 10, in path('blog/', include('puput.urls')), File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/urls/conf.py", line 34, in include urlconf_module = import_module(urlconf_module) File "/usr/lib/python3.8/importlib/init.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "", line 1014, in _gcd_import File "", line 991, in _find_and_load File "", line 975, in _find_and_load_unlocked File "", line 671, in _load_unlocked File "", line 783, in exec_module File "", line 219, in _call_with_frames_removed File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/puput/urls.py", line 39, in from wagtail.admin import urls as wagtailadmin_urls File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/wagtail/admin/urls/init.py", line 104, in path(f"sprite-{get_sprite_hash()}/", home.sprite, name="wagtailadmin_sprite"), File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/wagtail/admin/urls/init.py", line 95, in get_sprite_hash content = str(home.sprite(None).content, "utf-8") File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/wagtail/admin/views/home.py", line 224, in sprite return HttpResponse(icons()) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/wagtail/admin/views/home.py", line 219, in icons _icons_html = render_to_string("wagtailadmin/shared/icons.html", {'icons': all_icons}) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/template/loader.py", line 61, in render_to_string template = get_template(template_name, using=using) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/template/loader.py", line 12, in get_template engines = _engine_list(using) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/template/loader.py", line 66, in _engine_list return engines.all() if using is None else [engines[using]] File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/template/utils.py", line 90, in all return [self[alias] for alias in self] File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/template/utils.py", line 90, in return [self[alias] for alias in self] File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/template/utils.py", line 81, in getitem engine = engine_cls(params) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/template/backends/django.py", line 25, in init options['libraries'] = self.get_templatetag_libraries(libraries) File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/template/backends/django.py", line 43, in get_templatetag_libraries libraries = get_installed_libraries() File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/template/backends/django.py", line 108, in get_installed_libraries for name in get_package_libraries(pkg): File "/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/django/template/backends/django.py", line 123, in get_package_libraries raise InvalidTemplateLibrary( django.template.library.InvalidTemplateLibrary: Invalid template library specified. ImportError raised when trying to load 'puput.templatetags.puput_tags': cannot import name 'get_entry_url' from partially initialized module 'puput.urls' (most likely due to a circular import) (/home/thedern/code/python/django/test/djangox/venv/lib/python3.8/site-packages/puput/urls.py)

    opened by thedern 8
  • relation

    relation "wagtailcore_page" does not exist

    It's not a bug, it's a problem caused by me, and I would be grateful if someone can help me.

    I am using django-1.11 and postgresql database. I wanted to implement blog using puput django package. I have deleted all the tables for wagtail and puput (a big mistake). Now when I run puput_initial_data I get the following error:

    Traceback (most recent call last):
      File "manage.py", line 22, in <module>
        execute_from_command_line(sys.argv)
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line
        utility.execute()
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/core/management/__init__.py", line 355, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/core/management/base.py", line 283, in run_from_argv
        self.execute(*args, **cmd_options)
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/core/management/base.py", line 330, in execute
        output = self.handle(*args, **options)
      File "/home/ubuntu/.local/lib/python3.5/site-packages/puput/management/commands/puput_initial_data.py", line 20, in handle
        rootpage = Page.objects.first()
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
        return getattr(self.get_queryset(), name)(*args, **kwargs)
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/db/models/query.py", line 564, in first
        objects = list((self if self.ordered else self.order_by('pk'))[:1])
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/db/models/query.py", line 250, in __iter__
        self._fetch_all()
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/db/models/query.py", line 1118, in _fetch_all
        self._result_cache = list(self._iterable_class(self))
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/db/models/query.py", line 53, in __iter__
        results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 894, in execute_sql
        raise original_exception
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 884, in execute_sql
        cursor.execute(sql, params)
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute
        return self.cursor.execute(sql, params)
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/db/utils.py", line 94, in __exit__
        six.reraise(dj_exc_type, dj_exc_value, traceback)
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise
        raise value.with_traceback(tb)
      File "/home/ubuntu/.local/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute
        return self.cursor.execute(sql, params)
    django.db.utils.ProgrammingError: relation "wagtailcore_page" does not exist
    LINE 1: ...d_at", "wagtailcore_page"."live_revision_id" FROM "wagtailco...
    

    Can somebody please help me?

    opened by veronicabasso 8
  • Search is only working for one tree and not searching globaly

    Search is only working for one tree and not searching globaly

    Is there a chance to change the behavior of the search function?

    In my project I have currently two pages under root with a tree of pages under /de /blog /de /de/dokumentation /de/faq

    This is the current search behavior. When I'm on the blog page and key in a search term then the search is issued like this: http://127.0.0.1:8000/blog/search/?q=searchterm

    and for the other page tree: http://127.0.0.1:8000/de/dokumentation/search/?q=searchterm http://127.0.0.1:8000/de/faq/search/?q=searchterm

    In all cases only search results are shown within the current path. So for /blog, only blog entries and in /de/dokumentation only the entries in subpages of Dokumentation.

    My expectation would be, that the search will find all entries from root. Or at least I can include different pages in the search by setting a checkbox or similar.

    opened by sebastian-muthwill 0
  • Internal Server Error: /admin/snippets/puput/category/add/

    Internal Server Error: /admin/snippets/puput/category/add/

    Django==3.2.12
    wagtail==2.15.4
    puput==1.1.3
    
    #settings
    DEBUG  = False
    STATICFILES_STORAGE = 'myproject.utils.CustomManifestStaticFilesStorage'
    

    Puput is working, i created a first blog page, all good, nothing wrong but when i navigate to /admin/snippets/puput/category/add/ i got 500 Internal server error.

    ERROR [django.request:224] Internal Server Error: /admin/snippets/puput/category/add/
    Traceback (most recent call last):
      File "/Users/myname/demo/wagtail/virtenv/lib/python3.9/site-packages/django/contrib/staticfiles/storage.py", line 88, in hashed_name
        raise ValueError("The file '%s' could not be found with %r." % (filename, self))
    ValueError: The file 'wagtailadmin/css/panels/rich-text.css' could not be found with <myproject.utils.CustomManifestStaticFilesStorage object at 0x7f96ac695fd0>.
    
    #utils.py
    class CustomManifestStaticFilesStorage(ManifestStaticFilesStorage):
        manifest_strict = False
    

    And i've tried manifest_strict = False, still no luck.

    opened by tamhv 0
  • Is markdown supported ?

    Is markdown supported ?

    I want to draft blog posts using Markdown, and wonder if wagtail-markdown is supported or not? Based on this URL, it seems that there is a branch support Markdown, but I do not know how to install that specific branch when deploying via docker-compose YAML file.

    any advice please ?

    opened by tian-yan 1
  • Unable to relate entry between blogs

    Unable to relate entry between blogs

    It's possible to relate an entry between blogs, but the entry url in puput/related_entries.html cannot be rendered correctly. I think it's because puput.urls.get_entry_url resolves the blog path from blog_page . If I replace blog_page.specific below with entry.blog_page , it seems to work fine.

    https://github.com/APSL/puput/blob/c991d895c9c0c1facd02a5faa653d0953d6c96aa/puput/urls.py#L81

    In case that Blog pages have Root page as parent, the hostname doesn't change according to a related entry so won't work too.

    Am I right?

    opened by hiroki-sawano 0
  • How to include extended fields in the blog search

    How to include extended fields in the blog search

    Hi https://puput.readthedocs.io/en/latest/extending.html Extended the EntryPage model as NewEntryPage with few fields. How to include extended fields (NewEntryPage Model) to Blog search? Its working only based on EntryPage model search fields?

    opened by mjagesh 0
Releases(1.2.0)
Owner
APSL
Web, mobile apps and DevOps mostly in Python, Django, JavaScript and Go.
APSL
Open Source CRM based on Django

Django-CRM Django CRM is opensource CRM developed on django framework. It has all the basic features of CRM to start with. We welcome code contributio

MicroPyramid 1.4k Dec 31, 2022
A Django blog app implemented in Wagtail

Puput Puput is a powerful and simple Django app to manage a blog. It uses the awesome Wagtail CMS as content management system. Puput is the catalan n

APSL 535 Jan 08, 2023
Flask-SQLAlchemy implementation of nested/threaded comment replies.

Threaded comments using Common Table Expressions (CTE) for a MySQL Flask blog or CMS Credits to peterspython Also read more about the implementation h

ONDIEK ELIJAH OCHIENG 5 Nov 12, 2022
Library Management system designed for managing and operating various aspects of a library

Proposal This proposal is written to clarify the project work of Information Systems, assigned to us as an individual task in order to tackle the case

Prawal 1 Oct 27, 2021
Website for PyCon

PyCon 2019 Web Site Built by the Python Community atop the Django web framework. Rather than use this as the basis for your conference site directly,

PyCon 155 Nov 05, 2022
CMS framework for Django

Created by Stephen McDonald Overview Mezzanine is a powerful, consistent, and flexible content management platform. Built using the Django framework,

Stephen McDonald 4.6k Dec 29, 2022
A curated list of awesome packages, articles, and other cool resources from the Wagtail community.

Awesome Wagtail A curated list of awesome packages, articles, and other cool resources from the Wagtail community. Wagtail is a Python CMS powered by

Springload 1.7k Jan 03, 2023
A course management web application

umber a course management web app built with python Flask, sqlite3, and git. installation Tested on Ubuntu 18 with python 3.5. # -- Install the system

Jim Mahoney 6 Jun 03, 2022
The Plone CMS: root integration package

About Plone Plone is a mature, secure and user-friendly Content Management System (CMS). Plone - and the Open Source community behind it - aggregates

Plone Foundation 200 Jan 08, 2023
The easy-to-use and developer-friendly CMS

django CMS Open source enterprise content management system based on the Django framework and backed by the non-profit django CMS Association. Get inv

django CMS Association 9.1k Jan 08, 2023
An open source CMS, in python and integrable in Django

Python CMS based on the Django Framework

Titouan Bénard 0 Sep 10, 2021
VaporCMS - The greatest content management system that will never exist

The greatest content management system that will never exist Overview WordPress is a huge success but could it be done better? Maybe being mo

Andrew Dailey 4 Jan 06, 2022
Kotti is a high-level, Pythonic web application framework based on Pyramid and SQLAlchemy. It includes an extensible Content Management System called the Kotti CMS.

Kotti Kotti is a high-level, Pythonic web application framework based on Pyramid and SQLAlchemy. It includes an extensible Content Management System c

Kotti 394 Jan 07, 2023
Abilian Social Business Engine - an enterprise social networking / collaboration platform.

About Abilian SBE (Social Business Engine) is a platform for social business applications, and more specifically collaborative / enterprise 2.0 busine

Abilian open source projects 63 Dec 29, 2022
CSM: Construction Safety Management system

CSM: Construction Safety Management system 1. 서비스 소개 개요: 공사현장에서의 최적의 안전진단기술을 통한 고도화된 시스템으로 개선하고자 함 목표: 안전 관련 주요 시각데이터를 Cross-Domain으로 활용하여 통합 안전 관리기술의

5 Jul 29, 2022
Django content management as it should be

Django content management as it should be. Documentation Read the full documentation or get a quick brief below. Install $ pip install djedi-cms Confi

5 Monkeys 75 Dec 13, 2022
A full-stack clone of Instagram, allowing the user to interact with posts and other users.

This project is a full-stack clone of Instagram, allowing the user to interact with posts and other users

Alejandro Carrizosa Grant 4 Feb 14, 2022
Ticket shop application for conferences, festivals, concerts, tech events, shows, exhibitions, workshops, barcamps, etc.

pretix Reinventing ticket presales, one ticket at a time. Project status & release cycle While there is always a lot to do and improve on, pretix by n

pretix 1.3k Jan 01, 2023
A full stack e-learning application, this is the backend using django restframework and docker.

DevsPrime API API Service backing client interfaces Technologies Python 3.9 : Base programming language for development Bash Scripting : Create conven

Nnabue Favour Chukwuemeka 1 Oct 21, 2021
LibreLingo🐢 🌎 📚 a community-owned language-learning platform

LibreLingo's mission is to create a modern language-learning platform that is owned by the community of its users. All software is licensed under AGPLv3, which guarantees the freedom to run, study, s

Daniel Kantor 1.4k Jan 09, 2023