fsinfuhh / bitpoll Goto Github PK
View Code? Open in Web Editor NEWA web application for scheduling meetings and general polling.
License: GNU General Public License v3.0
A web application for scheduling meetings and general polling.
License: GNU General Public License v3.0
Hi!
Bitpoll seems to use Django but not be listed as a "project" (in contrast to "apps") at djangopackages.org:
https://djangopackages.org/categories/projects/
Are you aware of that site?
Best, Sebastian
This is a great tool in place of doodle and offers a lot of flexibility.
A suggestion: As people make typos, it is good to have the edit function with which entries can be modified. As hard as it may be to believe, people even mis-type their names, and it would be useful to allow changing the name as well.
Hello,
we have an issue if we try to reset a password with the "Reset password" button. After clicking, we get a 500 server error. I recorded the webserver's error.log and it seems to be a problem with raven, but the pip package "raven" is installed as listed in requirements-production.txt (raven==6.3.0). It is possible to register new users and receive the registration mail, so our e-mail settings in general are set correctly. We use an Ubuntu 16.04 LTS with Apache as server and a python 3.5 virtualenv for Bitpoll. There is also a problem with encoding in the locale/de_DE/LC_MESSAGES/django.po at line 1971 because the "Ü" at "Passwort zurücksetzen" is not displayed correctly. I try to add this to the repository later. Please tell me if you need further information. Any ideas? Thanks in advance.
Greetings, Ludwig
error.log
I suggest to add the output of the coffee
and sass
compilers to the repository, so people using the software don't need them as dependency (installing both for the current user if no superuser privileges are available can be quite a hassle, like on a uberspace account).
Hi,
the back button on creating polls does not work. 'Seems to be a content security policy' problem.
Browser: Firefox on Linux (persists on safe mode)
Error in console (from bitpoll.mafiasi.de): Content Security Policy: Die Einstellungen der Seite haben das Laden einer Ressource auf self blockiert ("script-src https://bitpoll.mafiasi.de https://sentry.mafiasi.de 'nonce-XXXXXXXX'").
If a person is required (or important) to be there, it might make sense to have a different weight for the different participants.
This could either be solved by predetermining this at the creation of the bitpoll or by the participant themselves declaring their importance.
Hey, I just tested our BitPoll instance and found some minor bugs concerning the Groups feature:
Shouldn't be too hard to fix these but it would increase the usability of the feature quite a bit.
Tested with version 0c83e17
i would like to use a german locale but it stays english. i found LANGUAGE_CODE = 'de-de'
in bitpoll/settings.py
by default (while #LANGUAGE_CODE = 'en-us'
is in bitpoll/settings_local.sample.py
- wasnt that meant to doc the default?) but however i change that setting i see english.
i wonder why that is "en-us" while the name of the locale is "en_US", but even if i set it to en_US or de_DE it doesnt work for me. what did i do wrong? i blindly followed the instructions in the README...
It is possible to select dates to be voted on, but date ranges would also be useful. E.g. selecting one of several weekends. You can emulate this by inserting always the Friday (which is not intuitive and needs extra explanation), or by selecting a "normal poll" and naming the entries yourself, which can be cumbersome for a lot of options
Hi,
I'm trying to implement and start your project on my Win10, python 3.6.
When trying to migrate the manage.py, the error
"TypeError: attribute name must be string, not 'bytes'"
pops up, with multiple files and lines in reference. The last one is
.pyenv\lib\site-packages\django\db\models\fields\related.py", line 744, in contribute_to_related_class
setattr(cls._meta.concrete_model, related.get_accessor_name(), self.related_accessor_class(related))
As I do not have much knowledge about python and coding in general, I don't know whether this matters or not - when starting the server without migrating, the error when opening the page is
"django.template.exceptions.TemplateSyntaxError: 'raven' is not a registered tag library. Must be one of: [...] "
Thanks and regards
When the date is decided it might make sense to finish voting and declare one date as the chosen one.
All participants should be notified of this.
I have just encountered Bitpoll and really like it. The only thing stopping me switching from e.g. Doodle is that I could not find a way to specify the event duration and/or end time (apart from as a comment in the poll). I consider this critical for people to easily see which blocks of time they may be available for.
Did I miss this someone? Or, if not, is it on the roadmap?
Thanks!
This is a feature idea, probably quite complex:
Instead of having a fixed set of vote options, a poll might always cover a time range in the future, e.g. the next 2 weeks. One would have to configure
When viewing and filling out a poll, the possible responses are currently sorted in an unintuitive way. We should change this to an order which makes more sense.
One such order would be to sort the responses by its weight (agree, only if necessary, maybe, disagree) or something like that.
Hi there,
I just tried bitpoll to plan the talks/discussions for our upcoming "Symposium on crossmodal learning", which runs for three days. We have email feedback from several people listing times they can and cannot attend. Bitpoll/Doodle would be a good option to plan this (and to allow other people to directly add their timeslots instead of sending emails).
But. Neither bitpoll (nor doodle) seem to support this. We can either have multiple timeslots on a single day, or multiple "whole" days without times. Why is that? Is this an inherent limitation of the underlying code, or just concentrating on the two most important use-cases?
Anyway, the bitpoll GUI promises that time information can be added after selecting the days, but pressing "next" finishes the poll with days-only.
In my opinions polls are per definition short lived.
There should be no reason to keep them longer as needed to establish an result.
To increase privacy, the user should have the option to limit the lifetime (add an auto deletion date, no matter if the user is registered or not) of a self created poll.
The administrator of a page should be able to set a maximal lifetime of a poll (or deactivate it).
I will create a PR in the upcoming weeks.
Currently, when a user in unauthenticated, the button to assign a vote to a user is shown, but when the user tries to assign the vote, an empty page with status code 403 is shown. Instead, the "Assign user" button should not be displayed in this case.
We should make it possible & document how to run bitpoll in a subdirectory of a webspace, if a subdomain is not available (think intranet servers without fqdn)
I want to login via
OAuth2 / OpenIdConnect
//might help
https://www.gluu.org/gluu-server/
https://github.com/GluuFederation/oxd-python
First of all, thanks for your great work!
When I try to install your application in release version 0.9 and run the ./manage.py migrate
command, I get the following error:
django.db.utils.OperationalError: no such table: django_content_type
How to reproduce:
docker run -p 8000:8000 -v /path/on/host/settings_local.py:/Bitpoll/bitpoll/settings_local.py -v /path/on/host/database/:/Bitpoll/database/ -d chessmasterrr/bitpoll:latest
docker exec <containerID> ./manage.py migrate
resulting in this error trace:Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 383, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such table: django_content_type
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 323, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 364, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 83, in wrapped
res = handle_func(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 87, in handle
executor = MigrationExecutor(connection, self.migration_progress_callback)
File "/usr/local/lib/python3.8/site-packages/django/db/migrations/executor.py", line 18, in __init__
self.loader = MigrationLoader(self.connection)
File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 49, in __init__
self.build_graph()
File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 206, in build_graph
self.load_disk()
File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 108, in load_disk
migration_module = import_module(migration_path)
File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 783, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/usr/local/lib/python3.8/site-packages/django_token_bucket/migrations/0002_auto_20191216_1228.py", line 10, in <module>
class Migration(migrations.Migration):
File "/usr/local/lib/python3.8/site-packages/django_token_bucket/migrations/0002_auto_20191216_1228.py", line 26, in Migration
field=models.ForeignKey(default=ContentType.objects.get_for_model(get_user_model()).id, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'),
File "/usr/local/lib/python3.8/site-packages/django/contrib/contenttypes/models.py", line 51, in get_for_model
ct = self.get(app_label=opts.app_label, model=opts.model_name)
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 402, in get
num = len(clone)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 256, in __len__
self._fetch_all()
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1242, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 55, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1133, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 67, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 89, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 383, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: django_content_type
Can you give me a hint what I am doing wrong?
If any further information are needed I will be happy to provide them.
https://bitpoll.mafiasi.de/poll/gurps-kw36/vote/
Verboten (403)
CSRF-Verifizierung fehlgeschlagen. Anfrage abgebrochen.
Sie sehen Diese Nachricht, da diese Seite einen CSRF-Cookie beim Verarbeiten von Formulardaten benötigt. Dieses Cookie ist aus Sicherheitsgründen notwendig, um sicherzustellen, dass Ihr Webbrowser nicht von Dritten missbraucht wird.
Falls Sie Cookies in Ihren Webbrowser deaktiviert haben, müssen Sie sie mindestens für diese Seite oder für „Same-Origin“-Verbindungen reaktivieren.
Mehr Information ist verfügbar mit DEBUG=True.
If a url is inserted into the choice text it is automatically stripped apart due to grouping. Is there a possibility to escape slashes to prevent grouping?
Hi,
I currently switch from Doodle to Bitpoll for our institute's lecture timing. So far, Bitpoll works great.
In Doodle, I had the option to export poll results to various spreadsheet formats.
I could not find a similar option in Bitpoll. Is there an option to create a csv
file or similar, that would contain all votees along with their detailed votes? It would be very much sufficient to have the table from the overview page as csv.
I process the poll data in LibreOffice Calc to finalise our planing, so a more direct connection would be really helpful.
Copy&Pasting from the website sadly does not work, as the symbols for each vote do not get copied; also, the comments are lost.
Thanks,
Florian
Hello,
after I had to rebuild my container images I'm unable to build the production requirements:
Could not find a version that satisfies the requirement django-markdown-app==0.11.1 (from -r requirements-production.txt (line 8)) (from versions: 0.8.5, 0.8.5.1, 0.9.3.1, 0.9.4, 0.9.4.1) No matching distribution found for django-markdown-app==0.11.1 (from -r requirements-production.txt (line 8))
Both of the requirement files are listing the same version so I can't build dudle with that version provided.
The nickname a user can set in their mafisia account is not used in bitpoll. When voting as a logged in user the full first name is shown.
Hello, does this app have an API ?
I would like to be able to create poll automatically and retrieve the link.
Regards
Hi there, If people want to change their vote, they often submit a second vote instead of editing the first one. How can a double entry (twice the same person) be deleted?
When creating a new user without first and last name, a link is sent to the user by e-mail. Thereupon he can choose a password, but this always leads to the following error:
"Sorry, but the provided token is invalid."
Creating a user with first and last name works without problems.
Expected behavior: When creating a user, the system already informs the user that he or she must enter first and last name.
The database used is sqlite.
Use Case:
When you are conducting studies you usually have a few time slots per day. In each slot you need exactly one person. Each person can only participate in the study one time. Therefore it is necessary to limit each time slot to one person and each person to one time slot.
Implementation:
This use case is obviously only one of many for the Bitpoll. A poll setting is therefore the best way to realize this from the user perspective.
It would be cool to have this project enabled for Docker deployments.
https://github.com/fsinfuhh/Bitpoll/blob/master/bitpoll/settings.py contains a SECRET_KEY, which should NOT be in the repo, as the accompanying comment says, and also the docs:
Instead of hardcoding the secret key in your settings module, consider loading it from an environment variable
Even while nobody is using my bitpoll instance, the python process (running python ./manage.py runserver 0.0.0.0:8888) uses around 16% of my cpu (measured via top). Admittedly it is not a powerful NCU, but that still seems very high just for idling.
Is there anything I can do to help find the root cause?
While testing I also found an inconvenience with assigning votes and the ownership of a poll to users.
When inviting Users to a group it shows you the available users when you start typing the name.
However when assigning a vote to a user, or claiming ownership of a poll, it doesn't show the available users, so you need to know the exact name of the user you want to assign it to.
It would be quite nice if this feature would be available for assigning users here as well.
Also I sometimes had problems assigning Ownership of a poll to an account, however I can't trigger this bug reliably and it occours quite rarely, so I don't know what could be the cause of this and it may well be a problem with my browser.
Tested with version 0c83e17
Prior votes seem to be influencing bitpoll participants so it would be nice if there was an option that you had to vote before you see the poll results.
I'm not exactly sure how this would work for anonymous users (ones that are not logged in). I guess you'd need to store it in a cookie, that they have already voted for this specific poll so that they can see the results if they revisit in the future.
Would be a great feature to have.
Hello,
we have some problems with the Apache WSGI module. The ./manage.py runserver command runs without any issues. But if we configure Apache to serve the project, we get a 500 server error and the error.log shows the following if we try to access the page:
[Tue Nov 21 11:59:36.362213 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] mod_wsgi (pid=3920): Target WSGI script '/opt/Bitpoll/bitpoll/wsgi.py' cannot be loaded as Python module.
[Tue Nov 21 11:59:36.362278 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] mod_wsgi (pid=3920): Exception occurred processing WSGI script '/opt/Bitpoll/bitpoll/wsgi.py'.
[Tue Nov 21 11:59:36.363007 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] Traceback (most recent call last):
[Tue Nov 21 11:59:36.363055 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "/opt/Bitpoll/bitpoll/wsgi.py", line 22, in
[Tue Nov 21 11:59:36.363059 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] application = Sentry(get_wsgi_application())
[Tue Nov 21 11:59:36.363065 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "/opt/Bitpoll/.pyenv/lib/python3.5/site-packages/django/core/wsgi.py", line 13, in get_wsgi_application
[Tue Nov 21 11:59:36.363068 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] django.setup(set_prefix=False)
[Tue Nov 21 11:59:36.363072 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "/opt/Bitpoll/.pyenv/lib/python3.5/site-packages/django/init.py", line 22, in setup
[Tue Nov 21 11:59:36.363075 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
[Tue Nov 21 11:59:36.363080 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "/opt/Bitpoll/.pyenv/lib/python3.5/site-packages/django/conf/init.py", line 56, in getattr
[Tue Nov 21 11:59:36.363083 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] self._setup(name)
[Tue Nov 21 11:59:36.363096 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "/opt/Bitpoll/.pyenv/lib/python3.5/site-packages/django/conf/init.py", line 41, in _setup
[Tue Nov 21 11:59:36.363099 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] self._wrapped = Settings(settings_module)
[Tue Nov 21 11:59:36.363104 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "/opt/Bitpoll/.pyenv/lib/python3.5/site-packages/django/conf/init.py", line 110, in init
[Tue Nov 21 11:59:36.363106 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] mod = importlib.import_module(self.SETTINGS_MODULE)
[Tue Nov 21 11:59:36.363113 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "/opt/Bitpoll/.pyenv/lib/python3.5/importlib/init.py", line 126, in import_module
[Tue Nov 21 11:59:36.363115 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] return _bootstrap._gcd_import(name[level:], package, level)
[Tue Nov 21 11:59:36.363120 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "", line 986, in _gcd_import
[Tue Nov 21 11:59:36.363125 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "", line 969, in _find_and_load
[Tue Nov 21 11:59:36.363130 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "", line 944, in _find_and_load_unlocked
[Tue Nov 21 11:59:36.363134 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "", line 222, in _call_with_frames_removed
[Tue Nov 21 11:59:36.363139 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "", line 986, in _gcd_import
[Tue Nov 21 11:59:36.363144 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "", line 969, in _find_and_load
[Tue Nov 21 11:59:36.363148 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] File "", line 956, in _find_and_load_unlocked
[Tue Nov 21 11:59:36.363164 2017] [wsgi:error] [pid 3920:tid 140031723976448] [remote 10.172.100.97:39859] ImportError: No module named 'bitpoll'
We use a Python 3.5 virtual environment on a Ubuntu 16.04 LTS x64 server. There is no information about that issue neither in your project documentation nor the official Django documentation. Who can help here?
Our Apache host configuration is the following:
<VirtualHost *:80>
WSGIDaemonProcess bitpoll python-home=/opt/Bitpoll/.pyenv python-path=/opt/Bitpoll/bitpoll
WSGIProcessGroup bitpoll
WSGIScriptAlias / /opt/Bitpoll/bitpoll/wsgi.py process-group=bitpoll
Alias /static/ /opt/Bitpoll/_static/
<Directory /opt/Bitpoll>
Require all granted
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Greetings,
Ludwig
It would be useful if a poll owner could disable all options which already have too less support (say, below a static or user-specified threshold) in a poll. This feature should be available to the poll owner, but not automatically applied; i.e., the poll owner should actively decide that a sufficiently large "critical mass" has voted.
-- Maybe we want to separate this issue from the following thoughts:
Furthermore, we may consider hiding some options having very low acceptance while displaying the poll (bonus points if hidden options can be interactively re-shown). This could be done on each request based on the current votes; however, as this is rather counter-productive for some kinds of polls, it should be possible to disable this behaviour.
Hey,
I just filled in a bitpoll that was provided by your magnificient service.
Doing so, I recognized that I often find myself giving the same answers multiple times in a bitpoll.
More specifically our fachschaft tends to create forms that range over multiple weeks.
Most of the times the answers I give to one week or one weekday can be applied to the other week/-days
Soooooo could you add a button for this?
Thanks ^_^
When using an english browser the date/time field changes the date on defocusing to an invalid format, for example 06.08.2017 21:00 instead of 05.08.2017 21:00.
UPDATE
I think setting the correct locale in the date/timepicker module should fix that:
jQuery.datetimepicker.setLocale('de');
Source: http://xdsoft.net/jqplugins/datetimepicker/#i18n
I would love to see the following:
In the "Create choice" view when you select which times should be combined with which days, the respective weekday could be displayed additionally.
I have a hard time finding my recently created polls in the poll overview. They seem to be sorted by due date, but then many of my polls don't have due dates. It might be good to have the option to sort polls by creation date. (One might even argue that this is the better default.)
When you complete a long poll that does not require a login, it is a common problem that you reach the end of the poll and realize you were not logged in. Sadly, at this point you have only two options:
It would be great if you could log in after finishing the poll before saving and all your answers would be assigned to your account.
If one attempts to change the parings of days and times to choose from, the table representing those options are always initialized, so that every paring is available, ignoring what has been set previously.
It would be handy and more collaborative, if the table was filled with existing pairings.
Hi there, I have a question.
as far as I know
If I am right, I wonder who takes care of the personal data, if people just decide to step back from that poll at any time.
If the initiator is no mafiasi member, he cannot fulfill the voters request to delete their personal data.
Am I right?
The UI only shows Date as "DD MM YYYY" and Date/Time is missing completely from the CSV export
Having a unix timestamp in the exported file would be nice
If a user has already declared they are available on date x, they should be shown, if they vote in another poll for the same date.
This can help prevent overlaps when two polls have the same result.
Hi!
It would be cool to see some screenshots or a live demo. Are there any?
Thanks and best, Sebastian
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.