Giter Club home page Giter Club logo

uchan's Introduction

µchan - anonymous imageboard software

µchan is a modern take on internet messaging board software, also known as a BBS, textboard or imageboard.

It has all the basic features you expect from a message board: boards for different topics, support for attaching images to posts and a system for moderating. µchan is anonymous and requires no account to post.

In addition to the basic features, µchan supports creating boards by everyone, and the moderation interface is extensive and clear. Moderator permissions give extra control over the capabilities of a mod.

µchan is super light-weight. It supports users that have JavaScript disabled. You can even browse it with the original Nintento DS!

Installation and documentation

To access the installation instructions for the software project, please visit the documentation website. The website should provide detailed step-by-step guidance on how to install and set up µchan.

Who is µchan for?

You can use µchan to set up your own message board. The goal of µchan is to be the go-to software for messaging board software.

A quick rundown of what we support:

  • Full support for javascript-less browsers.
  • Posting
    • No account required
    • Markdown like formatting
    • Multiple files per post possible
    • Catalog
    • Captcha's can be enabled per board.
    • Captcha verifications are remembered for a few hours
    • Tripcode support for both classic and secure tripcodes
  • Extension
    • Add-on to the base site
    • Watcher auto-updates the page when new replies are available
    • Inline image expansion
    • Quick replying
  • Moderating
    • Public registration as moderators
    • Boards are created by moderators
      • Moderators can be invited to moderate a board
      • Control over permissions of invited moderators
      • All moderation actions are logged and visible
    • Reports
      • Dedicated interface for managing reports
      • Clear reports, remove posts and ban posters
    • Bans
      • Individual ip's or rangebans
      • Can be restricted to boards or global ban
      • Can be timed or indefinite
  • Pages
    • Dynamic creation of pages
    • Linked at the bottom of a page
    • Markdown like formatting

Missing a feature? Request it by creating an issue.

What is different about µchan?

This software is meant to replace older solutions that aren't of this age anymore. Traditional messaging boards are static: each time a user submits a message it generates new files to update the board. Changing layouts and the likes requires full rebuilds of the site.

µchan takes a modern dynamic approach, and generates pages when they are requested. On top of that is a good caching mechanism, so that responses are delivered just as fast as static files. It can handle the load when your site grows, adding new servers to take up the extra load, there is no single point of failure.

uchan's People

Contributors

floens avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

uchan's Issues

development guide / support

Is it possible to add any guidance for developing? Since the app is deployed via Docker it takes a long time to run make update or make stop every time we want to try adding a change. I am not sure if there is another way we should be running this locally

Assets container does not start, tsc command not found

I am using Docker on WSL2, so take this report with a grain of salt.

I was following the setup instructions, and ran these commands:

make upgrade
make setup

and I create a new admin user.

When I try to pull up the site on localhost, I get this error:

Server error

The server encountered an error and could not complete the request.
Please try again later.

I checked the docker-compose ps output, and I saw that the assets container has exited. Checking the logs gives me this message (I believe the first line is the root cause):

