Git Product home page Git Product logo

anitya's Introduction

image

image

Documentation Status

image

image

Anitya

Anitya is a release monitoring project. It provides a user-friendly interface to add, edit, or browse projects. A cron job can be configured to regularly scan for new releases of projects. When Anitya discovers a new release for a project, it publishes a RabbitMQ messages via fedora messaging. This makes it easy to integrate with Anitya and perform actions when a new release is created for a project. For example, the Fedora project runs a service called the-new-hotness which files a Bugzilla bug against a package when the upstream project makes a new release.

For more information, check out the documentation!

Development

For details on how to contribute, check out the contribution guide.

anitya's People

Contributors

abitrolly avatar daveol avatar dependabot-preview[bot] avatar dependabot[bot] avatar encukou avatar erolkskn avatar freedisch avatar glensc avatar jeremycline avatar juhp avatar lmilbaum avatar luto avatar mprahl avatar msimacek avatar ncoghlan avatar nikitabugrovsky avatar nphilipp avatar nyuydinebill avatar onur-ozkan avatar oturpe avatar puiterwijk avatar pypingou avatar qulogic avatar ralphbean avatar renovate[bot] avatar souravbadami avatar vfazio avatar vivekanand1101 avatar yarons avatar zlopez avatar

Stargazers

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

Watchers

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

anitya's Issues

distro page navigation consistency

https://release-monitoring.org/distro/PLD-Linux/
it displays "« 1 / 2 »" 52 projects found

however, if you click "page 1" or "page 2" it shows all packages, not "pld-linux' packages

also if you search with "Search in PLD-Linux" you will be given all packages, not what the button says:
https://release-monitoring.org/distro/PLD-Linux/search/?pattern=php
"72 projects found"

gives the same result as:
https://release-monitoring.org/projects/search/?pattern=php*
"72 projects found"

Monitor vagrant- packages

I'd like to have automatically monitored all vagrant- packages. They are completely the same to rubygem- packages.

BTW it would be nice to have some generic way how to create/update the regexps for such generic packages.

Figure out a deployment story

So, we have a working proof of concept for cnucnuweb. This is a tracking ticket to figure out our deployment story.

Questions:

  • Are we going to use cnucnuweb? Yes.
  • Are we going to make it available at release-monitoring.org? Yes.
  • Is it going to broadcast on the Fedora Project fedmsg bus? or on its own bus?
  • If on its own bus, is it going to deploy its own datanommer/datagrepper?

Distro page 500 error...

After logging in and clicking the distro page I got a 500 (but it seems to be intermittent). Logs say this:

