GithubHelp home page GithubHelp logo

ncarlier / feedpushr Goto Github PK

View Code? Open in Web Editor NEW
338.0 7.0 26.0 45.62 MB

A simple feed aggregator daemon with sugar on top.

License: GNU General Public License v3.0

Makefile 1.14% Go 76.00% Dockerfile 0.24% HTML 1.71% JavaScript 1.21% CSS 0.10% Shell 0.31% TypeScript 19.29%
rss rss-aggregator feed-aggregator-daemon go restful-api push twitter mastodon opml

feedpushr's People

Contributors

guelfey avatar jippi avatar ncarlier avatar staticrocket avatar wendyliga 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

feedpushr's Issues

Mail output plugin - no Date

I'm on 3.3.1 in Docker.

Using mail output plugin results in emails being without dates at all. No such header added here.

Some mail clients does not show any date for mails if no such header present. This not a problem for Thunderbird as it shows date on which email was received, but for KMail2, for example, a huge one:

изображение

Those "неизвестное" should be a date on which mail was sent.

{"level":"error","error":"unsuported filter: ","time":X,"message":"unable to init filter chain"}

[sevos]:<~>$ feedpushr -addr 127.0.0.1:9001 -filter fetch
{"level":"info","component":"store","uri":"boltdb://data.db","time":1580562047,"message":"using BoltDB datastore"}
{"level":"error","error":"unsuported filter: ","time":1580562047,"message":"unable to init filter chain"}
{"level":"fatal","error":"unsuported filter: ","time":1580562047,"message":"unable to init main service"}

I'd love to have full text, so I tried to run it with the fetch plugin, however it's not working for some reason. Any idea what's wrong?

[Feature request] add htmlUrl in the feed list

Hi,

Hope you are doing well !

It would be awesome to display a small icon with the link to the the blog, when available, near the feed link in the ui.

It would make easier the choice to enable/disable a feed in feedpushr.

Thanks again for this great tool !

Cheers,
Luc

Feature request: email_bcc instead of email_to

Hello again !

As you added quite nicely the feature to use a single output for multiple email addresses through #88, could it be possible to choose to use the bcc field instead of the to: field to avoid people knowing all the receivers' emails ?

Thanks!

Is there a variable for feeds `Title` to be used in the output?

I've successfully sent feed outputs to Mattermost instance as written in the document but is there a variable to send feed's Title (not the article title but the title put in the admin panel for each feeds)?

I have set multiple feeds to be sent to a single Mattermost output configuration but I can distinguish each messages better if I can see which feed it came from.

twitter plugin credentials

Hi,

Hope you are doing well !

How do you pass the twitter's credentials to the twitter plugin ?
Can you prodive an example of command line ?

Cheers,
X

OIDC client_id and secret parameters

I'm trying to setup OpenID auth (via Google) for feedpushr, but I noticed that the only parameter requested for setup is FP_AUTHN (for the issuer URL), whereas OIDC additionally requires a client id and secret (and the redirect URI I guess) to complete the flow.

Is there a way to pass these to feedpushr on start up like FP_AUTHN, or is the recommended pattern to clone the repo and make the modifications locally? If the later, can you point me to where the secret is set in the code + the redirect URI format? I've found that the client_id is set to 'feedpushr-ui' so that I can change.

Thank you for creating feedpushr btw, it's a great app that has saved me tons of time - I appreciate the work you've put into it!

plugin rake is not appearing

Hi again,

Hope you are all well !

In order to build the yake module, I wanted to test the rake plugin.

./feedpushr --log-pretty --plugin feedpushr-rake.so

Nowhere, where to configure the rake parameters.

Am I missing something ?

Cheers,
X

Proxy support?

Is there any proxy support, specifically on a per feed basis? Basically to get around Cloudflare...

Feeds are enabled on restart

I imported feeds using OPML.

Once feeds are imported, they are all disabled, which is fine.

fp1