uchan-assets-1  | ./assets.sh: line 13: tsc: command not found
uchan-assets-1  |  * Tip: There are .env or .flaskenv files present. Do "pip install python-dotenv" to use them.
uchan-assets-1  | Building bundle: site.%(version)s.js
uchan-assets-1  | Building bundle: thread.%(version)s.js
uchan-assets-1  | Building bundle: extra.%(version)s.js
uchan-assets-1  | Failed, error was: [Errno 2] No such file or directory: '/opt/app/uchan/view/static/js/extra.js'
uchan-assets-1  | Building bundle: style.%(version)s.css
uchan-assets-1  | Traceback (most recent call last):
uchan-assets-1  |   File "/usr/bin/flask", line 11, in <module>
uchan-assets-1  |     sys.exit(main())
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/flask/cli.py", line 967, in main
uchan-assets-1  |     cli.main(args=sys.argv[1:], prog_name="python -m flask" if as_module else None)
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/flask/cli.py", line 586, in main
uchan-assets-1  |     return super(FlaskGroup, self).main(*args, **kwargs)
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/click/core.py", line 1053, in main
uchan-assets-1  |     rv = self.invoke(ctx)
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/click/core.py", line 1659, in invoke
uchan-assets-1  |     return _process_result(sub_ctx.command.invoke(sub_ctx))
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/click/core.py", line 1659, in invoke
uchan-assets-1  |     return _process_result(sub_ctx.command.invoke(sub_ctx))
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/click/core.py", line 1395, in invoke
uchan-assets-1  |     return ctx.invoke(self.callback, **ctx.params)
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/click/core.py", line 754, in invoke
uchan-assets-1  |     return __callback(*args, **kwargs)
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/click/decorators.py", line 26, in new_func
uchan-assets-1  |     return f(get_current_context(), *args, **kwargs)
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/flask/cli.py", line 426, in decorator
uchan-assets-1  |     return __ctx.invoke(f, *args, **kwargs)
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/click/core.py", line 754, in invoke
uchan-assets-1  |     return __callback(*args, **kwargs)
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/flask_assets.py", line 492, in build
uchan-assets-1  |     _webassets_cmd('build')
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/flask_assets.py", line 480, in _webassets_cmd
uchan-assets-1  |     getattr(cmdenv, cmd)()
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/webassets/script.py", line 172, in __call__
uchan-assets-1  |     bundle.build(force=True, disable_cache=no_cache)
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/webassets/bundle.py", line 683, in build
uchan-assets-1  |     disable_cache=disable_cache))
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/webassets/bundle.py", line 620, in _build
uchan-assets-1  |     force, disable_cache=disable_cache, extra_filters=extra_filters)
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/webassets/bundle.py", line 544, in _merge_and_apply
uchan-assets-1  |     kwargs=item_data)
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/webassets/merge.py", line 280, in apply
uchan-assets-1  |     return self._wrap_cache(key, func)
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/webassets/merge.py", line 222, in _wrap_cache
uchan-assets-1  |     content = func().getvalue()
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/webassets/merge.py", line 255, in func
uchan-assets-1  |     getattr(filter, type)(data, out, **kwargs_final)
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/webassets/filter/cleancss.py", line 45, in input
uchan-assets-1  |     if self.cleancss_ver < 4:
uchan-assets-1  |   File "/usr/lib/python3.6/site-packages/webassets/filter/cleancss.py", line 33, in cleancss_ver
uchan-assets-1  |     out, err = Popen(args, stdout=PIPE).communicate()
uchan-assets-1  |   File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
uchan-assets-1  |     restore_signals, start_new_session)
uchan-assets-1  |   File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
uchan-assets-1  |     raise child_exception_type(errno_num, err_msg, err_filename)
uchan-assets-1  | FileNotFoundError: [Errno 2] No such file or directory: 'cleancss': 'cleancss'

Ultimately, the assets container is unable to find the tsc executable for Typescript. Inside a docker-compose exec app /bin/sh when I try to run anything with npm it gives me this error:

Error: could not get uid/gid
[ 'nobody', 0 ]

    at /usr/lib/node_modules/npm/node_modules/uid-number/uid-number.js:37:16
    at ChildProcess.exithandler (child_process.js:211:5)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:886:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)

Since this command exits with error code 0, it allows Docker to silently continue as if no errors occurred. This uid/gid error looks like it may be related to WSL2 and Docker, but I'm not 100% sure. It may have been fixed in a later version of the nodejs package, according to this Stackoverflow thread: https://stackoverflow.com/questions/52196518/could-not-get-uid-gid-when-building-node-docker

Is this something that you're able to reproduce on Linux? I don't have a Linux machine handy right now. I may play around with upgrading the version of Alpine and seeing if that fixes anything.

Roadmap

Roadmap

  • memcached caching
  • file uploading
  • bans and cooldowns
  • varnish
  • setup script
  • setup guide
  • additional post formatting options
  • Database migrations with alembic
  • Stickies
  • Custom pages
  • Tripcodes
  • API
  • Some javascript integration
  • Plugin system
  • Captchas plugin
  • Capcodes
  • Catalog
  • Registering
  • Moderator role control
  • Reports screen
  • User board creation
  • Per session captcha
  • Moderator log
  • Tests
  • Word filter plugin
  • Archiving
  • WebM (plugin?)
  • Secure tripcodes
  • Multi file