[Thu Dec 18 21:19:10.693286 2014] [:error] [pid 12342] Traceback (most recent call last):
[Thu Dec 18 21:19:10.693371 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/logging/handlers.py", line 929, in emit
[Thu Dec 18 21:19:10.694114 2014] [:error] [pid 12342]     msg = self.format(record)
[Thu Dec 18 21:19:10.694159 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/logging/__init__.py", line 724, in format
[Thu Dec 18 21:19:10.694205 2014] [:error] [pid 12342]     return fmt.format(record)
[Thu Dec 18 21:19:10.694224 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/logging/__init__.py", line 467, in format
[Thu Dec 18 21:19:10.694282 2014] [:error] [pid 12342]     s = self._fmt % record.__dict__
[Thu Dec 18 21:19:10.694324 2014] [:error] [pid 12342] KeyError: 'proc_name'
[Thu Dec 18 21:19:10.694338 2014] [:error] [pid 12342] Logged from file app.py, line 1423
[Thu Dec 18 21:19:10.700680 2014] [:error] [pid 12342] Exception on /distros/ [GET]
[Thu Dec 18 21:19:10.700704 2014] [:error] [pid 12342] Traceback (most recent call last):
[Thu Dec 18 21:19:10.700710 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
[Thu Dec 18 21:19:10.700714 2014] [:error] [pid 12342]     response = self.full_dispatch_request()
[Thu Dec 18 21:19:10.700718 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
[Thu Dec 18 21:19:10.700723 2014] [:error] [pid 12342]     rv = self.handle_user_exception(e)
[Thu Dec 18 21:19:10.700727 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
[Thu Dec 18 21:19:10.700731 2014] [:error] [pid 12342]     reraise(exc_type, exc_value, tb)
[Thu Dec 18 21:19:10.700735 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
[Thu Dec 18 21:19:10.700739 2014] [:error] [pid 12342]     rv = self.dispatch_request()
[Thu Dec 18 21:19:10.700743 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
[Thu Dec 18 21:19:10.700747 2014] [:error] [pid 12342]     return self.view_functions[rule.endpoint](**req.view_args)
[Thu Dec 18 21:19:10.700751 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/anitya/ui.py", line 138, in distros
[Thu Dec 18 21:19:10.700755 2014] [:error] [pid 12342]     distros = anitya.lib.model.Distro.all(SESSION, page=page)
[Thu Dec 18 21:19:10.700759 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/anitya/lib/model.py", line 177, in all
[Thu Dec 18 21:19:10.700763 2014] [:error] [pid 12342]     return query.all()
[Thu Dec 18 21:19:10.700767 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/query.py", line 2300, in all
[Thu Dec 18 21:19:10.700771 2014] [:error] [pid 12342]     return list(self)
[Thu Dec 18 21:19:10.700775 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/query.py", line 2412, in __iter__
[Thu Dec 18 21:19:10.700779 2014] [:error] [pid 12342]     return self._execute_and_instances(context)
[Thu Dec 18 21:19:10.700783 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/query.py", line 2427, in _execute_and_instances
[Thu Dec 18 21:19:10.700787 2014] [:error] [pid 12342]     result = conn.execute(querycontext.statement, self._params)
[Thu Dec 18 21:19:10.700791 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 729, in execute
[Thu Dec 18 21:19:10.700795 2014] [:error] [pid 12342]     return meth(self, multiparams, params)
[Thu Dec 18 21:19:10.700799 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/sql/elements.py", line 321, in _execute_on_connection
[Thu Dec 18 21:19:10.700804 2014] [:error] [pid 12342]     return connection._execute_clauseelement(self, multiparams, params)
[Thu Dec 18 21:19:10.700808 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 826, in _execute_clauseelement
[Thu Dec 18 21:19:10.700812 2014] [:error] [pid 12342]     compiled_sql, distilled_params
[Thu Dec 18 21:19:10.700815 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 958, in _execute_context
[Thu Dec 18 21:19:10.700819 2014] [:error] [pid 12342]     context)
[Thu Dec 18 21:19:10.700823 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1160, in _handle_dbapi_exception
[Thu Dec 18 21:19:10.700827 2014] [:error] [pid 12342]     exc_info
[Thu Dec 18 21:19:10.700844 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/util/compat.py", line 199, in raise_from_cause
[Thu Dec 18 21:19:10.700849 2014] [:error] [pid 12342]     reraise(type(exception), exception, tb=exc_tb)
[Thu Dec 18 21:19:10.700854 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 951, in _execute_context
[Thu Dec 18 21:19:10.700858 2014] [:error] [pid 12342]     context)
[Thu Dec 18 21:19:10.700861 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/default.py", line 436, in do_execute
[Thu Dec 18 21:19:10.700865 2014] [:error] [pid 12342]     cursor.execute(statement, parameters)
[Thu Dec 18 21:19:10.700869 2014] [:error] [pid 12342] OperationalError: (OperationalError) terminating connection due to administrator command
[Thu Dec 18 21:19:10.700873 2014] [:error] [pid 12342] FATAL:  terminating connection due to administrator command
[Thu Dec 18 21:19:10.700878 2014] [:error] [pid 12342]  'SELECT distros.name AS distros_name \\nFROM distros ORDER BY distros.name \\n LIMIT %(param_1)s OFFSET %(param_2)s' {'param_1': 50, 'param_2': 0}
[Thu Dec 18 21:19:10.701036 2014] [:error] [pid 12342] Exception on /distros/ [GET]
[Thu Dec 18 21:19:10.701055 2014] [:error] [pid 12342] Traceback (most recent call last):
[Thu Dec 18 21:19:10.701061 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
[Thu Dec 18 21:19:10.701065 2014] [:error] [pid 12342]     response = self.full_dispatch_request()
[Thu Dec 18 21:19:10.701085 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
[Thu Dec 18 21:19:10.701092 2014] [:error] [pid 12342]     rv = self.handle_user_exception(e)
[Thu Dec 18 21:19:10.701096 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
[Thu Dec 18 21:19:10.701100 2014] [:error] [pid 12342]     reraise(exc_type, exc_value, tb)
[Thu Dec 18 21:19:10.701104 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
[Thu Dec 18 21:19:10.701108 2014] [:error] [pid 12342]     rv = self.dispatch_request()
[Thu Dec 18 21:19:10.701112 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
[Thu Dec 18 21:19:10.701116 2014] [:error] [pid 12342]     return self.view_functions[rule.endpoint](**req.view_args)
[Thu Dec 18 21:19:10.701120 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/anitya/ui.py", line 138, in distros
[Thu Dec 18 21:19:10.701124 2014] [:error] [pid 12342]     distros = anitya.lib.model.Distro.all(SESSION, page=page)
[Thu Dec 18 21:19:10.701128 2014] [:error] [pid 12342]   File "/usr/lib/python2.7/site-packages/anitya/lib/model.py", line 177, in all
[Thu Dec 18 21:19:10.701132 2014] [:error] [pid 12342]     return query.all()
[Thu Dec 18 21:19:10.701136 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/query.py", line 2300, in all
[Thu Dec 18 21:19:10.701140 2014] [:error] [pid 12342]     return list(self)
[Thu Dec 18 21:19:10.701143 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/query.py", line 2412, in __iter__
[Thu Dec 18 21:19:10.701147 2014] [:error] [pid 12342]     return self._execute_and_instances(context)
[Thu Dec 18 21:19:10.701151 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/query.py", line 2427, in _execute_and_instances
[Thu Dec 18 21:19:10.701155 2014] [:error] [pid 12342]     result = conn.execute(querycontext.statement, self._params)
[Thu Dec 18 21:19:10.701159 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 729, in execute
[Thu Dec 18 21:19:10.701163 2014] [:error] [pid 12342]     return meth(self, multiparams, params)
[Thu Dec 18 21:19:10.701179 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/sql/elements.py", line 321, in _execute_on_connection
[Thu Dec 18 21:19:10.701185 2014] [:error] [pid 12342]     return connection._execute_clauseelement(self, multiparams, params)
[Thu Dec 18 21:19:10.701189 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 826, in _execute_clauseelement
[Thu Dec 18 21:19:10.701194 2014] [:error] [pid 12342]     compiled_sql, distilled_params
[Thu Dec 18 21:19:10.701197 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 958, in _execute_context
[Thu Dec 18 21:19:10.701201 2014] [:error] [pid 12342]     context)
[Thu Dec 18 21:19:10.701205 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1160, in _handle_dbapi_exception
[Thu Dec 18 21:19:10.701209 2014] [:error] [pid 12342]     exc_info
[Thu Dec 18 21:19:10.701212 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/util/compat.py", line 199, in raise_from_cause
[Thu Dec 18 21:19:10.701216 2014] [:error] [pid 12342]     reraise(type(exception), exception, tb=exc_tb)
[Thu Dec 18 21:19:10.701220 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 951, in _execute_context
[Thu Dec 18 21:19:10.701224 2014] [:error] [pid 12342]     context)
[Thu Dec 18 21:19:10.701228 2014] [:error] [pid 12342]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/default.py", line 436, in do_execute
[Thu Dec 18 21:19:10.701232 2014] [:error] [pid 12342]     cursor.execute(statement, parameters)
[Thu Dec 18 21:19:10.701235 2014] [:error] [pid 12342] OperationalError: (OperationalError) terminating connection due to administrator command
[Thu Dec 18 21:19:10.701239 2014] [:error] [pid 12342] FATAL:  terminating connection due to administrator command
[Thu Dec 18 21:19:10.701243 2014] [:error] [pid 12342]  'SELECT distros.name AS distros_name \\nFROM distros ORDER BY distros.name \\n LIMIT %(param_1)s OFFSET %(param_2)s' {'param_1': 50, 'param_2': 0}

launchpad driver problems

https://release-monitoring.org/project/5410/

name: granite
homepage: http://elementaryos.org/
backend: launchpad

i would expect it to take $name and construct launchpad download url.

but instead it takes homepage, and tries to build download url from that:

granite: no upstream version found. - http://elementaryos.org//+download - granite(?:[-_]?(?:minsrc|src|source))?[-_]([^-/_\s]+?)(?i)(?:[-_](?:minsrc|src|source))?\.(?:tar|t[bglx]z|tbz2|zip)

this looks wrong by design.

Provide user to find its own added projects

I think generally every web service provides a way to find what you owns in that service. E.g. pkgdb2 shows what packages you own, bodhi shows what packages you pushed when you login.
Similarly is there any plans to provide what projects I belong/added in Anitya for upstream monitoring?

proper capitalization of providers

Pear proper capitalization is PEAR as it's abbrevation, like GNOME
similar issue for PECL...

probably worth checking proper capitalization for all backends when handling this bug :)

casing in googlecode urls

I added https://release-monitoring.org/project/5737/ for BioNetGen, but the check fails because the url has lowercase bionetgen:
bad: https://code.google.com/p/BioNetGen/downloads/list?sort=releasedate
good: https://code.google.com/p/bionetgen/downloads/list?sort=releasedate

Upstream camelcases the tarball names, so the camelcased name seems to be the right one to use. It would be really nice if I could use the standard googlecode pattern, but allow the name to be lowercase.

Allow adding an initial mapping

When I'm adding an upstream project for the very first time, this is quite often because I want to map that project to a distro package. When I have 2 trillion packages to map, this can be quite annoying as I have to open the form the create the upstream project, submit it, click 'add a mapping', then fill out that form, then submit it. It would be quite nice if that first 'new upstream project' form had a section to add an initial distro mapping which, if left blank would do nothing.

GNOME driver does not catch latest version

current implementation of gnome driver finds only major version,
but not actual full release, which tarballs are in subdir

ex: https://release-monitoring.org/project/5390/
finds 3.14 from https://download.gnome.org/sources/gnome-power-manager/ dir
but 3.14 latest is 3.14.1 as of this writing: https://download.gnome.org/sources/gnome-power-manager/3.14/

there's cache.json in each project dir: https://download.gnome.org/sources/gnome-power-manager/cache.json

maybe parse that instead?

contains for example:

3.14: [
"LATEST-IS-3.14.1"
],

rubygems

I have two comments with regards to gem packages:

  1. The rubygem-* prefix is fedoraism. Other distributions might not use such prefix. Debian prefixes ruby libraries with lib* if I am not mistaken.
  2. The homepage url to rubygems.org [1] is wrong. It should be without the rubygem-* prefix

So to say, may be you should reconsider what the project is and what is the source. I can imagine, that once you remove the rubygem- prefix from rubygem-sqlite3, you can't distinguish between the slite3 library and its Ruby binding, but there should be probably different way then to use Fedora's prefix. Otherwise I am afraid that Anitya might be ignored by other distros/projects.

[1] http://209.132.184.188/anitya/project/4443/

RFE: strip common github tag prefixes

It'd be good to strip common prefixes used in github tags that are not part of the version string. At least a leading "v" could be removed, ditto "$project-".

add api to for distro packages maintainer

as distribution maintainer, i would like to do over api:

  • create project<>distribution package mapping (project_id (numeric), distribution name, distribution package name)
  • add project (name, homepage, backend, backend specific options)
  • rename package mapping for distribution (project_id, distribution name, old name(?), new name)

Allow checking anytime one wants to

I just edited the config for the reptyr project. Anitya does not offer me a button to use for checking what my changes accomplished, so I guess I'll have to wait max 12 hours to see what happened... I think the button for doing this that is visible immediately after creating a project (for doing the initial check) should be always available.

Need user-friendly way for overriding project's version URL / regex

There are projects that, for some reason or another, have different naming conventions upstream, either for the path where new releases show up (the "version URL") or the tarball name (the "regex").

e.g. 0install -- the SF project was originally created as zero-install and the old spelling sticks there.

Now that we separate the project name from the distribution package name, overriding the regex is probably a less common need (we could track the upstream name, and map to a different name to the distro package), but there's still a need to be able to override the version URL.

In the current set up with the Upstream Release Monitoring wiki, one could easily do something like 'SF-DEFAULT:zero-install' -- use the SourceForge default but replace the default package name with the one provided. Right now, a user who doesn't know the particular regex would have to select the Sourceforge backend, do a check, have it fail, copy the URL, change to a custom backend and perform the override by hand...

I propose a UI change that add override fields when choosing a project's backend. If filled the override gets passed along to the backend. Thoughts?

strip whitespace from inputs

https://release-monitoring.org/project/4583/map/5921

i've filled package name with trailing space: "ruby-mixlib-shellout "
this should be stripped when storing to database

as it appears in api output as well https://release-monitoring.org/api/project/4583:

{
    backend: "Rubygems",
    created_on: 1412175105,
    homepage: "http://rubygems.org/gems/mixlib-shellout",
    id: 4583,
    name: "mixlib-shellout",
    packages: [
        {
            distro: "Fedora",
            package_name: "rubygem-mixlib-shellout"
        },
        {
            distro: "PLD-Linux",
            package_name: "ruby-mixlib-shellout "
        }
    ],
    regex: null,
    updated_on: 1417525561,
    version: "2.0.0",
    version_url: null,
    versions: [
        "1.4.0",
        "1.6.0",
        "2.0.0"
    ]
}

multiple projects with the same name

There is https://github.com/google/closure-compiler and http://npmjs.org/package/closure-compiler. The latter is a wrapper for the former. Fedora packages are called closure-compiler and nodejs-closure-compiler. Both should be added, but when I changed https://release-monitoring.org/project/2209/ to have the name nodejs-closure-compiler, the download url does not work anymore. The problem is similar to #107 — a custom name has to be used in the download url.

libmodplug ghost distro mapping

I tried to add the libmodplug project, got an internal server error while adding it, and now I cannot add a distro mapping (Fedora, libmodplug) for it, the service tells me "Could not edit the mapping of libmodplug on Fedora, there is already a package libmodplug on Fedora" but the mapping is not actually shown in the project mappings view.

https://release-monitoring.org/project/5669/

Handle projects that release multiple packages

https://www.xine-project.org/releases release for example xine-lib and gxine at sourceforge. For the sourceforge backend to work, the project name needs to be xine for both and the sourceforge name can be xine-lib and gxine. However if both projects are called xine, they are not allowed to have the same homepage:

https://release-monitoring.org/project/5543/
https://release-monitoring.org/project/5558/

Also the conversion from the wiki did not work properly for the 5543 xine project, because the sourceforge name contained the full line from the wiki - or it was a human error and someone entered the wrone value there.

Allow mapping deletions

The "Drupal 7" Anitya project (note that it was originally named "drupal" but I changed it to "Drupal 7") was created during the migration from the wiki-based upstream monitoring but it incorrectly maps to Fedora packages drupal6 and drupal7. I created the "Drupal 6" Anitya project but I cannot map it to the drupal6 Fedora package because the package is already mapped to the "Drupal 7" Anitya project.

allow fetch for modified packages

say package in anitya got new homepage, i modify the package definition, but default users do not have privilege to refetch version if there's already version set.

perhaps reset the fetch version check blocker if package state was modified (package info, not distro mapping)

Coro is not monitored

The maintainer of Coro in Fedora is not notified when a new version of the perl module is released on CPAN. Version 6.42 was released last week and no bug was filed in bugzilla.redhat.com .

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

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

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.