tandoorrecipes / recipes Goto Github PK
View Code? Open in Web Editor NEWApplication for managing recipes, planning meals, building shopping lists and much much more!
Home Page: https://docs.tandoor.dev
License: Other
Application for managing recipes, planning meals, building shopping lists and much much more!
Home Page: https://docs.tandoor.dev
License: Other
the process of adding a provider and monitor should be documented more clearly within the web interface
when clicking the cart button in the recipe view markdown format is loaded as default even though the checkbox isn't selected.
Hello,
I currently run this application on a Kubernetes cluster and have working manifests.
Are you interested in upstreaming them? Similar to the docker-compose files.
g
should be configurable as the default unit
https://github.com/vabene1111/recipes/blob/develop/docker-compose.yml#L19-L20
volumes:
- .:/Recipes
would contain the docker-compose.yml
and the Dockerfile
if a hacker compromises the webapp and gains filesystem access they could modify the Dockerfile
to contain anything or worse the docker-compose.yml
could be modified to contain anything.
I added my Dropbox as remote. When I trigger the sync on the "configure sync" page a success message pops up but the folder in my Dropbox is still empty.
When the sync works correctly something should appear in my Dropbox, shouldn't it?
everything is better with dark mode (also maybe some color customization).
Maybe using https://github.com/ColinEspinas/darken
allow each user to have favorites
basic permission concept at least for storage backends and managemtent functions
It appears there are certain standardized recipe markup languages that could be used to support interoperability and import/export of recipes.
the emoji view is a kinda ugly library with all emojis hosted as images locally. maybe there is something better now or we at least need to update the local files i think
by rendering markdown with | safe there is a risk of showing unsafe data on the page and thus allowing XSS
as mentioned here
there should be an image available that runs on raspi by default.
might work by adding an additional github release action https://github.com/marketplace/actions/build-and-publish-changed-multi-platform-docker-images
Whilst i appreciate the (Assuming) german... is there any translations?
ta
maybe this makes the whole PDF viewer hassle a little easier
Is it possible to have a generic compose file, which just build and presents the UI over a specific port?
This should ease the testing of it, and allow for simpler local deployments, without having to have a seperate NGINX container.
cheers
when setting up a new dev environment .idea files seem to be missing.
Add the unit merger for ingredients
I won’t ask for conversations because there’s a thousand tools for that but I will ask for recipe scaling.
and verify edit permissions
select mostly working
TODO
STDOUT logs
⇒ docker-compose kill && docker-compose rm -f && docker-compose up -d && docker-compose logs -f
Killing recipes_web_recipes_1 ... done
Killing recipes_db_recipes_1 ... done
Going to remove recipes_web_recipes_1, recipes_db_recipes_1
Removing recipes_web_recipes_1 ... done
Removing recipes_db_recipes_1 ... done
Creating recipes_db_recipes_1 ... done
Creating recipes_web_recipes_1 ... done
Attaching to recipes_web_recipes_1, recipes_db_recipes_1
db_recipes_1 | The files belonging to this database system will be owned by user "postgres".
db_recipes_1 | This user must also own the server process.
db_recipes_1 |
db_recipes_1 | The database cluster will be initialized with locale "en_US.utf8".
db_recipes_1 | The default database encoding has accordingly been set to "UTF8".
db_recipes_1 | The default text search configuration will be set to "english".
db_recipes_1 |
db_recipes_1 | Data page checksums are disabled.
db_recipes_1 |
db_recipes_1 | fixing permissions on existing directory /var/lib/postgresql/data ... ok
db_recipes_1 | creating subdirectories ... ok
db_recipes_1 | selecting default max_connections ... 100
db_recipes_1 | selecting default shared_buffers ... 128MB
db_recipes_1 | selecting default timezone ... UTC
db_recipes_1 | selecting dynamic shared memory implementation ... posix
db_recipes_1 | creating configuration files ... ok
db_recipes_1 | running bootstrap script ... ok
db_recipes_1 | sh: locale: not found
db_recipes_1 | 2020-01-13 23:29:15.818 UTC [28] WARNING: no usable system locales were found
db_recipes_1 | performing post-bootstrap initialization ... ok
db_recipes_1 | syncing data to disk ... ok
db_recipes_1 |
db_recipes_1 | Success. You can now start the database server using:
db_recipes_1 |
db_recipes_1 | WARNING: enabling "trust" authentication for local connections
db_recipes_1 | You can change this by editing pg_hba.conf or using the option -A, or
db_recipes_1 | --auth-local and --auth-host, the next time you run initdb.
db_recipes_1 |
db_recipes_1 | pg_ctl -D /var/lib/postgresql/data -l logfile start
db_recipes_1 |
db_recipes_1 | waiting for server to start....2020-01-13 23:29:18.638 UTC [33] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_recipes_1 | 2020-01-13 23:29:18.815 UTC [34] LOG: database system was shut down at 2020-01-13 23:29:16 UTC
db_recipes_1 | 2020-01-13 23:29:18.841 UTC [33] LOG: database system is ready to accept connections
db_recipes_1 | done
db_recipes_1 | server started
db_recipes_1 | CREATE DATABASE
db_recipes_1 |
db_recipes_1 |
db_recipes_1 | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
db_recipes_1 |
db_recipes_1 | waiting for server to shut down....2020-01-13 23:29:19.646 UTC [33] LOG: received fast shutdown request
db_recipes_1 | 2020-01-13 23:29:19.694 UTC [33] LOG: aborting any active transactions
db_recipes_1 | 2020-01-13 23:29:19.695 UTC [33] LOG: background worker "logical replication launcher" (PID 40) exited with exit code 1
db_recipes_1 | 2020-01-13 23:29:19.695 UTC [35] LOG: shutting down
db_recipes_1 | 2020-01-13 23:29:20.195 UTC [33] LOG: database system is shut down
db_recipes_1 | done
db_recipes_1 | server stopped
db_recipes_1 |
db_recipes_1 | PostgreSQL init process complete; ready for start up.
db_recipes_1 |
db_recipes_1 | 2020-01-13 23:29:20.318 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
db_recipes_1 | 2020-01-13 23:29:20.318 UTC [1] LOG: listening on IPv6 address "::", port 5432
db_recipes_1 | 2020-01-13 23:29:20.434 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_recipes_1 | 2020-01-13 23:29:20.676 UTC [44] LOG: database system was shut down at 2020-01-13 23:29:20 UTC
db_recipes_1 | 2020-01-13 23:29:20.732 UTC [1] LOG: database system is ready to accept connections
web_recipes_1 | [2020-01-13 23:29:20 +0000] [1] [INFO] Starting gunicorn 19.7.1
web_recipes_1 | [2020-01-13 23:29:20 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
web_recipes_1 | [2020-01-13 23:29:20 +0000] [1] [INFO] Using worker: sync
web_recipes_1 | [2020-01-13 23:29:20 +0000] [8] [INFO] Booting worker with pid: 8
web_recipes_1 | [2020-01-13 23:29:20 +0000] [8] [ERROR] Exception in worker process
web_recipes_1 | Traceback (most recent call last):
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/arbiter.py", line 578, in spawn_worker
web_recipes_1 | worker.init_process()
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/workers/base.py", line 126, in init_process
web_recipes_1 | self.load_wsgi()
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/workers/base.py", line 135, in load_wsgi
web_recipes_1 | self.wsgi = self.app.wsgi()
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/app/base.py", line 67, in wsgi
web_recipes_1 | self.callable = self.load()
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
web_recipes_1 | return self.load_wsgiapp()
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
web_recipes_1 | return util.import_app(self.app_uri)
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/util.py", line 352, in import_app
web_recipes_1 | __import__(module)
web_recipes_1 | ModuleNotFoundError: No module named 'recipes'
web_recipes_1 | [2020-01-13 23:29:20 +0000] [8] [INFO] Worker exiting (pid: 8)
web_recipes_1 | [2020-01-13 23:29:20 +0000] [1] [INFO] Shutting down: Master
web_recipes_1 | [2020-01-13 23:29:20 +0000] [1] [INFO] Reason: Worker failed to boot.
web_recipes_1 | [2020-01-13 23:29:25 +0000] [1] [INFO] Starting gunicorn 19.7.1
web_recipes_1 | [2020-01-13 23:29:25 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
web_recipes_1 | [2020-01-13 23:29:25 +0000] [1] [INFO] Using worker: sync
web_recipes_1 | [2020-01-13 23:29:25 +0000] [8] [INFO] Booting worker with pid: 8
web_recipes_1 | [2020-01-13 23:29:25 +0000] [8] [ERROR] Exception in worker process
web_recipes_1 | Traceback (most recent call last):
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/arbiter.py", line 578, in spawn_worker
web_recipes_1 | worker.init_process()
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/workers/base.py", line 126, in init_process
web_recipes_1 | self.load_wsgi()
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/workers/base.py", line 135, in load_wsgi
web_recipes_1 | self.wsgi = self.app.wsgi()
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/app/base.py", line 67, in wsgi
web_recipes_1 | self.callable = self.load()
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
web_recipes_1 | return self.load_wsgiapp()
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
web_recipes_1 | return util.import_app(self.app_uri)
web_recipes_1 | File "/usr/local/lib/python3.6/dist-packages/gunicorn/util.py", line 352, in import_app
web_recipes_1 | __import__(module)
web_recipes_1 | ModuleNotFoundError: No module named 'recipes'
web_recipes_1 | [2020-01-13 23:29:25 +0000] [8] [INFO] Worker exiting (pid: 8)
web_recipes_1 | [2020-01-13 23:29:25 +0000] [1] [INFO] Shutting down: Master
web_recipes_1 | [2020-01-13 23:29:25 +0000] [1] [INFO] Reason: Worker failed to boot.
docker-compose.yml
version: "3"
services:
db_recipes:
restart: always
image: "postgres:11-alpine"
volumes:
- ../../persist/db/recipes/:/var/lib/postgresql/data
env_file:
- ../../persist/config/recipes/env
networks:
- default
web_recipes:
build: .
restart: always
env_file:
- ../../persist/config/recipes/env
command: "gunicorn --bind 0.0.0.0:8080 recipes.wsgi"
volumes:
- ../../persist/db/data/:/Recipes
depends_on:
- db_recipes
labels:
- traefik.port=8080
- traefik.frontend.rule=Host:recipes.EXAMPLE.com
- "traefik.backend=recipes"
- "traefik.docker.network=traefik"
- "traefik.expose=true"
networks:
- traefik
- default
# nginx_recipes:
# image: "nginx"
# restart: always
# env_file:
# - ./.env
# volumes:
# - ./nginx/conf.d:/etc/nginx/conf.d
# - ./staticfiles:/static
# - ./mediafiles:/media
# networks:
# - default
# - nginx-proxy
networks:
default:
traefik:
external: true
# nginx-proxy:
# external:
# name: nginx-proxy
env
#VIRTUAL_HOST=
#LETSENCRYPT_HOST=
#LETSENCRYPT_EMAIL=
DEBUG=1
ALLOWED_HOSTS=*
SECRET_KEY=jWoHZyoZSwmjRR5jCTFDSMqneXEdFYzperDtDtxMVdBk5oYB3mnsfDw4VLyC35s
DB_ENGINE=django.db.backends.postgresql_psycopg2
POSTGRES_HOST=db_recipes
POSTGRES_PORT=5432
POSTGRES_USER=djangodb
POSTGRES_PASSWORD=djangodb
POSTGRES_DB=djangodb
After my own build I'm always getting this error on start. I don't know much about python modules.
Thank you in advance
The error logs:
recipes | [2020-01-14 14:30:21 +0000] [1] [INFO] Starting gunicorn 19.7.1
recipes | [2020-01-14 14:30:21 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
recipes | [2020-01-14 14:30:21 +0000] [1] [INFO] Using worker: sync
recipes | [2020-01-14 14:30:21 +0000] [8] [INFO] Booting worker with pid: 8
recipes | [2020-01-14 14:30:21 +0000] [8] [ERROR] Exception in worker process
recipes | Traceback (most recent call last):
recipes | File "/usr/local/lib/python3.6/dist-packages/gunicorn/arbiter.py", line 578, in spawn_worker
recipes | worker.init_process()
recipes | File "/usr/local/lib/python3.6/dist-packages/gunicorn/workers/base.py", line 126, in init_process
recipes | self.load_wsgi()
recipes | File "/usr/local/lib/python3.6/dist-packages/gunicorn/workers/base.py", line 135, in load_wsgi
recipes | self.wsgi = self.app.wsgi()
recipes | File "/usr/local/lib/python3.6/dist-packages/gunicorn/app/base.py", line 67, in wsgi
recipes | self.callable = self.load()
recipes | File "/usr/local/lib/python3.6/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
recipes | return self.load_wsgiapp()
recipes | File "/usr/local/lib/python3.6/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
recipes | return util.import_app(self.app_uri)
recipes | File "/usr/local/lib/python3.6/dist-packages/gunicorn/util.py", line 352, in import_app
recipes | __import__(module)
recipes | ModuleNotFoundError: No module named 'recipes'
recipes | [2020-01-14 14:30:22 +0000] [8] [INFO] Worker exiting (pid: 8)
recipes | [2020-01-14 14:30:22 +0000] [1] [INFO] Shutting down: Master
recipes | [2020-01-14 14:30:22 +0000] [1] [INFO] Reason: Worker failed to boot.
check if appropriate sanitization is applied to ingredients submitted
delete redirect takes the lower case name of a model to find the delete view. This is ugly and should be refactored. For some elements its broken atm.
Hello,
I propose a feature that allows viewing the recipes/cookbooks without a login. Could also be handled via a guest account.
I'm not sure how this would work with the current user handling in the application. If we come to a conclusion here I'd take a look how I could implement this feature.
P.S. That you for the great project!
Someone suggested meal planning and i think that would fit into this application without making it to complex.
I entered a recipe successfully, but once I added tags to it, I can no longer view it getting a TypeError. I have attached the full error message
TypeError at _view_recipe_1.zip
Request Method: | GET |
---|---|
http://recipes.zuzax.com/view/recipe/1 | |
3.0.4 | |
TypeError | |
unsupported operand type(s) for +: 'NoneType' and 'str' | |
/Recipes/cookbook/models.py in , line 102 | |
/usr/bin/python3 | |
3.6.9 | |
['/Recipes', '/usr/local/bin', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages'] | |
Mon, 16 Mar 2020 00:32:27 +0100 |
There should be versions for the dependencies in the requirements.txt
Also, if I may ask, do you use gunicorn as a development dependency? Otherwise it should be removed from the requirements.txt and manually installed in the Dockerfiles. Because it is (probaby) only used there
everything except jpg trows errors, needs to be handled correctly
either a separate page or a certain view option or css magic to be able to print a recipe nicely
The different API helpers (currently dropbox and NC) should be refactored, error handling needs to be added and everything needs to be cleaned up.
Hi,
I saw this project on reddit and want to give it a shot on my unraid server. I have postgresql setup separately in docker and it appears to be running, I can connnect to it with adminer.
The recipe docker is setup up with the ENVIRONMENT variable found in the .env file, with the db setting pointing to my postgresql docker
Here is what I get in the docker container logs
Updating database
Operations to perform:
Apply all migrations: admin, auth, contenttypes, cookbook, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying cookbook.0001_initial... OK
Applying cookbook.0002_auto_20191119_2035... OK
Traceback (most recent call last):
File "/opt/recipes/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 86, in _execute
return self.cursor.execute(sql, params)
psycopg2.errors.InsufficientPrivilege: permission denied to create extension "pg_trgm"
HINT: Must be superuser to create this extension.
he above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 15, in
execute_from_command_line(sys.argv)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/core/management/init.py", line 401, in execute_from_command_line
utility.execute()
File "/opt/recipes/venv/lib/python3.8/site-packages/django/core/management/init.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/core/management/base.py", line 328, in run_from_argv
self.execute(*args, **cmd_options)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/core/management/base.py", line 369, in execute
output = self.handle(*args, **options)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/core/management/base.py", line 83, in wrapped
res = handle_func(*args, **kwargs)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 231, in handle
post_migrate_state = executor.migrate(
File "/opt/recipes/venv/lib/python3.8/site-packages/django/db/migrations/executor.py", line 117, in migrate
state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/db/migrations/executor.py", line 245, in apply_migration
state = migration.apply(state, schema_editor)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/db/migrations/migration.py", line 124, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/contrib/postgres/operations.py", line 21, in database_forwards
schema_editor.execute("CREATE EXTENSION IF NOT EXISTS %s" % schema_editor.quote_name(self.name))
File "/opt/recipes/venv/lib/python3.8/site-packages/django/db/backends/base/schema.py", line 142, in execute
cursor.execute(sql, params)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 100, in execute
return super().execute(sql, params)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 68, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 86, in _execute
return self.cursor.execute(sql, params)
File "/opt/recipes/venv/lib/python3.8/site-packages/django/db/utils.py", line 90, in exit
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/opt/recipes/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 86, in _execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: permission denied to create extension "pg_trgm"
HINT: Must be superuser to create this extension.
Any thoughts?
function that randomly picks something to cook, probably depeending on tags
Bear with me a bit, this is literally my first time using Docker and also first experience in any non-plug and play server software.
I am currently having a problem accessing the server on every device but my machine that I'm hosting it on, but even then none of the CSS loads.
I'm trying to get this to work over my public IP address to that friends and family can use it as well.
Tell me if there is anything that I could give you that would make this easier to solve
Thank you!
Add option to show meal plan by default when opening the page
its not logical nor is it clean, needs restructuring
Links appear to not be rendered correctly, probably a bleach problem.
Renders empty text
since the tag search comes from some plugin it is not styled correctly.
so far i wasn't able to fix this but it looks ugly so we should fix it
show currently active area in nav ?!
ERROR: django-emoji-picker 0.0.5 has requirement django<3,>=2, but you'll have django 3.0.3 which is incompatible.
I love the idea of this, however i constantly have issues installing it.
I would typically expect that a docker-compose file gets everything started to a default installation, without the nginx reverse proxy.
My current compose looks like this:
version: "3"
services:
db_recipes:
restart: always
image: "postgres:11-alpine"
volumes:
- ./postgresql:/var/lib/postgresql/data
env_file:
- ./.env
networks:
- default
web_recipes:
build: .
restart: unless-stopped
env_file:
- ./.env
command: "gunicorn --bind 0.0.0.0:8080 recipes.wsgi"
volumes:
- .:/Recipes
depends_on:
- db_recipes
networks:
- default
ports:
- 5678:8080
networks:
default:
I managed to create the admin user, but the system does not load any CSS, and it now looks like this:
and i have the following errors:
web_recipes_1 | [2020-03-08 03:03:51 +0000] [1] [INFO] Starting gunicorn 20.0.4
web_recipes_1 | [2020-03-08 03:03:51 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
web_recipes_1 | [2020-03-08 03:03:51 +0000] [1] [INFO] Using worker: sync
web_recipes_1 | [2020-03-08 03:03:51 +0000] [9] [INFO] Booting worker with pid: 9
web_recipes_1 | Not Found: /static/themes/flatly.min.css
web_recipes_1 | Not Found: /static/themes/select2-bootstrap-theme.css
web_recipes_1 | Not Found: /static/fontawesome/fontawesome_all.min.css
web_recipes_1 | Not Found: /static/themes/select2-bootstrap-theme.css
web_recipes_1 | Not Found: /static/fontawesome/fontawesome_all.min.css
web_recipes_1 | Not Found: /static/favicon.png
any help with the setup would be appreciated!
with the addition of the urlize
tag in #56 the rendering of markdown links broke.
This was somewhat mitigated in #d702c08a12c9483b74c98e08d6b4d5799cfc90de but is still not 100% working e.g. the follwing links will not render correctly
[Test Link](https://www.google.com/test?whatever)
while the following works fine
[Test Link](https://www.google.com)
for some reason tables in markdown style are not rendered. Also bleaching has broken tables a bit
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.