Error Bad referer header

Hi guys,

I've tried to setup the board via the provided docker script.

The first thing I had to to is to create the database, log and media folders manually in ./data .

But after getting a recaptcha and running it on a test domain it always prompts me with the following:

Error
Bad referer header

at /mod/auth after trying to login (Tested chrome/firefox) .

It's running directly on port 1234 no nginx in between but I tried to set the proxy_fixer_num_proxies to 3 and uncommented the forwarding section in the uchan.vcl

Hopefully there is a fix for that.

Regards

No module names 'werkzeug.contrib'

A new bug appears after releasing werkzeug 1.0.0 (i think it's the reason), and uchan become uncompilable. After starting all services docker trying to launch app upgrade, but crushes. How can i fix it?

docker-compose run app upgrade
Traceback (most recent call last):
  File "/usr/bin/alembic", line 11, in <module>
    load_entry_point('alembic==0.8.8', 'console_scripts', 'alembic')()
  File "/usr/lib/python3.6/site-packages/alembic/config.py", line 479, in main
    CommandLine(prog=prog).main(argv=argv)
  File "/usr/lib/python3.6/site-packages/alembic/config.py", line 473, in main
    self.run_cmd(cfg, options)
  File "/usr/lib/python3.6/site-packages/alembic/config.py", line 456, in run_cmd
    **dict((k, getattr(options, k)) for k in kwarg)
  File "/usr/lib/python3.6/site-packages/alembic/command.py", line 174, in upgrade
    script.run_env()
  File "/usr/lib/python3.6/site-packages/alembic/script/base.py", line 407, in run_env
    util.load_python_file(self.dir, 'env.py')
  File "/usr/lib/python3.6/site-packages/alembic/util/pyfiles.py", line 93, in load_python_file
    module = load_module_py(module_id, path)
  File "/usr/lib/python3.6/site-packages/alembic/util/compat.py", line 68, in load_module_py
    module_id, path).load_module(module_id)
  File "<frozen importlib._bootstrap_external>", line 399, in _check_name_wrapper
  File "<frozen importlib._bootstrap_external>", line 823, in load_module
  File "<frozen importlib._bootstrap_external>", line 682, in load_module
  File "<frozen importlib._bootstrap>", line 265, in _load_module_shim
  File "<frozen importlib._bootstrap>", line 684, in _load
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "migrations/env.py", line 17, in <module>
    from uchan.lib.database import OrmModelBase, connect_string
  File "/opt/app/uchan/__init__.py", line 142, in <module>
    init()
  File "/opt/app/uchan/__init__.py", line 51, in init
    from uchan.flask import create_web_app, CustomFlaskApp
  File "/opt/app/uchan/flask/__init__.py", line 4, in <module>
    from werkzeug.contrib.fixers import ProxyFix
ModuleNotFoundError: No module named 'werkzeug.contrib'
Makefile:15: recipe for target 'upgrade' failed
make: *** [upgrade] Error 1

504 Gateway Timeout on /post

I'm running uchan behind nginx reverse proxy.
Request from /post seem to reach the application, I'm able to trigger the "Referer not valid" warning.
Sending from the correct domain gets met stuck for 60s and afterwards a 504.

Could you give me some pointers on where to look to fix this?

Argument of type 'ErrorEvent' is not assignable to parameter of type 'ProgressEvent<EventTarget>'

I'm running into an issue when starting this for the first time using the setup instructions. I'm getting these errors, in full:

uchan-assets-1  | extra/extra.ts(77,29): error TS2345: Argument of type 'ErrorEvent' is not assignable to parameter of type 'ProgressEvent<EventTarget>'.
uchan-assets-1  |   Type 'ErrorEvent' is missing the following properties from type 'ProgressEvent<EventTarget>': lengthComputable, loaded, total
uchan-assets-1  | extra/extra.ts(77,29): error TS2352: Conversion of type 'ProgressEvent<EventTarget>' to type 'ErrorEvent' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
uchan-assets-1  | extra/extra.ts(77,29): error TS2352: Conversion of type 'ProgressEvent<EventTarget>' to type 'ErrorEvent' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
uchan-assets-1  |   Type 'ProgressEvent<EventTarget>' is missing the following properties from type 'ErrorEvent': colno, error, filename, lineno, message

