nyymanni / ejira Goto Github PK
View Code? Open in Web Editor NEWEmacs JIRA integration
License: GNU General Public License v3.0
Emacs JIRA integration
License: GNU General Public License v3.0
your project looks very promising, but i dont know if i did something wrong or just our jira is messed up.
i added cloned your repo under ~/.emacs.d and added to my init.el under ~/.emacs.d
(add-to-list 'load-path "https://ourjira.com")
Then i continued with the setq-part from your example config followed by require 'ejira and 'org-agenda
At the beginning there were some errors because of missing packages (e.g. language-detection) but now there are no errors at the start of emacs. With M-x i am able to enable ejira-mode (when i'm in an org-file) but then i dont see the point, how to start?
When a JIRA ticket has an attachment e.g. images, it is either referred to as:
How could I load the appropriate attachments in the buffer?
When you move an issue from one Jira project to another, the system keeps an alias of the two ticket IDs, so either works for referencing the ticket. This seems to confuse ejira, in the sense that it thinks both the old and new ticket ID are different tickets.
For example, if I pull OLDPROJ-500
into my org files, then move OLDPROJ-500
to NEWPROJ
, it becomes NEWPROJ-1
, and both OLDPROJ-500
and NEWPROJ-1
end up pretty much identical between my two ejira ORG files.
Proposal:
This project seems to be working really well for me but I run into a weird issue with the ejira-hourmarking-get-hourlog
feature.
Clocking in and out of Tasks works really well and creates Logbook entries like this:
CLOCK: [2020-10-27 Di 09:35]--[2020-10-27 Di 10:29] => 0:54
CLOCK: [2020-10-27 Di 12:54]--[2020-10-27 Di 16:31] => 3:37
But the hourlog turns this into something like this:
09:35 | -6m | 0m | XXX-XX | XXX
12:54 | 2h 37m | 2h 30m | XXX-XX | XXX
Note the negative value here. It seems like every time value is one hour short and I have no idea how this happens (I assume that time zone related issues should affect both time strings equally). I'm not that well versed into Emacs debugging so I'm not sure how to start here.
Some infos about my system, maybe that helps?
doom info
results in this:SYSTEM type darwin
config x86_64-apple-darwin19.6.0
shell /bin/zsh
uname Darwin 19.6.0 Darwin Kernel Version 19.6.0: Mon Aug 31 22:12:52 PDT 2020; root:xnu-6153.141.2~1/RELEASE_X86_64 x86_64
path (~/.local/elixir-ls ~/.emacs.d/bin ~/.asdf/shims ~/.asdf/bin /usr/local/opt/m4/bin /usr/local/opt/node@12/bin ~/.oh-my-zsh/custom/plugins/git-open ~/.poetry/bin ~/.cargo/bin /usr/local/bin /usr/bin /bin /usr/sbin /sbin /Applications/VMware Fusion.app/Contents/Public /Library/Apple/usr/bin /usr/local/opt/fzf/bin /usr/local/Cellar/emacs-mac/emacs-27.1-mac-8.0/libexec/emacs/27.1/x86_64-apple-darwin19.6.0)
EMACS dir ~/.emacs.d/
version 27.1
build Sep 30, 2020
buildopts --enable-locallisppath=/usr/local/share/emacs/site-lisp --infodir=/usr/local/Cellar/emacs-mac/emacs-27.1-mac-8.0/share/info/emacs --prefix=/usr/local/Cellar/emacs-mac/emacs-27.1-mac-8.0 --with-mac --enable-mac-app=/usr/local/Cellar/emacs-mac/emacs-27.1-mac-8.0 --with-gnutls --with-modules
features NOTIFY KQUEUE ACL GNUTLS LIBXML2 ZLIB TOOLKIT_SCROLL_BARS MODULES THREADS JSON PDUMPER GMP
traits (batch server-running envvar-file)
DOOM dir ~/.doom.d/
version 2.0.9
build HEAD -> develop fe37a590c 2020-10-26 05:52:30 -0400
elc-files 0
modules (:completion company (ivy +fuzzy) :ui doom doom-dashboard doom-quit hl-todo modeline nav-flash ophints (popup +defaults) treemacs vc-gutter vi-tilde-fringe window-select workspaces :editor (evil +everywhere) file-templates fold (format +onsave) snippets :emacs dired electric undo vc :term vterm :checkers syntax :tools debugger direnv docker (eval +overlay) lookup lsp magit terraform :os macos :lang data (elixir +lsp) emacs-lisp go (java +lsp) (javascript +lsp) markdown org sh web yaml :config (default +bindings +smartparens))
packages ((vcl-mode) (add-node-modules-path) (prettier-js) (fireplace) (lsp-treemacs) (ejira :recipe (:host github :repo nyyManni/ejira)))
unpin (n/a)
elpa (n/a)
I currently work around this by setting ejira-hourmarking-step
to 60 and just increasing every entry one time.
If I want to progress a ticket to code review, then I need to fill out custom fields e.g. description, risk severity, and so on with my request. Is there a way to fetch those fields and create custom post requests?
Hi, I would like to use your code, but still having some issues when attempting to get the list of issues from Jira. The update ends up with following:
(sometimes)
helm-M-x: Login failed: Wrong URL path
--- if I restart emacs it works again
(always) after first obtained object
REQUEST [error] Error (error) while connecting to https://jira.mycompany.com/rest/api/2/issue/WPHT-NO-EPIC.
Basically all I'm able to obtain from JIRA is following:
* INPROG Automate minion installation process in Jenkins build :_Mustangs_Sprint_81:
:PROPERTIES:
:ID: WPHT-17654
:Type: Sub-Imp
:Status: In Progress
:Reporter: Lxxx B. Sxxx
:Assignee: Lxxx B. Sxxx
:END:
Would it be possible to direct me so that I can progress with this nice project? Thanks
One more question, how can I use helm-ejira? It doesn't seem to be included after installation. Does it require any explicit steps?
PS: I have created ejira layer for spacemacs, which I can share if you're interested.
Hi there,
I'm trying to setup Ejira from scratch on a new JIRA instance, but experiencing an invalid-function error when attempting the first pull of data into org files.
A redacted stacktrace follows:
Debugger entered--Lisp error: (invalid-function #<buffer AAAA.org>)
#<buffer AAAA.org>(#<marker at 676 in AAAA.org>)
ejira--sort-comments("AAAA-1693")
ejira--update-task(#s(ejira-task :key "AAAA-1693" :type "Bug" :reporter "Redacted Name" :assignee nil :deadline nil :status "Closed" :created (25591 19241) :updated (25591 39972) :epic nil :project "AAAA" :priority "Medium" :sprint nil :estimate nil :remaining-estimate nil :summary "Unable to paste text from Word documents into plac..." :parent nil :description "When trying to paste text into a placement, if the..." :comments nil))
#<subr F616e6f6e796d6f75732d6c616d626461_anonymous_lambda_11>(((expand . "operations,versionedRepresentations,editmeta,chang...") (id . "26511") (self . "https://redacted.atlassian.net/rest/api/2/issue/26...") (key . "AAAA-1693") (fields (summary . "Unable to paste text from Word documents into plac...") (issuetype (self . "https://redacted.atlassian.net/rest/api/2/issuetyp...") (id . "10004") (description . "A problem or error.") (iconUrl . "https://redacted.atlassian.net/rest/api/2/universa...") (name . "Bug") (subtask . :json-false) (avatarId . 10303) (hierarchyLevel . 0)) (created . "2023-02-23T11:16:57.528+0000") (project (self . "https://redacted.atlassian.net/rest/api/2/project/...") (id . "10017") (key . "AAAA") (name . "Redacted") (projectTypeKey . "software") (simplified . :json-false) (avatarUrls (48x48 . "https://redacted.atlassian.net/rest/api/2/universa...") (24x24 . "https://redacted.atlassian.net/rest/api/2/universa...") (16x16 . "https://redacted.atlassian.net/rest/api/2/universa...") (32x32 . "https://redacted.atlassian.net/rest/api/2/universa..."))) (description . "When trying to paste text into a placement, if the...") (reporter (self . "https://redacted.atlassian.net/rest/api/2/user?acc...") (accountId . "6220a81c94f7e20069fe7458") (emailAddress . "[email protected]") (avatarUrls (48x48 . "https://secure.gravatar.com/avatar/3bf8cf68bb120d9...") (24x24 . "https://secure.gravatar.com/avatar/3bf8cf68bb120d9...") (16x16 . "https://secure.gravatar.com/avatar/3bf8cf68bb120d9...") (32x32 . "https://secure.gravatar.com/avatar/3bf8cf68bb120d9...")) (displayName . "Redacted Name") (active . t) (timeZone . "Europe/London") (accountType . "atlassian")) (priority (self . "https://redacted.atlassian.net/rest/api/2/priority...") (iconUrl . "https://redacted.atlassian.net/images/icons/priori...") (name . "Medium") (id . "3")) (timetracking) (duedate) (comment (comments) (self . "https://redacted.atlassian.net/rest/api/2/issue/26...") (maxResults . 0) (total . 0) (startAt . 0)) (assignee) (updated . "2023-02-23T17:02:28.895+0000") (status (self . "https://redacted.atlassian.net/rest/api/2/status/1...") (description . "The issue is considered finished, the resolution i...") (iconUrl . "https://redacted.atlassian.net/images/icons/status...") (name . "Closed") (id . "10102") (statusCategory (self . "https://redacted.atlassian.net/rest/api/2/statusca...") (id . 3) (key . "done") (colorName . "green") (name . "Done"))))))
mapc(#<subr F616e6f6e796d6f75732d6c616d626461_anonymous_lambda_11> (... ... ... ... ... ... ... ... ... ... ... ... ... ... ...))
ejira-update-project("AAAA" nil)
apply(ejira-update-project ("AAAA" nil))
#f(compiled-function (&rest args-before) #<bytecode 0x1a1a9ed4f4e98f5f>)("AAAA")
mapc(#f(compiled-function (&rest args-before) #<bytecode 0x1a1a9ed4f4e98f5f>) ("AAAA"))
ejira-update-my-projects(nil)
funcall-interactively(ejira-update-my-projects nil)
command-execute(ejira-update-my-projects record)
execute-extended-command(nil "ejira-update-my-projects" nil)
funcall-interactively(execute-extended-command nil "ejira-update-my-projects" nil)
command-execute(execute-extended-command)
I can eval (ejira--get-subheading (ejira--find-heading "AAAA-1693") ejira-comments-heading-name)
and get a #<marker at 676 in AAAA.org>
. If I comment out ejira--sort-comments
, a crash happens at the next step which is ejira--refile
.
After using M-x ejira-update-my-projects
, i m getting this error:
wrong-type-argument stringp replace-regexp-in-string (at ejira--parse-sprint)
Debug
ejira--parse-sprint(((id . 140) (name . "AB Sprint 01") (state . "active") (boardId . 11) (goal . "") (startDate . "2020-11-23T14:16:01.557Z") (endDate . "2020-11-30T03:30:00.000Z")))
Stack
string-match()
replace-regexp-in-string()
ejira--parse-sprint()
mapcar(ejira--parse-sprint())
ejira-get-sprint-name()
ejira--parse-item()
Hi and thanks for all your work on this plugin!
One small and easily fixable bug I've noticed is the lack of treatment of {noformat}
(https://jira.atlassian.com/browse/CONFCLOUD-68503) in text fields. In the meantime I've fixed it on my end with
(push
'("^{noformat}\\(.*\\(?:
.*\\)*?\\)?
?{noformat}"
. (lambda ()
(let ((body (match-string 1))
(md (match-data)))
(prog1
(concat
"#+BEGIN_SRC\n"
(replace-regexp-in-string "^" " " body)
"\n#+END_SRC")
;; Auto-detecting language alters match data, restore it.
(set-match-data md)))))
ejira-parser-patterns)
which is just a straightforward adaptation of your existing code for {quote}
blocks.
When I import tickets including these, the parser gets confused. In my case, the comment had a subsequent *
and so an entire new top-level heading was created with the rest of the comment. This in turn disallowed refiling sub-tasks to their parents.
I struggled with this issue a fair amount earlier today. I kept running jira-update-my-projects
, but the generated buffer was always incomplete! As it turns out, the function was failing because global org id lookup uses whatever is saved to file, ignoring buffer contents. Since this was a first-time run, there were no such files and the function was failing silently as a result.
The workaround for this issue is to save the incomplete project buffer to file, then rerun jira-update-my-projects
. Once the file actually exists, the issue stops occurring.
I believe the best fix for this would be to check if the file exists first. If the file does not exist, write the top level outline, with project IDs, to buffer and save, then proceed as usual.
Which repository is ejira published to for installation?
I cannot seem to find it in melpa, marmalade, or the gnu repositories.
Hi!
I've searched through some of the open and closed issues here but I couldn't find an answer to my problem.
Here is my config:
(use-package jiralib2
:config
(setq jiralib2-url "https://<company>.atlassian.net"
jiralib2-auth 'token
jiralib2-user-login-name "victor.dorneanu@<company TLD>")
)
(use-package ejira
:init
(setq
;; NOTE, this directory needs to be in `org-agenda-files'`
ejira-org-directory org-directory
ejira-projects '("TEST")
ejira-priorities-alist '(("Highest" . ?A)
("High" . ?B)
("Medium" . ?C)
("Low" . ?D)
("Lowest" . ?E))
ejira-todo-states-alist '(("To Do" . 1)
("In Progress" . 2)
("Done" . 3)))
:config
;; Tries to auto-set custom fields by looking into /editmeta
;; of an issue and an epic.
;; (add-hook 'jiralib2-post-login-hook #'ejira-guess-epic-sprint-fields)
;; They can also be set manually if autoconfigure is not used.
;; (setq ejira-sprint-field 'customfield_10001
;; ejira-epic-field 'customfield_10002
;; ejira-epic-summary-field 'customfield_10004)
;; (require 'ejira-agenda)
;; Make the issues visisble in your agenda by adding `ejira-org-directory'
;; into your `org-agenda-files'.
(add-to-list 'org-agenda-files ejira-org-directory)
;; Add an agenda view to browse the issues that
(org-add-agenda-custom-command
'("j" "My JIRA issues"
((ejira-jql "resolution = unresolved and assignee = currentUser()"
((org-agenda-overriding-header "Assigned to me")))))))
Then I set jiralib2-token
via SPC h v
(I use Doom Emacs). I can copy the token from the browser (using developer mode in Google Chrome).
And then I run jiralib2-verify-setup
. Afterwards I see:
Loading /home/victor/.emacs.d/.local/cache/recentf...done
[error] request--callback: peculiar error: 401
[error] request-default-error-callback: https://<company>.net/rest/api/2/myself parse-error
Session expired, retrying...
[error] request--callback: peculiar error: 401
[error] request-default-error-callback: https://<company>.atlassian.net/rest/api/2/myself parse-error
jiralib2--verify-status: Request failed: invalid password
But again: I'm not using username + password. I use a token to authenticate myself.
ELISP> (print jiralib2-auth)
token
ELISP> (print jiralib2-url)
"https://<company>.atlassian.net"
ELISP>
Thanks in advance.
Hello,
I'm currently using org-jira and missing a feature that would allow to log time to issues where multiple users logged some time.
My question is, will ejira handle that correctly? Only updating my own times and also only counting my own time in "clocktabel"'s?
Thanks!
When I pull my projects for the first time, I get an error:
user-error: Before first headline at position 1 in buffer JT.org
The project's file is there, but its content looks like this:
:PROPERTIES:
:ID: JT
:END:
#+STARTUP: showeverything* <ejira new heading>
Once I remove everything and add a heading like this:
* Foo
the sync starts working.
The current method, which uses org-tags-view
is hugely inefficient. Using org-id
to get the heading that belong to the agenda would be much faster. This is especially true when using the caching as the required key list is immediately available.
Maybe this isn't the Emacs way to add this into the package since it's pretty easy to write - once I learned enough elipsp to figure out how.
Something like this:
(defun ejira-open-issue-in-external-browser ()
"Opens the currently focused issue in an external browser"
(interactive)
(browse-url (format "%s/browse/%s" jiralib2-url (ejira-issue-id-under-point))))
Seems like it'd be useful to have in the mainline project.
I think ejira is pretty nice package to use in daily life. And I can git clone it and install manually. However, if ejira host on melpa, it gonna be nice that won't miss any updates of ejira in future.
What do you guys think?
Does anyone else have the problem that Jira verbatim text is not converted?
When I have
~Example Text~
in org, it gets converted correctly to {{Example Text}}
in Jira, but when converting from Jira to org, the replacement does not occur, the curly braces end up in org and are converted to Jira markup on the next push, so that the text in Jira subsequently is garbled.
I have checked the regex pattern, it seems ok. I am at a loss as to why the transformation does not happen.
Is there a way (or "what is the way") to only ejira-update-my-projects
for a specific assignee? Could really be for any property like type/status/assignee but my usercase is that I only want to keep issues related to me in my org-file.
Feel like a great project, thank you for your work so far.
i think my setup is has no problem.
(package! ejira
:recipe
(:host github
:repo "nyyManni/ejira"
:files ("*.el")
))
and
(use-package ejira
:init
(setq jiralib2-url XXXXXX
jiralib2-auth 'basic
jiralib2-user-login-name XXXXXX
jiralib2-token nil
ejira-org-directory "~/org"
ejira-projects '("XXXXXX XXXXX XXXX XX X")
ejira-priorities-alist '(("Highest" . ?A)
("High" . ?B)
("Medium" . ?C)
("Low" . ?D)
("Lowest" . ?E))
ejira-todo-states-alist '(("TO Do" . 1)
("In Progress" . 2)
("Done" . 3)))
:config
(add-hook 'jiralib2-post-login-hook #'ejira-guess-epic-sprint-fields)
(require 'ejira-agenda)
(add-to-list 'org-agenda-files ejira-org-directory)
(org-add-agenda-custom-command
'("j" "My Jira Issues"
((ejira-jql "resolution = unresolved and assignee = currentUser()"
((org-agenda-overriding-header "Jira Assigned to me")))))))
with this config. (just like as README.md's configuration)
after launch emacs run commands "jiralib2-verify-setup"
result as follow.
Successfully logged in
Username: XXX
Full Name: XXX
Email: [email protected]
but when execute "ejira-update-y-projects"
condition-case: Error in a Doom startup hook: jiralib2-post-login-hook, ejira-guess-epic-sprint-fields, (user-error "Request failed: invalid request: ((errorMessages No content to map to Object due to end of input))")
how can i resolve this problem??
Team-managed projects don’t have Epic Links.
This unfortunately breaks the hierarchy of task types.
ejira-update-my-projects
can be quite a long-running command. Since it's currently fully synchronous, this locks up the entire emacs instance until it completes.
It would be much more preferable if we handled this in the background instead.
It seems you have plans to put your work on melpa, this is great. Would you mind creating several melpa recipes instead of just one? I would like to write some jira-related code and I only need jiralib2.
Running ejira-update-my-projects
on a large Jira project completely consumes Emacs. One of the projects I work on has 20,000+ Jira issues, this command has been running for about 2.5 hours and isn't even 25% complete but Emacs has been unusable the whole time.
It would be a massive improvement if this update process could be done asynchronously so as to not block everything else Emacs is doing. Parallel execution would be a nice bonus since the Jira API is so slow, but I'm sure that's harder.
ejira-update-issues
helm-M-x: Wrong type argument: listp, "http://[...........]/rest/api/2/customFieldOption/10103"
Hi.
As I play/work with ejira I frequently find myself in the situation that I want to start over from scratch, just running ejira-update-my-projects
on all issues. What is the correct way to do this? Removing the org files doesn't seems to be enough, nor is restarting emacs.
Are the some hidden files where synced ids are stored?
I've made some additions to enable dealing with custom fields, and I wanted initially to have this completely configurable so that one can add some config keys and have their additions working.
However, this turned out to be a huge hassle with converting between names, keywords, and customfield values.
I'm wondering if it would make sense to put this logic in a mapping list that contains org-property key, keyword, Jira field name, and alist traversal information, and that is queried by each modifier function. That way, it would be fairly easy to customize and add new fields.
I don't know if this is an Ejira issue or something configured company-side on the jira API, but when dealing with large projects ejira is only able to create a partial list of issues. I expect this to be either a limited request number issue or a pagination issue.
This has a knock on issue when loading one's own agenda, as if an issue returned by that jql query doesn't exist in the main org file then generating the agenda will fail. An initial entry for the unfound ticket seems to be created by this function, however ejira seems to fail with actually populating the properties for this entry, claiming that they cannot be found.
This can be worked around by adding more stringent search criteria to ejira-update-jql-unresolved-fn
though this is a bit less ideal.
Allow having active region for the call to ejira-heading-to-task
and ejira-heading-to-subtask`. Also think if there would be a way to create for example an epic with its issues or a story with its subtasks by having a top-level heading define the summary and description for the epic/story and its children define the issues/subtasks.
It would be nice to fetch the issues that have not yet been synced when opening the agenda view. Currently the issue sync messes up with the current buffer so that the agenda (and the project file) get messed up.
Affected branch feat/fast-agenda
Hi there,
I'm trying to setup ejira with a JIRA account hosted on atlassian.net
(setq jiralib2-url "https://<account>.atlassian.net"
jiralib2-auth 'token
jiralib2-user-login-name "<email address>"
jiralib2-token "<api token>")
When I run jirlib2-verify-setup
, this returns:
Attempting to auto-configure Ejira custom fields...
[error] request--callback: peculiar error: 400
[error] request-default-error-callback: https://<account>.atlassian.net/rest/api/2/search error
user-error: Request failed: invalid request: ((errorMessages Field 'type' does not exist or this field cannot be viewed by anonymous users.) (warningMessages))
Digging deeper, I find that if I hit https://<account>.atlassian.net/rest/auth/1/session
from my browser where I'm already logged in, I get the following back:
{
"self":"https://<account>.atlassian.net/rest/api/latest/user?username=<account number (?)>%3A8<UUID>",
"name":"<account number (?)>:<UUID>"
}
Using the "name" field from the response as the username:
(setq jiralib2-url "https://<account>.atlassian.net"
jiralib2-auth 'token
jiralib2-user-login-name "<name field from /auth/1/session response>"
jiralib2-token "<api token>")
When I run jirlib2-verify-setup
, this returns:
Attempting to auto-configure Ejira custom fields...
[error] request--callback: peculiar error: 401
[error] request-default-error-callback: https://<account>.atlassian.net/rest/api/2/search parse-error
Session expired, retrying...
Attempting to auto-configure Ejira custom fields...
[error] request--callback: peculiar error: 401
[error] request-default-error-callback: https://<account>.atlassian.net/rest/api/2/search parse-error
Session expired, retrying...
Attempting to auto-configure Ejira custom fields...
[error] request--callback: peculiar error: 401
[error] request-default-error-callback: https://<account>.atlassian.net/rest/api/2/search parse-error
Session expired, retrying...
<more of the above>
Attempting to auto-configure Ejira custom fields...
find-auto-coding: Variable binding depth exceeds max-specpdl-size
I'm not sure where to go from here!
The current update strategy:
ejira-projects
and are not resolvedAt least it needs to be somehow configurable. The problem is that it consists of multiple steps of which one is not defined with just jql.
Error when trying to update my issues with ejira-update-my-projects
:
Request failed: invalid request: ((errorMessages Error in JQL Query: Expecting either a value, list of function but got ')'. You must surround ')' in quotation mark to use it as a value. (line 1, character 30)) (errors))
I'm sure this has something to do with the method in which I'm accessing our Jira. Simple auth works with jiralib.el (org-jira) yet it cannot pull the (way to many) issues from the system before timeout. I'm hoping your jiralib2 can handle the job yet I can't seem to get past this 403 error. I'm not sure what else to try. It is a corp handled jira so modification would take an act of this hate trump Congress.
I believe the cookie name is different. There is no JSESSIONID.
I cannot login. It says my password is wrong. I tried it with my email, Full Name, Nick Name etc. Nothing worked. Is it possible to use a API token instead?
Using the ejira-assign-issue
command, I am able to mark an issue as Unassigned and it propagates to the server and updates back locally, but when I try to assign the issue to myself, I get the :ejira_assigned
tag next to the issue indicating I'm the assignee, but the assignee property doesn't update and the server still says Unassigned
. Also, when I try to assign the issue to a teammate, the assignee on the server is Unassigned
. I don't think this is a permissions issue, I have admin rights to the project. There aren't any errors coming back from ejira. Any ideas on how to troubleshoot?
at bottom of jira issue org file,
add some of title and body
execute ejira-heading-to-task
[error] request--callback: peculiar error: 400
[error] request-default-error-callback: https://jltechrnd.atlassian.net/rest/api/2/issue/ error
jiralib2--verify-status: Request failed: invalid request: ((errorMessages) (errors (issuetype . 선택한 이슈 유형이 올바르지 않습니다.)))
it says "invalid issue type"
what am i doing wrong ??
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.