If I stop then restart feedpushr, all feeds are enabled :

fp2

I think they shall remain disabled since I did not enable them.

Empty on restart

Running a feedpushr in a docker container, when the container is restarted all of the data disappears.

I assume the solution is to set up a volume, however the folders to use in the volume are not listed in the repo.

Could someone please let me know which folders I need to link.

Thanks

Not all articles are being sent to output plugin?

I've added an ATOM feed from https://status.digitalocean.com/history.atom and the feed screen is showing 25 as Aggregation success but in the output plugin that I've configured to send to Mattermost (I do not have any rate limiting in Mattermost) with http plugin, I only get the latest 2 article entries but should it not send the entire 25 entries to the output plugin once the feed and the output settings are added?

I've also added https://status.linode.com/history.atom and this one sent out 4 articles to the output plugin and another from https://www.cloudflarestatus.com/history.atom sent 9 articles to the output plugin and seems it's behaving inconsistently.

OPML import does not support categories

Here is a sample OPML :

<?xml version="1.0" encoding="UTF-8"?>
<opml version="1.0">
    <head>
        <title>No matter what</title>
    </head>
    <body>
        <outline text="Info" title="Info">
            <outline type="rss" text="LinuxFr.org : les dépêches" title="LinuxFr.org : les dépêches" xmlUrl="http://linuxfr.org/news.atom" htmlUrl="https://linuxfr.org/news"/>
        </outline>
    </body>
</opml>

Nothing is imported and the following error appears in the logs :

WRN unable to create feed: skipped error="Get : unsupported protocol scheme """ component=import title="No matter what" url=

OPML imports in a strict mode

Hi, @ncarlier - thank you for all the good work.

I have a use case where I would like to have an OPML file define a portable source of truth for which URLs to follow.

Importing it via the API would make feedpushr obey the items included in the last import, discarding the rest, which differs from the append-only approach as it exists now.

I'm happy to provide an example of this. The POST endpoint could take a payload/param signalling this strict import mode.
Is there any appetite for it / pitfall to be aware of before I make a start?

failed to compile ui

Hi,

Hope you are all well !

while running the command npm run start, I have the following error:

Failed to compile
/app/src/feeds/FeedList.tsx
TypeScript error in /app/src/feeds/FeedList.tsx(23,16):
Generic type 'Column<RowData>' requires 1 type argument(s).  TS2314

    21 | }
    22 | 
  > 23 | const columns: Column[] = [
       |                ^
    24 |   { 
    25 |     title: 'Aggregation',
    26 |     render: (feed: Feed) => ( !!feed && <FeedControl feed={feed} /> ),

Any way to fix it ? Thanks in advance.

Have a good week-end !

Cheers,
X

How to use RDBMS plugin through docker?

I first tried to place the plugin in the environment variable, (not sure if the path was right and I tried several others like feedpushr-rdbms.so, contrib/rdbms/feedpushr-rdbms.so,

working_dir: /var/opt/feedpushr
environment:
  - FP_PLUGINS=plugins/feedpushr-rdbms.so

but those paths failed with realpath failed in the log.

I also tried to place feedpushr-rdbms.so from the downloaded release file of the same version of the latest docker image at 3.2.0 but this failed with plugin was built with a different version of package internal/abi.

Is there a way to add an output plugin to the docker instance?

Cannot add slow feed as DefaultTimeout is too small

// DefaultTimeout for HTTP requests
const DefaultTimeout = time.Duration(5 * time.Second)

I self-hosted RSS-Bridge on Celeron PC and using its component, XPathBridge which is resource demanding task.
The default 5-second timeout leads to context canceled.
May I ask you to increase the default timeout or add a settings for it?

Some sites parsed incorrectly

Hello, I'm in docker on e38a6ee with mail output plugin.

Some sites parsed incorrectly, e.g. sometimes new releases from github repositories appears like:

изображение

and no actual release information.

Confirmed feeds:

It happens absolutely randomly, sometimes it parses feed normally, sometimes it puts something like HTML head in letter (like on screenshot).

I was using latest release before, it was working fine.

Send email to multiple to: addresses

Hello,

Thank you for the hard work so far !

Unless I'm mistaken, the email output entry can only send an email to a single email address.

I am using feedpushr to send a blog output to multiple friends while parsing its RSS feed. Having to add a single output per person is a bit tedious. What would it take to have multiple email addresses in the "To" field of outputs ?

Thanks,

Fatal error: concurrent map writes

Seen with the docker container and 7 feed sources:

ncarlier/feedpushr:latest 26dd59e5bc42

fatal error: concurrent map writes

goroutine 4403 [running]:
runtime.throw({0x13d573b, 0xc00060df48})
	/usr/local/go/src/runtime/panic.go:1198 +0x71 fp=0xc00060df18 sp=0xc00060dee8 pc=0x85be51
runtime.mapassign_faststr(0xc000612e00, 0x0, {0xc000110aa0, 0x20})
	/usr/local/go/src/runtime/map_faststr.go:211 +0x39c fp=0xc00060df80 sp=0xc00060df18 pc=0x83979c
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*Manager).UnRegisterFeedAggregator(0xc0005c0640, {0xc000110aa0, 0x20})
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/manager.go:68 +0x6e fp=0xc00060dfb8 sp=0xc00060df80 pc=0x113f1ee
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*Manager).Shutdown·dwrap·2()
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/manager.go:95 +0x2e fp=0xc00060dfe0 sp=0xc00060dfb8 pc=0x113f70e
runtime.goexit()
	/usr/local/go/src/runtime/asm_amd64.s:1581 +0x1 fp=0xc00060dfe8 sp=0xc00060dfe0 pc=0x88d861
created by github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*Manager).Shutdown
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/manager.go:95 +0x288

goroutine 1 [IO wait, 7 minutes]:
internal/poll.runtime_pollWait(0x7b1f4623dfd0, 0x72)
	/usr/local/go/src/runtime/netpoll.go:303 +0x85
internal/poll.(*pollDesc).wait(0xc000616180, 0xc00004c800, 0x0)
	/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Accept(0xc000616180)
	/usr/local/go/src/internal/poll/fd_unix.go:402 +0x22c
net.(*netFD).accept(0xc000616180)
	/usr/local/go/src/net/fd_unix.go:173 +0x35
net.(*TCPListener).accept(0xc0002c60d8)
	/usr/local/go/src/net/tcpsock_posix.go:140 +0x28
net.(*TCPListener).Accept(0xc0002c60d8)
	/usr/local/go/src/net/tcpsock.go:262 +0x3d
net/http.(*Server).Serve(0xc0005b4380, {0x1b25190, 0xc0002c60d8})
	/usr/local/go/src/net/http/server.go:3002 +0x394
github.com/goadesign/goa.(*Service).Serve(...)
	/go/pkg/mod/github.com/goadesign/[email protected]/service.go:216
github.com/ncarlier/feedpushr/v3/pkg/server.(*Server).ListenAndServe(0xc0005c62c0, {0x12690b6, 0x5})
	/go/src/github.com/ncarlier/feedpushr/pkg/server/server.go:58 +0x1b9
main.main()
	/go/src/github.com/ncarlier/feedpushr/main.go:123 +0x697

goroutine 6 [select, 5 minutes]:
github.com/blevesearch/bleve/index.AnalysisWorker({0xc0004bae40, 0xc0004baea0})
	/go/pkg/mod/github.com/blevesearch/[email protected]/index/analysis.go:102 +0xcc
created by github.com/blevesearch/bleve/index.NewAnalysisQueue
	/go/pkg/mod/github.com/blevesearch/[email protected]/index/analysis.go:94 +0x97

goroutine 7 [select, 5 minutes]:
github.com/blevesearch/bleve/index.AnalysisWorker({0xc0004bae40, 0xc0004baea0})
	/go/pkg/mod/github.com/blevesearch/[email protected]/index/analysis.go:102 +0xcc