This appears to be a Typescript compile error. I am not really familiar with TS so I don't know how to go about fixing this.

Where is media supposed to go?

The guide mentions all data goes in the /data folder which also contains a /media folder.
The config.ini also contains 2 lines for a tmp folder and a media folder.

I've defined a media folder (all rights for all users) and made /tmp the tmp folder.

Now I'm getting
FileNotFoundError: [Errno 2] No such file or directory: '/mnt/disk2/chanmedia/m9/6y2fk9ps56fcpx.jpg' [2018-11-25 14:14:42,298] {app.py:1560} ERROR - Exception on /post [POST] Traceback (most recent call last): File "/usr/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app response = self.full_dispatch_request() File "/usr/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request rv = self.handle_user_exception(e) File "/usr/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception reraise(exc_type, exc_value, tb) File "/usr/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise raise value File "/usr/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request rv = self.dispatch_request() File "/usr/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "./uchan/view/post.py", line 52, in post _upload_files(upload_queue_files_list) File "./uchan/view/post.py", line 213, in _upload_files file_service.do_upload(upload_queue_files) File "./uchan/lib/service/file_service.py", line 157, in do_upload cdn.upload(uploaded_file.image_output, uploaded_file.image_name) File "./uchan/lib/service/file_service.py", line 54, in upload shutil.copyfile(local_path, os.path.join(self.path, subdir, name)) File "/usr/lib/python3.6/shutil.py", line 121, in copyfile with open(dst, 'wb') as fdst: FileNotFoundError: [Errno 2] No such file or directory: '/mnt/disk2/chanmedia/51/7yfwyr7fmazzx0.jpg' [2018-11-25 14:14:42,299] {__init__.py:42} ERROR - [Errno 2] No such file or directory: '/mnt/disk2/chanmedia/51/7yfwyr7fmazzx0.jpg' Traceback (most recent call last): File "/usr/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app response = self.full_dispatch_request() File "/usr/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request rv = self.handle_user_exception(e) File "/usr/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception reraise(exc_type, exc_value, tb) File "/usr/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise raise value File "/usr/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request rv = self.dispatch_request() File "/usr/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "./uchan/view/post.py", line 52, in post _upload_files(upload_queue_files_list) File "./uchan/view/post.py", line 213, in _upload_files file_service.do_upload(upload_queue_files) File "./uchan/lib/service/file_service.py", line 157, in do_upload cdn.upload(uploaded_file.image_output, uploaded_file.image_name) File "./uchan/lib/service/file_service.py", line 54, in upload shutil.copyfile(local_path, os.path.join(self.path, subdir, name)) File "/usr/lib/python3.6/shutil.py", line 121, in copyfile with open(dst, 'wb') as fdst: FileNotFoundError: [Errno 2] No such file or directory: '/mnt/disk2/chanmedia/51/7yfwyr7fmazzx0.jpg'
What could be wrong here?

The easiest way to start for newbie

Hey!
I wanted to run uchan on Linux, but it fails on build. I replaced docker-compose with docker compose in Makefile, and then run it with command make setup. It shows warning and after some building steps finally crashes:

WARN[0000] The "UCHAN_PORT" variable is not set. Defaulting to a blank string.
[+] Building 0.0s (0/1)
[+] Building 0.0s (0/2)
[+] Building 0.2s (2/3)
 => [internal] load .dockerignore                                                                                                              0.0s
 => => transferring context: 216B                                                                                                              0.0s
 => [internal] load build definition from Dockerfile                                                                                           0.0s
 => => transferring dockerfile: 788B                                                                                                           0.0s
[+] Building 0.2s (2/3)
 => [internal] load build definition from Dockerfile                                                                                           0.0s
 => => transferring dockerfile: 788B                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                              0.0s
 => => transferring context: 216B                                                                                                              0.0s
