movim / movim Goto Github PK
View Code? Open in Web Editor NEWMovim - Decentralized social platform
Home Page: https://movim.eu
License: GNU Affero General Public License v3.0
Movim - Decentralized social platform
Home Page: https://movim.eu
License: GNU Affero General Public License v3.0
According to http://wiki.movim.eu/en:dev:protocol_implementations Movim does not support MAM. How Movim can know about messages sent when the pod is offline?
MAM is supported by Conversations, Gajim, eJabberd and few others. It works nicely.
Please add labels to toolbar buttons (in the blue top row of the screen) when screen si large enough to show them. Function of some buttons is not that obvious, so it will help a lot.
Also the sidebar does not have to hide on large screens (desktop size). Look at GitLab's sidebar for example (it also has a hide button for situations when more space is required).
Apparently I just don't get any update from the movim client after the paused
.
17:43:37 IN <message id="fMtzKp" type="chat" from="edhelas[..]" to="ppjet[..]"><body>[..]</body><active xmlns="http://jabber.org/protocol/chatstates" /><request xmlns="urn:xmpp:receipts" /><replace xmlns="urn:xmpp:message-correct:0" /></message>
17:43:38 IN <message id="fMtzKp" type="chat" from="edhelas[..]" to="ppjet[..]"><composing xmlns="http://jabber.org/protocol/chatstates" /></message>
17:43:43 IN <message id="fMtzKp" type="chat" from="edhelas[..]" to="ppjet[..]"><paused xmlns="http://jabber.org/protocol/chatstates" /></message>
17:43:43 IN <message id="fMtzKp" type="chat" from="edhelas[..]" to="ppjet[..]"><composing xmlns="http://jabber.org/protocol/chatstates" /></message>
17:43:44 IN <message id="HGxdPc" type="chat" from="edhelas[..]" to="ppjet[..]"><body>[..]</body><active xmlns="http://jabber.org/protocol/chatstates" /><request xmlns="urn:xmpp:receipts" /><replace xmlns="urn:xmpp:message-correct:0" /></message>
17:43:46 IN <message id="HGxdPc" type="chat" from="edhelas[..]" to="ppjet[..]"><composing xmlns="http://jabber.org/protocol/chatstates" /></message>
17:43:51 IN <message id="HGxdPc" type="chat" from="edhelas[..]" to="ppjet[..]"><paused xmlns="http://jabber.org/protocol/chatstates" /></message>
On the "Chats" page there are one-to-one chats on the top of the list and MUC chats below. If I want to start a new one-to-one chat there is a big "+" on the bottom of the page and if I want to start a new MUC there is a little "+" on the top of the page. This is a bit confusing and not clear. Would be nice if both "+" Icons would be of a similar design, size and position. I would suggest to just add another little Icon on the top, maybe showing one person for one-to-one and 2 persons for MUC (as it is right now)
Best,
Til
Hello,
On firefox, with Movim tab in pinned mode, when people are discussing in the chatroom, the tab is not changing color. It does on jappix or in gmail chatrooms.
Just created a brand new account on pod.movim.eu and after I log in for the first time I get the following error dialog.
It seems that this group doesn't exists anymore. Do you want to remove it from your subscriptions? [email protected]/urn:xmpp:microblog:0
[29-Aug-2015 18:40:14 Europe/Berlin] PHP Fatal error: Uncaught exception 'Embed\Exceptions\InvalidUrlException' with message 'The url 'https://up.yerl.org/6f764dd0d34a2aa8598ca1ca8d8a932c472cc2b1/<snip>
Stack trace:
#0 /var/www/movim/app/widgets/Publish/Publish.php(188): Embed\Embed::create('https://up.yerl...')
#1 [internal function]: Publish->ajaxEmbedTest('https://up.yerl...')
#2 /var/www/movim/system/widget/WidgetWrapper.php(140): call_user_func_array(Array, Array)
#3 /var/www/movim/system/RPC.php(99): WidgetWrapper->runWidget('Publish', 'ajaxEmbedTest', Array)
#4 /var/www/movim/linker.php(67): RPC->handle_json(Object(stdClass))
#5 [internal function]: {closure}('{"func":"messag...', Object(React\Stream\Stream))
#6 /var/www/movim/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(64): call_user_func_array(Object(Closure), Array)
#7 /var/www/movim/vendor/react/stream/src/Stream.php(123): Evenement\EventEmitter->emit in /var/www/movim/vendor/embed/embed/src/Embed.php on line 48
Go to the contact tab
Click on a profile on page 3 for instance
Now go back to the list of profiles
You're back on page 1 (1) and the profile you clicked is on page 1 (2)
Owait..(2) only happens sometimes. Viewing is not related to changing the sorting of these profiles but it changes by itself sometimes :/
Hello,
I'm trying to hook up Movim to Slack, and I get the following errors (example from xdebug trace):
[06-Sep-2015 02:19:01 PST8PDT] PHP 13. Evenement\EventEmitter->emit($event = 'data', $arguments = array (0 => 'error xmlns="http://etherx.jabber.org/streams"><connection-timeout xmlns="urn:ietf:params:xml:ns:xmpp-streams"/><text xmlns="urn:ietf:params:xml:ns:xmpp-streams" xml:lang="en">Expected bind and session</text></error>', 1 => class React\Stream\Stream { public $bufferSize = 32768; public $stream = resource(238) of type (stream); protected $readable = TRUE; protected $writable = TRUE; protected $closing = FALSE; protected $loop = class React\EventLoop\StreamSelectLoop { private $nextTickQueue = class React\EventLoop\Tick\NextTickQueue { private $eventLoop = ...; private $queue = class SplQueue { private ${SplDoublyLinkedList}:flags = 4; private ${SplDoublyLinkedList}:dllist = array (...) } }; private $futureTickQueue = class React\EventLoop\Tick\FutureTickQueue { private $eventLoop = ...; private $queue = class SplQueue { private ${SplDoublyLinkedList}:flags = 4; private ${SplDoublyLinkedList}:dllist = array (...) } }; private $timers = class React\EventLoop\Timer\Timers { private $time = 1441531141.6482; private $timers = class SplObjectStorage { private $storage = array (...) }; private $scheduler = class SplPriorityQueue { private $flags = 1; private $isCorrupted = FALSE; private $heap = array (...) } }; private $readStreams = array (1 => resource(1) of type (stream), 238 => resource(238) of type (stream)); private $readListeners = array (1 => array (0 => class React\Stream\Stream { ... }, 1 => 'handleData'), 238 => array (0 => ..., 1 => 'handleData')); private $writeStreams = array (238 => resource(238) of type (stream)); private $writeListeners = array (238 => array (0 => class React\Stream\Buffer { ... }, 1 => 'handleWrite')); private $running = TRUE }; protected $buffer = class React\Stream\Buffer { public $stream = resource(238) of type (stream); public $listening = TRUE; public $softLimit = 2048; private $writable = TRUE; private $loop = class React\EventLoop\StreamSelectLoop { private $nextTickQueue = class React\EventLoop\Tick\NextTickQueue { private $eventLoop = ...; private $queue = class SplQueue { ... } }; private $futureTickQueue = class React\EventLoop\Tick\FutureTickQueue { private $eventLoop = ...; private $queue = class SplQueue { ... } }; private $timers = class React\EventLoop\Timer\Timers { private $time = 1441531141.6482; private $timers = class SplObjectStorage { ... }; private $scheduler = class SplPriorityQueue { ... } }; private $readStreams = array (1 => resource(1) of type (stream), 238 => resource(238) of type (stream)); private $readListeners = array (1 => array (...), 238 => array (...)); private $writeStreams = array (238 => resource(238) of type (stream)); private $writeListeners = array (238 => array (...)); private $running = TRUE }; private $data = '<iq xmlns="jabber:client" type="set" id="1EqAS0" xml:lang=""><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>moxlUhxbNl</resource></bind></iq>'; private $lastError = array ('number' => 0, 'message' => '', 'file' => '', 'line' => 0); protected $listeners = array ('error' => array (0 => class Closure { ... }), 'drain' => array (0 => class Closure { ... })) }; protected $listeners = array ('data' => array (0 => class Closure { public $static = array (...); public $parameter = array (...) }), 'error' => array (0 => class Closure { public $static = array (...); public $parameter = array (...) }), 'close' => array (0 => class Closure { public $static = array (...); public $parameter = array (...) })) })) /home/movim/public_html/vendor/react/stream/src/Stream.php:123
Mozilla seems to have had a similar issue in the Thunderbird XMPP client:
https://bugzilla.mozilla.org/show_bug.cgi?id=1186463
A similar error message occurs in a Perl module, also related to the namespace, although this question is unanswered:
I see this in the source code for otr.js but not sure about the application, how is this activated?
I changed my avatar from "conversations" and in movim instead of showing the actual avatar or a shadow man there is just a broken image which points to data:image/jpeg;base64,
Expected result:
Show the avatar or a shadowman if none.
*Actual result:"
Movim simply points to a broken link.
Hi,
mud.php cannot perform any operation anymore... example :
# su -l www-data -s /bin/bash
$ cd /var/www/movim/
$ php mud.php db set
<div style="font-family: Arial; text-align: center;">
<h2>Oops... something went wrong.</h2>
<p>But don't panic. The NSA is on the case.</p>
</div>
Regards.
Hi,
Movim doesn't work on Windows phone + IE :
http://pix.toile-libre.org/?img=1438933472.png
It's the same with Opera Mini : "Votre navigateur est trop vieux pour prendre en charge Movim".
The project says it's under the AGPL but all I can find is that it's under the AGPL, and a copy of the AGPLv3. It doesn't mention which version in the source code, meaning I could use whatever version (AGPLv2 if I wanted.) It'd be great if licensing information is clarified such as AGPL version in the source code itself and whether it's upgradable to a later version. There's also some nonfree files marked as 'All rights reserved' which I assume is a mistake, but means reading them is a bad idea.
I cannot log in with a jabber.org account. Is this a bug or a feature?
Mozilla Firefox 41.0.2
Microsoft Windows 10
https://pod.movim.eu
Expected: a letter is input.
What happens: at the same time that a letter is input, the windows scrolls to the top of the page.
Seems to be caused by a url rewriting issue.
but it works in Google Chrome. (Version: 3dcae7c)
Some errors from the console:
Send and received
TypeError: window[funcs[0]][funcs[1]] is undefined
window[funcs[0]][funcs[1]].apply(null, funcall.params);
movim_w...cket.js (Zeile 144, Spalte 25)
TypeError: Chat.right is null
bubble = Chat.right.cloneNode(true);
chat.js (Zeile 88, Spalte 17)
TypeError: Chat.left is null
bubble = Chat.left.cloneNode(true);
Hi,
I'm working on packaging Movim for Yunohost.
If I dedicate a Nginx vhost to movim, it works :
server {
listen 80 default_server;
root /var/www/;
index index.php index.xhtml index.html;
server_name dev.wks-xavier.local;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php5-fpm.sock;
include /etc/nginx/fastcgi_params;
fastcgi_param HTTP_MOD_REWRITE 1;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location /ws/ {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
proxy_redirect off;
}
}
However in Yunohost we deal with 1 vhost and many apps. So Movim have to work with URL like that : myserver.com/movim. So here is my vhost :
server {
listen 80 default_server;
root /var/www/;
index index.php index.xhtml index.html;
server_name dev.wks-xavier.local;
location /movim {
index index.php;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php5-fpm.sock;
include /etc/nginx/fastcgi_params;
fastcgi_param HTTP_MOD_REWRITE 1;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ \/ws/ {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
proxy_redirect off;
}
}
}
However this doesn't work.
I can access to Movim login screen, so I assume php is working.
But I have this message :
Movim cannot talk with the server, please try again later (Websocket connection error)
I've been stuck for 2 days with this problem...
Hi,
When I receive a message on Movim, I can see a notification on the bottom of the screen, which is okay, but nothing on the feed. I have to wait for one minute for messages to display.
This seems to occurs with Seamonkey, no problem with Iceweasel and Chrome.
Subscribing to the API doesn't work on my installation with URL rewriting enabled.
My installation:
My configuration:
[movim]
user = www-data
group = www-data
listen = /var/run/movim.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
php_admin_value[open_basedir] = none
server {
listen 80;
server_name pod.postblue.info;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl spdy;
server_name pod.postblue.info;
root /var/www/movim;
include snippets/cacert.conf;
index index.php index.html index.htm;
access_log /var/log/nginx/movim.access.log;
error_log /var/log/nginx/movim.error.log;
location / {
try_files $uri $uri/ @movim;
}
location @movim {
rewrite ^/(.*) /index.php?query=$1 last;
}
location /log/ {
deny all;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_param HTTP_MOD_REWRITE 1;
fastcgi_pass unix:/var/run/movim.sock;
}
location /ws/ {
proxy_pass http://localhost:8080/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
proxy_redirect off;
}
}
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;
# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
I'm trying to configure my domain to fully support Movim, so I'm trying now to support websockets.
I have installed nginx version: nginx/1.8.0 and Prosody trunk nightly build 588 (2015-10-02, 214a62915368).
Nginx conf':
server {
listen 80;
server_name pod.postblue.info;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl spdy;
server_name pod.postblue.info;
root /var/www/movim;
index index.php index.html index.htm;
include snippets/cacert.conf;
access_log /var/log/nginx/movim.access.log;
error_log /var/log/nginx/movim.error.log;
location / {
try_files $uri $uri/ @movim;
}
location @movim {
rewrite ^/(.*) /index.php?query=$1 last;
}
location /log/ {
deny all;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_param HTTP_MOD_REWRITE 1;
fastcgi_pass unix:/var/run/movim.sock;
}
location /ws/ {
proxy_pass http://localhost:5280/xmpp-websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host "postblue.info";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
The result, assuming it should be working:
The access log entry when displaying the /ws/ page (200 HTTP status code: OK):
94.111.112.32 - - [13/Oct/2015:10:52:27 +0200] "GET /ws/ HTTP/1.1" 200 151 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0"
But when accessing https://pod.movim.eu, letting the webpage GET the /ws/ page (501 HTTP status code: Not Implemented):
94.111.112.32 - - [13/Oct/2015:10:54:16 +0200] "GET /ws/ HTTP/1.1" 501 334 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0"
Sometimes the notifications are not cleared when a conversation on shown.
I checked out the current git repo and followed the install manual.
The daemon start fails with the follwing log entry:
[10-Sep-2015 14:22:05 Europe/Berlin] PHP Fatal error: Cannot redeclare class Locale in /var/www/movim/system/i18n/Locale.php on line 3
Just a short notice about those warning messages I received on deployment process, executing
php composer.phar install
Returns
[...]
Package guzzle/common is abandoned, you should avoid using it. Use guzzle/guzzle instead.
Package guzzle/stream is abandoned, you should avoid using it. Use guzzle/guzzle instead.
Package guzzle/parser is abandoned, you should avoid using it. Use guzzle/guzzle instead.
Package guzzle/http is abandoned, you should avoid using it. Use guzzle/guzzle instead.
Writing lock file
Generating autoload files
Each connection add two lines in the php.log file:
[31-Jul-2015 12:39:34 Europe/Paris] PHP Deprecated: SNI_server_name is deprecated in favor of peer_name in /var/www/movim/linker.php on line 109
[31-Jul-2015 14:23:11 Europe/Paris] PHP Deprecated: SNI_server_name is deprecated in favor of peer_name in /var/www/movim/linker.php on line 109
Whenever I try to log in to pod.movim.eu, I manage to get in and see the usual home page, but shortly after or when I try to click anything (like "contacts") I get logged out and thrown back to the login screen.
At one point I started getting "invalid password format" error after clicking "Come In!" but before seeing the home page. For some reasons that has stopped, but now I see a error msg on the login screen after being logged out saying "Movim cannot talk with the server, please try again later (Websocket connection error)"
I am using Dreamhosts XMPP feature which might be the source of this, or not. Hard to tell. But I can manage to connect easily via Pidgin, Empathy and other XMPP clients.
POD : https://pod.movim.eu/
GROUPE : news.movim.eu / Ouest-France - Actualité
Désolé si la forme de la remonté de bug n'est pas extra, c'est la première fois que j'en fais.
Click on contact seems to fetch the N oldest entries from MAM archive and erases the current chat history.
The translations need to be re-uploaded in Transiflex
At http://wiki.movim.eu/en:dev:protocol_implementations there is no mention of XEP-0198: Stream Management. Therefore there are two possible bugs:
As you know, TCP connection is not reliable if it is not properly closed. When connection is lost in middle of communication, sender does not know how much data receiver actually received. So if XMPP server is far away from Movim pod and connection is even slightly unstable, data will be lost. This is one of the biggest problems of XMPP, so XEP-0198 is must have.
Hi there,
I have a XMPP server that can be reached through port 5422 (c2s) and 5469 (s2s). I can use it with clients like Pidgin or Gajim, but was not able to connect to it using the main pod (https://pod.movim.eu).
SRV records seem to be OK for the domain name I use.
I see nothing in prosody's logs (I can't see any connection attempt), and also nothing in my iptables logs.
Is Movim only able to use XMPP standard ports for the moment?
[19-Aug-2015 10:30:37 Europe/Berlin] PHP Parse error: syntax error, unexpected '(string)' (string) (T_STRING_CAST) in $
[19-Aug-2015 10:31:16 Europe/Berlin] PHP Parse error: syntax error, unexpected '(string)' (string) (T_STRING_CAST) in $
[19-Aug-2015 11:00:57 Europe/Berlin] PHP Parse error: syntax error, unexpected '(string)' (string) (T_STRING_CAST) in $
[19-Aug-2015 11:01:45 Europe/Berlin] PHP Parse error: syntax error, unexpected '(string)' (string) (T_STRING_CAST) in $
PHP 5.4.41-0+deb7u1 (cli) (built: Jun 7 2015 23:27:41)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
Steps to duplicate (tested with: f2033b6):
There is some comments on Hacker News https://news.ycombinator.com/item?id=10175684 that complains about the AGPL licence which is used by Movim for the whole sourcecode.
I'm interested to see what other licence(s) can be use :)
I tried with pod.movim.eu, it.movim.eu and nl.movim.eu. However, I get logged out automatically after a few seconds.
Everything is referenced to a local cache dir in the translation pot files, which makes the translation process a pain.
I've received friend requests since I'm on Movim and I didn't notced because there were no warning displayed on the interface. I think there should be a red badge indicationg the number of friend requests over the Contacts button on the right interface.
This is a feature request. It would be nice to support it.
Movim seems to not support self-signed certifiacte of the XMPP server.
The XMPP server certificate has been signed by CA that I created.
Movim php.log
PHP Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /var/www/html/movimdev/linker.php on line 109
Log of the XMPP server (Metronome)
c2s2606e00 info Client connected
c2s2606e00 info Client disconnected: tlsv1 alert unknown ca
Like the screenshot shows, when creating a new account on pod.movim.eu the page shows two forms. One in a regular fashion, while the second one is overlaid on top. The overlay form's submit button does not do anything. Making it impossible to sign up unless you close the overlay and use the form below.
Hello,
I've just installed movim on my server, and I was able to resolve an issue unrelated to the subject with WebSockets (CloudFlare's free account blocks websocket connections, so I turned off CloudFlare protection for the subdomain I'm testing movim on). However, I've run into another issue.
Now that I have WebSockets working, I was playing with the customization settings in the admin panel, and I set the time zone to Los_Angeles/America (which is reversed from the normal format, making it difficult to locate; another minor issue). Once this was done, however, the web interface crashed.
This appears to be because the timezone column on the config table in MySQL is a varchar(16) limit, which America/Los_Angeles (it's in the correct order in the database) exceeds. This causes the column to truncate to America/Los_Ange which the web interface can't handle and it flames out with "oops, an error [...]."
Manually modifying the column type in MySQL brings the WUI back up, but it won't let me modify any of the settings because the database needs to be "upgraded" to the varchar(16).
The column config.timezone should be set to a more sane limit than varchar(16), or the admin panel should insert shortnames for time zones into the database to prevent truncating.
I hope this is not a duplicate issue; I searched, but I find it somewhat difficult to characterize or explain without many words. My apologies if this is already being addressed!
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.