created by github.com/blevesearch/bleve/index.NewAnalysisQueue
	/go/pkg/mod/github.com/blevesearch/[email protected]/index/analysis.go:94 +0x97

goroutine 8 [select, 1992 minutes]:
github.com/blevesearch/bleve/index.AnalysisWorker({0xc0004bae40, 0xc0004baea0})
	/go/pkg/mod/github.com/blevesearch/[email protected]/index/analysis.go:102 +0xcc
created by github.com/blevesearch/bleve/index.NewAnalysisQueue
	/go/pkg/mod/github.com/blevesearch/[email protected]/index/analysis.go:94 +0x97

goroutine 9 [select, 1992 minutes]:
github.com/blevesearch/bleve/index.AnalysisWorker({0xc0004bae40, 0xc0004baea0})
	/go/pkg/mod/github.com/blevesearch/[email protected]/index/analysis.go:102 +0xcc
created by github.com/blevesearch/bleve/index.NewAnalysisQueue
	/go/pkg/mod/github.com/blevesearch/[email protected]/index/analysis.go:94 +0x97

goroutine 44 [syscall]:
os/signal.signal_recv()
	/usr/local/go/src/runtime/sigqueue.go:169 +0x98
os/signal.loop()
	/usr/local/go/src/os/signal/signal_unix.go:24 +0x19
created by os/signal.Notify.func1.1
	/usr/local/go/src/os/signal/signal.go:151 +0x2c

goroutine 50 [chan receive, 553 minutes]:
github.com/ncarlier/feedpushr/v3/pkg/cache.(*Manager).startCacheBusterJob(0xc0005b0180)
	/go/src/github.com/ncarlier/feedpushr/pkg/cache/manager.go:65 +0xad
created by github.com/ncarlier/feedpushr/v3/pkg/cache.NewCacheManager
	/go/src/github.com/ncarlier/feedpushr/pkg/cache/manager.go:43 +0x49a

goroutine 51 [semacquire]:
sync.runtime_Semacquire(0x0)
	/usr/local/go/src/runtime/sema.go:56 +0x25
sync.(*WaitGroup).Wait(0xc0005e06e0)
	/usr/local/go/src/sync/waitgroup.go:130 +0x71
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*Manager).Shutdown(0xc0005c0640)
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/manager.go:97 +0x1af
github.com/ncarlier/feedpushr/v3/pkg/server.(*Server).Shutdown(0xc0005c62c0, {0x1b2cee8, 0xc00082a000})
	/go/src/github.com/ncarlier/feedpushr/pkg/server/server.go:67 +0x47
main.main.func1()
	/go/src/github.com/ncarlier/feedpushr/main.go:113 +0xbf
created by main.main
	/go/src/github.com/ncarlier/feedpushr/main.go:107 +0x631

goroutine 53 [select, 12 minutes]:
github.com/ncarlier/feedpushr/v3/pkg/output.(*Processor).start.func1()
	/go/src/github.com/ncarlier/feedpushr/pkg/output/processor.go:105 +0xdf
created by github.com/ncarlier/feedpushr/v3/pkg/output.(*Processor).start
	/go/src/github.com/ncarlier/feedpushr/pkg/output/processor.go:102 +0x7b

goroutine 55 [select, 5 minutes]:
github.com/ncarlier/feedpushr/v3/pkg/output.(*Processor).start.func1()
	/go/src/github.com/ncarlier/feedpushr/pkg/output/processor.go:105 +0xdf
created by github.com/ncarlier/feedpushr/v3/pkg/output.(*Processor).start
	/go/src/github.com/ncarlier/feedpushr/pkg/output/processor.go:102 +0x7b

goroutine 66 [chan receive]:
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run.func1()
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:100 +0x34
created by github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:97 +0x5b