[+] Building 1.1s (3/12)
 => [internal] load .dockerignore                                                                                                              0.0s
 => => transferring context: 216B                                                                                                              0.0s
 => [internal] load build definition from Dockerfile                                                                                           0.0s
[+] Building 1.0s (3/12)
 => [internal] load build definition from Dockerfile                                                                                           0.0s
 => => transferring dockerfile: 788B                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                              0.0s
[+] Building 1.2s (3/12)
 => [internal] load .dockerignore                                                                                                              0.0s
 => => transferring context: 216B                                                                                                              0.0s
 => [internal] load build definition from Dockerfile                                                                                           0.0s
[+] Building 1.1s (3/12)
 => [internal] load build definition from Dockerfile                                                                                           0.0s
 => => transferring dockerfile: 788B                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                              0.0s
[+] Building 1.2s (6/12)
 => [internal] load .dockerignore                                                                                                              0.0s
 => => transferring context: 216B                                                                                                              0.0s
 => [internal] load build definition from Dockerfile                                                                                           0.0s
 => => transferring dockerfile: 788B                                                                                                           0.0s
[+] Building 1.2s (7/12)
 => [internal] load .dockerignore                                                                                                              0.0s
 => => transferring context: 216B                                                                                                              0.0s
 => [internal] load build definition from Dockerfile                                                                                           0.0s
 => => transferring dockerfile: 788B                                                                                                           0.0s
[+] Building 1.2s (7/12)
 => [internal] load build definition from Dockerfile                                                                                           0.0s
 => => transferring dockerfile: 788B                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                              0.0s
 => => transferring context: 216B                                                                                                              0.0s
 => [internal] load metadata for docker.io/library/alpine:3.6                                                                                  0.9s
 => CANCELED [1/8] FROM docker.io/library/alpine:3.6@sha256:66790a2b79e1ea3e1dabac43990c54aca5d1ddf268d9a5a0285e4167c8b24475                   0.2s
 => => resolve docker.io/library/alpine:3.6@sha256:66790a2b79e1ea3e1dabac43990c54aca5d1ddf268d9a5a0285e4167c8b24475                            0.0s
 => => sha256:66790a2b79e1ea3e1dabac43990c54aca5d1ddf268d9a5a0285e4167c8b24475 1.41kB / 1.41kB                                                 0.0s
 => => sha256:36c3a913e62f77a82582eb7ce30d255f805c3d1e11d58e1f805e14d33c2bc5a5 528B / 528B                                                     0.0s
 => => sha256:43773d1dba76c4d537b494a8454558a41729b92aa2ad0feb23521c3e58cd0440 1.51kB / 1.51kB                                                 0.0s
 => => sha256:5a3ea8efae5d0abb93d2a04be0a4870087042b8ecab8001f613cdc2a9440616a 0B / 2.02MB                                                     0.2s
 => [internal] load build context                                                                                                              0.2s
 => => transferring context: 16.10MB                                                                                                           0.2s
 => CACHED [2/8] RUN apk update &&    apk add python3-dev             uwsgi uwsgi-python3             build-base bash             libffi-dev   0.0s
 => ERROR [3/8] ADD requirements /opt/app/requirements                                                                                         0.0s
------
 > [3/8] ADD requirements /opt/app/requirements:
------
failed to solve: failed to compute cache key: failed to calculate checksum of ref moby::1z31onjgqy8fbxcs0mkshwqzz: "/requirements": not found
make: *** [Makefile:26: start] Error 17

I assume that README.md is not up to date while the last update was 4 years ago. Can you help me with easy start?

Help a noob out

Hey guys, im new to all of this. I have a server, got LAMP installed and cloned this to it. Where do i go from here? is there an install guide someone could point me to?

OSX : "make setup" throws "Operation not permitted"

was able to work around the issue by removing "chown 1001 -R data/log data/media" from MakeFile. also did chmod -R 777 data