goroutine 82 [chan receive]:
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run.func1()
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:100 +0x34
created by github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:97 +0x5b

goroutine 26 [chan receive, 1992 minutes]:
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run.func1()
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:100 +0x34
created by github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:97 +0x5b

goroutine 27 [select, 12 minutes]:
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).running.func1()
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:85 +0x4ca
created by github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).running
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:58 +0x65

goroutine 86 [chan receive]:
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run.func1()
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:100 +0x34
created by github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:97 +0x5b

goroutine 56 [chan receive]:
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run.func1()
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:100 +0x34
created by github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:97 +0x5b

goroutine 90 [chan receive, 1992 minutes]:
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run.func1()
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:100 +0x34
created by github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:97 +0x5b

goroutine 91 [select, 12 minutes]:
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).running.func1()
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:85 +0x4ca
created by github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).running
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:58 +0x65

goroutine 4368 [runnable]:
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).Stop(0xc000612400)
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:126 +0x3c
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*Manager).UnRegisterFeedAggregator(0xc0005c0640, {0xc000604260, 0x20})
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/manager.go:67 +0x50
created by github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*Manager).Shutdown
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/manager.go:95 +0x288

goroutine 4402 [runnable]:
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*Manager).Shutdown·dwrap·2()
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/manager.go:95
runtime.goexit()
	/usr/local/go/src/runtime/asm_amd64.s:1581 +0x1
created by github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*Manager).Shutdown
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/manager.go:95 +0x288

goroutine 4349 [chan receive]:
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run.func1()
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:100 +0x34
created by github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*FeedAggregator).run
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/runner.go:97 +0x5b

goroutine 4367 [runnable]:
github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*Manager).Shutdown·dwrap·2()
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/manager.go:95
runtime.goexit()
	/usr/local/go/src/runtime/asm_amd64.s:1581 +0x1
created by github.com/ncarlier/feedpushr/v3/pkg/aggregator.(*Manager).Shutdown
	/go/src/github.com/ncarlier/feedpushr/pkg/aggregator/manager.go:95 +0x288

Plugins

I dont know how to get plugins for docker to work. If i add this to my docker compose the container wont start

environment:
  - FP_PLUGINS=`./plugins/feedpushr-twiter.so,./plugins/feedpushr-rake.so`

Installation
Copy the feedpushr-rake.so file into your Feedpushr working directory.

I can not fine a file called feedpushr-rake.so

cannot make plugins

Hi,

Hope you are all well and congrats for this new release :-) !

While building the plugins, I have the following error:

feedpushr % make plugins
>>> Building: feedpushr-twitter.so 7a823e0 for linux-amd64 ...
# github.com/ncarlier/feedpushr-contrib/twitter
loadinternal: cannot find runtime/cgo
/usr/local/Cellar/go/1.14/libexec/pkg/tool/darwin_amd64/link: running clang failed: exit status 1
ld: unknown option: -z
clang: error: linker command failed with exit code 1 (use -v to see invocation)

make[1]: *** [plugin] Error 2
make: *** [plugins] Error 2

Any reason why ? Is there a way to sort it out ?

Cheers,
X

[Feature request] Lack of access UI auth

Hey! I'm really liking Feedpushr for RSS. It's done nicely, it's fast and scrapes a lot of content very accurately. But there's a lack of any auth - literally anyone can access my UI and play with my RSS feeds, get to know my API key etc.

I think it would be a good move to require some kind of auth, like login and password.

[Feature request] throttling the number of output per second

Hi again,

Hope you are still all well !

I have developed a couple of plugins that require to throttle the output.

For example, I have written a plugin twitter-selenium. It launch one chrome instance but it needs to wait that one tweet is written/sent before having another tweet to be triggered.

Also, this apply for the yake module, if too much requests are sent to the service, it makes the rest service unavailable quickly because we do not have an option to throttle the output.

This feature is really important as it gonna be required for many potential plugins.

Thanks again if you can push that feature.

Cheers,
Luc

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.