error stack:
xxxx@MacBook-Pro uchan % make setup
docker-compose up -d
uchan_memcached_1 is up-to-date
Starting uchan_assets_1 ...
uchan_app_1 is up-to-date
uchan_db_1 is up-to-date
uchan_queue_1 is up-to-date
Starting uchan_assets_1 ... done
uchan_nginx_1 is up-to-date
uchan_varnish_1 is up-to-date
chown 1001 -R data/log data/media
chown: -R: No such file or directory
chown: data/log: Operation not permitted
chown: data/media: Operation not permitted
make: *** [setup] Error 1

Request for comment regarding "list of possible features"

Please check the boxes if they are implemented / "not useful"

  • User-created boards
  • Group/Community moderation on boards
  • Registered accounts
    • Board Owners (person who owns the board)
    • Board Volunteers (person who helps the BO)
  • Board tags for use in board searching
  • Board names (alphanumeric)
    • case insensitive form cyberpunk (used in URLs)
    • display form /CyberPunk/ (as displays)
  • Board announcements a.k.a. "red bar of text on the top of the page"
  • Board links to other boards a.k.a. "Sister/Collaborate boards"
  • Moderation activity and board claiming/transfer
  • File support
    • Music (MP3, OGG/OGA/MOGG, OPUS, APE, FLAC, WAV, AAC/M4A/3GP, AIFF/AIF/AIFC, WMA/WMV, ALAC/M4A/CAF, etc.)
    • Video (MP4/M4P/M4V, MKV, WMV, MOV/QT, AVI, FLV, OGV, MPG/MP2/MPEG/MPE/MPV etc.)
    • Images (APNG, WEBP, FLIF, HEIF, AVIF etc.)
    • Ebooks (PDF, EPUB, MOBI, DJVU)
  • GET scripts (for /sp/)
  • Cycled Threads (deletes old posts except OP in order to keep it from getting bumplocked)
    • User-invoked
    • Moderation-invoked (by Owner or Volunteer)
  • Top Stickied Threads (must be Moderation-invoked)
  • Bottom Stickied Threads (must be Moderation-invoked)
  • Wiki/FAQ
  • Board flags (255 flags per board)
  • Board banners
  • Board ranking system
    • Most active boards (based on post count per hour)
    • Most popular boards (based on users per day)
  • Minimum character count per OP
  • Minimum image count per OP
  • archives
    • Custom in-house archives
    • Usage of archive.fo
  • Meta-boards (see https://nerv.8ch.net/tech/cyber/g/sudo/prog/sci/)
  • Word filters
    • Auto word ban (for spam)
    • Word filters/translators (for censorship/obfuscation)
  • Tab icon alerts
    • blinks/changes to alert thread activity
    • Tab title has a number with parentheses indicating number of new posts
    • Tab title has an exclamation point indicating "slid" thread
  • Hide mechanism
    • Hide singular post
    • Hide by ID
    • Hide by Name or Flag
    • Hide by keyword in text
  • Report mechanism
    • Report to local board moderation
    • Report to global moderation
    • Ease of moderation through checking all posts from one ID
    • Ease of moderation through checking all posts with similar names or other markers
  • Video embedding
    • Re-route YouTube videos to invidio.us
  • User ID
    • Unique ID hash for each board (requires a salt for every board)
    • Unique ID hash for each thread (requires a salt for every thread)
    • ID representation as psuedo-names (see http://worrydream.com/tripphrase/)
  • Dice roll like https://app.roll20.net/assets/dengine.js?v=123
  • (you) counter or highlighter
  • File boards (see http://boards.4chan.org/f/ and https://8ch.net/tdt/ )

Example instance

Would like to see what the software looks like (out of curiosity).

Bad referer header

I tried to deploy as it was written in readme. In the config I wrote my keys for the reCAPTCHA and it seems they are working correctly. Imageboard has started with no warnings in logs and I created new mod. When I tried to login with my username, password and passed captcha I got Bad referer header.
This error raised in verify.py, but I cant find where is check_csrf_referer() and what it does.

Contacts in the ReadME

Since this project could really take off, is it possible to include your contacts in the ReadMe?

  • Discord (preferably)
  • EMail
  • IRC
  • Matrix

reCaptcha invalid site key

No matter what type of recaptcha I use (v3 or v2) I always get the "invalid site key" error. I've tried lots of stuff up to this point but I can't seem to figure it out.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.