Code Monkey home page Code Monkey logo

newsboat's Introduction

Newsboat Cirrus CI Build Status GitHub Actions: Coveralls status Coverage Status CII Best Practices

Newsboat logo

Newsboat is an RSS/Atom feed reader for the text console. It's an actively maintained fork of Newsbeuter.

A feed reader pulls updates directly from sites like blogs and news agencies, and lets you review them in a single interface. Many times, the feed includes the full text of the update, so you don't even need to start a web browser! You can learn more about feed readers on Wikipedia.

Viewing an article in Newsboat

Notable features

Downloading

You can download the latest version of Newsboat from the official site: https://newsboat.org/

Alternatively, you can check out the latest version from the Git repository:

$ git clone https://github.com/newsboat/newsboat.git

Dependencies

Newsboat depends on a number of libraries, which need to be installed before Newsboat can be compiled.

Developers will also need:

Installation

There are numerous ways:

  • install from your distribution's repository (a lot of distros have a package);

  • install via Snap:

    $ sudo snap install newsboat
    

    Our snap only supports xdg-open as the browser, and you can't run arbitrary scripts for rendering and bookmarking. The reason is strict confinement; if we disabled it, the snap would be no better than a distribution's package;

  • build from source with Docker. Note that the resulting binary might not run outside of that same Docker container if your system doesn't have all the necessary libraries, or if their versions are too old;

  • build from source in a chroot: to avoid polluting your system with developer packages, or to avoid upgrading, you might use a tool like debootstrap to create an isolated environment. Once that's done, just build from source as outlined in the next item;

  • build from source.

    Install everything that's listed in the "Dependencies" section above. Make sure to install the header files as well (on Debian and derivatives, headers are in -dev packages, e.g. libsqlite3-dev.)

    Cross-compilers need to set CARGO_BUILD_TARGET; see cargo documentation.

    Then compile and install with:

    $ make                   #  pass -jN to use N CPU cores, e.g. -j8
    $ sudo make install      #  install everything under /usr/local
    

    To install to a different directory, pass prefix like so: sudo make prefix=/opt/newsboat install.

    To uninstall, run sudo make uninstall.

Support

Contributing

See CONTRIBUTING.md

License

Newsboat is licensed under the MIT license; see the LICENSE file. Logo by noobilanderi, licensed under CC BY 4.0.

newsboat's People

Contributors

a1ro avatar akrennmair avatar bitigchi avatar bogdasar1985 avatar carno avatar dennisschagt avatar dependabot[bot] avatar der-lyse avatar dj-bauer avatar gjabell avatar gs93 avatar j605 avatar jamesbvaughan avatar juntuu avatar kmws avatar minoru avatar mjsir911 avatar ni0n avatar nick-cd avatar noctux avatar pickfire avatar rnestler avatar romeug avatar scompo avatar seanbe avatar skn avatar spacewalker2 avatar theidinside avatar tsipinakis avatar zaowen 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

newsboat's Issues

Chinese contents display error: there are garbage characters and some contents are lost

Newsboat version (copy from newsboat -v):

newsboat 2.10.1 - https://newsboat.org/
Copyright (C) 2006-2015 Andreas Krennmair
Copyright (C) 2015-2017 Alexander Batischev
Copyright (C) 2006-2017 Newsbeuter contributors
Copyright (C) 2017 Newsboat contributors

newsboat is free software and licensed under the MIT/X Consortium License.
Type `newsboat -vv' for more information.

newsboat 2.10.1
System: Linux 4.13.8-1-ARCH (x86_64)
Compiler: g++ 7.2.0
ncurses: ncurses 6.0.20170902 (compiled with 6.0)
libcurl: libcurl/7.56.0 OpenSSL/1.1.0f zlib/1.2.11 libpsl/0.18.0 (+libicu/59.1) libssh2/1.8.0 nghttp2/1.23.1 (compiled with 7.56.0)
SQLite: 3.20.1 (compiled with 3.20.1)
libxml2: compiled with 2.9.5

Steps to reproduce the issue:

  1. Subscribe a Chinese RSS, like http://feed.williamlong.info/

  2. Load that RSS

  3. Open one article. You will fine garbage characters at the end of some lines. Some contents are lost too.

Other info you think is relevant:

Please see screenshots.

Image below is newsboat's screenshot. You can find garbage characters near line endings. Some contents are lost too. You may notice there are several empty lines after garbage characters. Actually no empty lines shall be here. Some contents are lost, leaving empty lines.

Newsboat Screenshot

Image below is the original article's screenshot. You can compare it with Newsboat's screenshot and you will find some contents become garbage characters and some are lost.

Original Article

The link to the article

License header and content discrepancy

While preparing the debian/copyright file for newsboat I discovered a small discrepancy: The license header says that it's the MIT/X Consortium license but the content is actually the MIT Expat license.

See here for the difference.

Add TT-RSS authenticaton failure entry to FAQ

TT-RSS authentication failure is a real frequently asked question if we ever had one. It also feels like we have a body of answers that work time and again. Let's compile them into a FAQ entry!

Have to check:

  • #newsbeuter channel logs
  • Newsbeuter issue tracker
  • Newsboat issue tracker

Build docs on Travis

At the moment, our Travis jobs build the code but not the docs. Since we now have some custom logic for doc generation (i.e. doc/generate.cpp, sed invocations in the Makefile), it's be useful to build the docs on all platforms during CI.

std::bad_alloc while updating

As a follow-up to #16, I just had a std::bad_alloc thrown again while just having newsboat open and doing nothing - I think it happened while updating (with ttrss) again. I have about 14 GB of available RAM, so that shouldn't be the issue..

Version info:

newsboat 2.10.1
System: Linux 4.13.3-1-ARCH (x86_64)
Compiler: g++ 7.2.0
ncurses: ncurses 6.0.20170902 (compiled with 6.0)
libcurl: libcurl/7.55.1 OpenSSL/1.1.0f zlib/1.2.11 libpsl/0.18.0 (+libicu/59.1) libssh2/1.8.0 nghttp2/1.23.1 (compiled with 7.55.1)
SQLite: 3.20.1 (compiled with 3.20.1)
libxml2: compiled with 2.9.5

Not too useful stacktrace, unfortunately:

                Stack trace of thread 9081:
                #0  0x00007f397256a8a0 raise (libc.so.6)
                #1  0x00007f397256bf09 abort (libc.so.6)
                #2  0x00007f3972b92d77 _ZN9__gnu_cxx27__verbose_terminate_handlerEv (libstdc++.so.6)
                #3  0x00007f3972b908e6 _ZN10__cxxabiv111__terminateEPFvvE (libstdc++.so.6)
                #4  0x00007f3972b90933 _ZSt9terminatev (libstdc++.so.6)
                #5  0x00007f3972bbdaa2 execute_native_thread_routine (libstdc++.so.6)
                #6  0x00007f3973e1008a start_thread (libpthread.so.0)
                #7  0x00007f397262c1bf __clone (libc.so.6)
                
                Stack trace of thread 7696:
                #0  0x00007f3972621cbb __poll (libc.so.6)
                #1  0x00007f3972ecfa4f _nc_timed_wait (libncursesw.so.6)
                #2  0x00007f3972ea9c9f _nc_wgetch (libncursesw.so.6)
                #3  0x00007f3972ec180b wget_wch (libncursesw.so.6)
                #4  0x00007f3973306d67 stfl_form_run (libstfl.so.0)
                #5  0x00007f3973305a0d stfl_run (libstfl.so.0)
                #6  0x0000555629b7c020 n/a (newsboat)
                #7  0x0000555629a45f31 n/a (newsboat)
                #8  0x0000555629a699bf n/a (newsboat)
                #9  0x0000555629a07f59 n/a (newsboat)
                #10 0x00007f3972556f6a __libc_start_main (libc.so.6)
                #11 0x0000555629a08bca n/a (newsboat)
                
                Stack trace of thread 7719:
                #0  0x00007f39725fa190 __nanosleep (libc.so.6)
                #1  0x00007f39725fa09a sleep (libc.so.6)
                #2  0x0000555629a714b6 n/a (newsboat)
                #3  0x00007f3972bbda6f execute_native_thread_routine (libstdc++.so.6)
                #4  0x00007f3973e1008a start_thread (libpthread.so.0)
                #5  0x00007f397262c1bf __clone (libc.so.6)

Is there a way I can provide more useful information about this? I can't reproduce it, but it happens once all couple of days.

Error: an instance of newsboat is already running (PID: 0)

I get this error trying to use the lovely newsboat as a normal user: Starting newsboat 2.10.1...
Error: an instance of newsboat is already running (PID: 0). It seems to run just fine with sudo.

Version: newsboat 2.10.1 - https://newsboat.org/
Copyright (C) 2006-2015 Andreas Krennmair
Copyright (C) 2015-2017 Alexander Batischev
Copyright (C) 2006-2017 Newsbeuter contributors
Copyright (C) 2017 Newsboat contributors

newsboat is free software and licensed under the MIT/X Consortium License.
Type `newsboat -vv' for more information.

newsboat 2.10.1
System: Linux 4.13.11-1-ARCH (x86_64)
Compiler: g++ 7.2.0
ncurses: ncurses 6.0.20170902 (compiled with 6.0)
libcurl: libcurl/7.56.1 OpenSSL/1.1.0g zlib/1.2.11 libpsl/0.18.0 (+libicu/59.1) libssh2/1.8.0 nghttp2/1.23.1 (compiled with 7.56.0)
SQLite: 3.21.0 (compiled with 3.20.1)
libxml2: compiled with 2.9.5

Must redraw screen to fix highlighting

Newsboat version: newsboat 2.10.1

Steps to reproduce the issue:

  1. Set highlight article "^Title: .*$" default default bold

  2. Skim through unread articles in article view using next-unread

  3. Watch as Title: Archiving repositories changes to Title: Search repositories by license

This is fixed by redrawing the screen with ^L (i.e., Title: Search repositories by license changes to Title: Search repositories by license

Use override specifier

override specifier is used to mark virtual functions that override virtual functions of parent class. It makes the intent behind the code clearer both to human readers and the compiler; the latter can issue warnings if a non-virtual function is overriden, or if the function we're trying to override doesn't exist. These static checks are useful during refactorings.

This issue is a good pick for a newcomer because on the one hand, it doesn't require any knowledge of Newsboat's code, and on the other, it will take the implementer through all our class hierarchies, effectively teaching the architecture of Newsboat.

Mark feed unread command

Great work here!

One thing I didn't find out anywhere and I was wondering why is: ability to mark a feed back as unread, is it possible? In my flow, it is the simplest way to keep track of feeds that I want to read in the future.

colour config from newsbeuter is not recognised

Hi & thanks for the code

My minor issue is that the color config from my ~/.newsbeuter/config migrated to ~/.newsboat/config is not recognised, the macros etc defined in config all work well, only the colour issue, sadly i have had to add newsbeuter to pacman ignore until i figure it out

please advise.
regards
cirrus

Disable macro prefix

Forgive me if I'm wrong, but it seems there's currently no way to change the macro prefix. Particularly it'd be nice if I could configure for no prefix.

Make it easier to link to certain part of the docs

As Lyse on IRC points out, we already have HTML anchors on tables, but don't display them, hence it's hard to link to tables. Furthermore, our table of config commands is rather long and detailed, so it'd be nice to be able to link to specific row in it.

This might well be trivial, but requires some knowledge (or willingness and energy to learn) AsciiDoc.

Fails to start after migration if XDG_DATA_HOME points to XDG config dir

Newsboat version (copy from newsboat -v): 2.10.1-r2.10.1-18-gcee08

Steps to reproduce the issue:

  1. Ensure ~/.config/newsboat doesn't exist.

  2. export XDG_DATA_HOME=$HOME/.config ($HOME/.config is default XDG config directory.)

  3. Create Newsbeuter configuration in ~/.newsbeuter.

  4. Run Newsboat, observe that it successfully migrates Newsbeuter files and starts when Enter is pressed.

  5. Quit Newsboat.

  6. Start it again.

Expected behaviour:

Newsboat starts with configuration from ~/.newsboat.

Actual behaviour:

Newsboat tries to load configuration from ~/.config/newsboat and fails. (That directory exists but empty.)

Remove build-time dependency on Perl

I once heard a complaint about Perl being painful for cross-compilers, and I also think it's a rather heavy-weight dependency, so I'm going to rewrite a few Perl scripts we have in POSIX shell.

  • Rewrite txt2h.pl
  • Rewrite doc/gen-example-config.pl
    • Make that script part of doc target
    • Remove doc/example-config from the repo
  • Rewrite doc/generate.pl
  • Rewrite doc/generate2.pl
    • Look into merging this into the previous one

I'm working on this.

Memory leak on auto-reload

newsboat 2.10.1:

Steps to reproduce the issue:

  1. run "newsboat -r"

or

  1. configure "auto-reload yes"

  2. run "newsboat"

The result is very high memory consumption, which doesn't occur without auto-reload.

With auto-reload after first reload run:
1935908K

Without auto-reload, after first manual reload:
590344K

Running "newsboat -x reload" does not show increased memory consumption.

Total memory consumption as reported by pmap
OS: Debian 9.2
498 feeds

highlights feedlist overriden after load

Newsboat 2.10.1:

highlight feedlist is being overridden by color list... settings after the feedlist finishes loading.

Steps to reproduce the issue:

The following two lines in the config file will result on color242 showing on program start on unread feeds, but being replaced by color137 once the feeds finish loading:

feedlist-format "%3i %n %9u %-10T %t"

color listnormal_unread color137 default
highlight feedlist ".+ N .+" color242 default

Escaped tabs do not display properly

Newsboat version: newsboat 2.10.1

Steps to reproduce the issue:

  1. Set feedlist-format "%U \t %t", or replace \t with a literal tab character.

  2. Open to feed list and see 1 � xkcd, etc. for each feed item

This bug exists on macOS in Terminal.app and in iTerm.app (also tested the issue in a Debian virtual machine, found the bug also exists in at least a tty running newsbeuter 2.9.)

Fails to Authenticate with TinyTinyRSS

Newsboat version (copy from newsboat -v):

newsboat 2.10.1 - https://newsboat.org/
Copyright (C) 2006-2015 Andreas Krennmair
Copyright (C) 2015-2017 Alexander Batischev
Copyright (C) 2006-2017 Newsbeuter contributors
Copyright (C) 2017 Newsboat contributors

newsboat is free software and licensed under the MIT/X Consortium License.
Type `newsboat -vv' for more information.

newsboat 2.10.1
System: Linux 4.13.9-1-ARCH (x86_64)
Compiler: g++ 7.2.0
ncurses: ncurses 6.0.20170902 (compiled with 6.0)
libcurl: libcurl/7.56.0 OpenSSL/1.1.0f zlib/1.2.11 libpsl/0.18.0 (+libicu/59.1) libssh2/1.8.0 nghttp2/1.23.1 (compiled with 7.56.0)
SQLite: 3.20.1 (compiled with 3.20.1)
libxml2: compiled with 2.9.5
Steps to reproduce the issue:
  1. Added to .newsboat/config:
# Tiny Tiney RSS Config
# ---------------------

ssl-verifyhost      "no"
urls-source         "ttrss"
ttrss-url           "https://TTRSS_URL"
ttrss-login         "`lpass show --username ttrss_reader`"
#ttrss-password      "`lpass show --password ttrss_reader`"
ttrss-passwordeval      "lpass show --password ttrss_reader"
ttrss-flag-star     "s"
ttrss-flag-publish  "p"
  1. Run: newsboat

Other info you think is relevant:

Encountering the issue on two different Arch Linux systems.

Newsboat returns to the console:

Starting newsboat 2.10.1...
Loading configuration...done.
Opening cache...done.
Loading URLs from Tiny Tiny RSS...Authentication failed.

Used newsboat -l 6 -d debug.log to get errors. Last 4 lines of the log show:

[2017-10-27 22:22:39] DEBUG: cache::clean_old_articles, days == 0, not cleaning up anything
[2017-10-27 22:22:39] DEBUG: utils::retrieve_url(https://TTRSS_URL/api/)[Чײ�V]: 
[2017-10-27 22:22:39] DEBUG: ttrss_api::run_op(login,...): post={"op":"login","sid":"","password":"PASSWORD","user":"USERNAME"} reply = 
[2017-10-27 22:22:39] ERROR: ttrss_api::run_op: reply failed to parse: 
[2017-10-27 22:22:39] DEBUG: utils::remove_fs_lock: removed lockfile /home/kamikazejoe/.newsboat/cache.db.lock

Note the [Чײ�V]: at the end of the second line.

The same configuration works fine on the last version of Newsbeuter. It looks like the utils::retrieve_url line is getting cut off.

Equivalent Newsbeuter debug lines below:

[2017-10-28 14:32:46] DEBUG: cache::clean_old_articles, days == 0, not cleaning up anything
[2017-10-28 14:32:48] DEBUG: utils::retrieve_url(https://TTRSS_URL/api/)[{"op":"login","sid":"","password":"PASSWORD","user":"USERNAME"}]: {"seq":0,"status":0,"content":{"session_id":"c82ca9da8eac82b3834909ada3da90ca","api_level":14}}
[2017-10-28 14:32:48] DEBUG: ttrss_api::run_op(login,...): post={"op":"login","sid":"","password":"PASSWORD","user":"USERNAME"} reply = {"seq":0,"status":0,"content":{"session_id":"c82ca9da8eac82b3834909ada3da90ca","api_level":14}}
[2017-10-28 14:32:48] DEBUG: ttrss_api::retrieve_sid: sid = 'c82ca9da8eac82b3834909ada3da90ca'

Issues with syncing with TinyTinyRSS

While I love Newsb{oat,euter}, syncing updates with my TinyTinyRSS server always has been a lot of pain. A quick overview of what I've noticed so far, in the past few months to years (note that I'm often in a train, i.e. on an unstable connection):

  • Rendering issues (random chars, articles disappearing, ...) when viewing an article while updating (though this kind of thing has gotten better recently-ish)
  • Crashes (C++ exceptions) when doing the same (dito)
  • A lot of HTTP requests being done while syncing, and syncing being very slow on a bad network
  • Articles getting marked as unread again after having read them
  • The most frustrating one: Articles randomly getting marked as read again after "peeking" at them and marking them as unread with N.

The first two things have gotten better, and I realize I should submit a better bug report when I see them again - I know this isn't 😉

As for the rest - I wonder if this just happens because of newsbeuter's sync "model"? I guess when I do N, it immediately sends a request to the server to mark it as unread again, and if that request gets lost, what I mentioned happens?

This has made me wonder: Maybe it'd be better to have some kind of explicit syncing, similar to what e.g. offlineimap does for mails? In other words, I could hit some key to update, then everything happens locally, and when I hit that key again, it tries to synchronize whatever has happened to the server?

If this is infeasible in Newsbeuter itself, I was wondering whether you think it'd make sense to write this as a separate utility, i.e. something that talks to TinyTinyRSS and updates newsbeuter's local files somehow.

I know this isn't really an actionable issue, but I'd love to hear your thoughts on it!

without a cookies-file newsblur does weird things

Newsboat version (copy from newsboat -v):
newsboat 2.10.1-r2.10.1-19-gbbfee
System: OpenBSD 6.2 (amd64)
Compiler: g++ 4.9.4
ncurses: ncurses 5.7.20081102 (compiled with 5.7)
libcurl: libcurl/7.55.1 LibreSSL/2.6.1 zlib/1.2.3 nghttp2/1.26.0 (compiled with 7.55.1)
SQLite: 3.20.1 (compiled with 3.20.1)
libxml2: compiled with 2.9.5

Steps to reproduce the issue:

  1. Add newsblur as a newssource
urls-source "newsblur"
newsblur-login "user"
newsblur-passwordeval "gpg2 -q --for-your-eyes-only --no-tty -d /home/user/.passwd/newsblur.passwd.gpg"

  1. Add a cookies-cache that doesn't exist
    cookie-cache /home/user/.foobar/cookies.txt
  2. start newsboat

**Other info you think is relevant
newsboat loads feeds from newsblur but not mine and shows tags that I do not have.

**Expected behavior
Do not start and complain about the non-existent cookies-cache

terminate called after throwing an instance of 'newsbeuter::exception' what(): No such file or directory

Newsboat version (copy from newsboat -v): 2.10.1

Steps to reproduce the issue:

  1. error-log "/path/to-nonexistent-directory/error.log
  2. Start Newsboat.

Newsboat crashes with a message: terminate called after throwing an instance of 'newsbeuter::exception' what(): No such file or directory

Other info you think is relevant:

Originally reported on the IRC channel on October 18th, 2017. Recently appeared here on the issue tracker. As @noctux reported on IRC, Newsboat tries to write an error to the error-log, but since the file cannot be opened, the write throws, and since it's newsbeuter::exception and not newsbeuter::configexception, it isn't caught in controller, which leads to terminate() being called.

This is an edge case all right, but people are bound to run into it quite often if they migrate from Newsbeuter and delete their ~/.newsbeuter directories without checking if Newsboat works (or maybe they just mv ~/.newsbeuter ~/.newsboat.)

Pass all information about article to bookmark plugin

Currently, in order to send the podcast URL to a bookmark plugin, you have to first enqueue the article and then cat the queue file inside the bookmark script. This is a clunky work-around. Being able to directly provide the podcast url to the plugin during the bookmarking process would be extremely helpful.

The ability to pass all information about an article (feed_title, title, author, link, podcast link, date, tags, and the body of the article) to the plugin would also be helpful. For example a podcast could then be downloaded, organized (Podcast/Feed_title/title.mp3), tagged (Artist = author, Album = feed_title, date = date, genre = tag, description = body), and then added to a playlist or scanned into a music collection all through the bookmark plugin. The same could be done for an article which could be downloaded as a pdf, organized (Articles/Feed_title/title - author (date).pdf) and then automatically scanned and tagged by a library manager like Calibre and subsequently sent to a reading device. Furthermore, having access to the body of the article would simplify sending it to a Text-to-speech program, which is handy if you want to have your news read to you while you do something else (This is technically already possible using the pipe-to command, although you have to use sed to strip away some of the superfluous text, such as the links sections).

Guide users to choosing between dotdir and XDG

Newsboat version: 2.10 e171c84

Steps to reproduce the issue:

  1. Do not create a configuration.

  2. Run newsboat.

Expected output: Newsboat tells me that I don't have the urls configured and suggests creating either ~/.newsboat/urls or ~/.config/newsboat/urls.

Actual output: Newsboat only tells me about ~/.newsboat/urls.

Open in browser and mark as read not working

Newsboat version (copy from newsboat -v): newsboat 2.10.1

Steps to reproduce the issue:

  1. Add openbrowser-and-mark-jumps-to-next-unread yes to the config file.

  2. Open a feed list, and open-in-browser from the articles list.

  3. The article is open in the browser but it is not marked as read

Other info you think is relevant: The way I see it, what this means is that the article should be open, marked as read and the highlight row should jump to the next unread article.

Add CLI argument to set history.cmdline, history.search and pb-lock.pid

Newsboat version (copy from newsboat -v): 2.10.1

Newsboat got --cache-file, --config-file and --url-file options, which allow the user to run multiple copies of Newsboat with different settings. But as this post on Newsbeuter mailing list mentions, there's no way to set paths to history.cmdline, history.search and pb-lock.pid files.

To make it possible to have completely independent profiles, we should have such options.

it might also make sense to add --queue-file to Newsboat.

Fails to build on armhf in filter/Scanner.cpp

I'm trying to build newsboat r2.10.1 as a snap. It builds fine for i386 and amd64 but not armhf.

Build logs are available on launchpad https://launchpad.net/~build.snapcraft.io/+snap/4dacae8ecd31a1fcb3ab170cd9e62e17-xenial

Specifically this one for armhf:- https://launchpadlibrarian.net/344882746/buildlog_snap_ubuntu_xenial_armhf_4dacae8ecd31a1fcb3ab170cd9e62e17-xenial_BUILDING.txt.gz

The actual error is:-

g++ -std=c++11 -ggdb -Iinclude -Istfl -Ifilter -I. -Irss -Werror -Wall -Wextra -Wunreachable-code -DLOCALEDIR=\"/usr/local/share/locale\" -DGIT_HASH=\"r2.10.1\" -I/usr/include/libxml2 -I/usr/include/json-c -D_GNU_SOURCE -I/usr/include/ncursesw -DHAVE_OPENSSL=1 -o src/strprintf.o -c src/strprintf.cpp
g++ -std=c++11 -ggdb -Iinclude -Istfl -Ifilter -I. -Irss -Werror -Wall -Wextra -Wunreachable-code -DLOCALEDIR=\"/usr/local/share/locale\" -DGIT_HASH=\"r2.10.1\" -I/usr/include/libxml2 -I/usr/include/json-c -D_GNU_SOURCE -I/usr/include/ncursesw -DHAVE_OPENSSL=1 -o filter/Scanner.o -c filter/Scanner.cpp
filter/Scanner.cpp: In member function ‘Token* Scanner::NextToken()’:
filter/Scanner.cpp:588:12: error: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
            ^
filter/Scanner.cpp:588:26: error: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                          ^
filter/Scanner.cpp:588:42: error: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                                          ^
filter/Scanner.cpp:588:56: error: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                                                        ^
filter/Scanner.cpp:588:86: error: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                                                                                      ^
filter/Scanner.cpp:588:100: error: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                                                                                                    ^

The configuration / build setup can be seen in the snapcraft yaml in the snapcrafters repo at https://github.com/snapcrafters/newsboat/blob/master/snap/snapcraft.yaml

Has anyone successfully built 2.10.1 on armhf yet? Something specific to the way I'm building it, or is it known broken?

Switch to CMake

Newsboat is currently built using a handwritten Makefile with some help from a shell script that finds paths to dependencies. There are some problems with this approach:

  • manual tracking of dependencies between files, i.e. we have to tell make what to rebuild when a file changes. We partially automated that tracking but developers have to remember to re-run a special command from time to time;

  • bad support from tools. This is related to the previous item, but this time the problem is a bit different: IDEs can't understand how our code hangs together. To work on Newsboat in QtCreator, one has to import all the .cpp and .h files, then re-create what our Makefiles already do using QMake.

    CLion, a C++ IDE from JetBrains, also can't automatically import Newsboat. This is actually my original motivation to look into CMake, which seem to be widely supported by IDEs;

  • duplication of effort in finding the libraries. Some platforms and libraries have idiosyncrasies, which we have to work around in config.sh. This work is better be done in something popular and useful to everyone, not just us;

  • no universal interface. There are some conventions on how to name targets and what environment variables to heed, but overall Makefiles can behave any way they want. This leads to inconveniences for some party or another; e.g. Newsbeuter Makefile always enables debugging because it's useful to developers, but distros have to strip the parameter out.

CMake tracks the deps automatically, is importable to some IDEs, bundles functions that find some libraries, and enforces some structure.

I tried porting Newsboat to CMake; you can find the code in feature/build-with-cmake branch. Some problems I hit upon:

  • CMake only learned to find ncursesw in 3.10, which isn't even released yet;

  • if I try and copy the upstream FindCurses.cmake into our repo, I have to pull in a handful of support modules, and they require newer CMake than the one we have on Travis. I'm uncomfortable upgrading CMake on Travis because it runs recentish LTS Ubuntu and I view it as an example of what a reasonable user might still have running on their computer;

  • CMake uses its own complicated language that, despite its specialization, doesn't add much clarity to configs.

As it stands, I don't think CMake is a good fit for Newsboat yet, and I will lay this aside for now.

Query feeds can't match on hidden tags

akrennmair/newsbeuter#58 made hidden tags hide the feeds from feedlist. Then docs were added saying that the only way to get articles from such a hidden feed is to use a query feed, but no example of a query feed was given.

I got an email from a user just now who tried to do something like this:

https://example.com/feed.rss "!tag"
"query:Hidden articles:tags # \"!tag\""

This didn't work because hidden tags are excluded from tags. To make it work, the feed has to be tagged with a non-hidden tag, which is then used in the query:

https://example.com/feed.rss "!tag" "hidden"
"query:Hidden articles:tags # \"hidden\""

I see two possible solutions:

  1. update the docs to show a complete example like the one above. This is easy for me, but users will need an additional tag.
  2. change the code to allow matching on hidden tags. Need to check if this won't break something. (Since it doesn't work this way at the moment, we can be sure no user relies on this, but maybe Newsboat depends on this fact internally.)

Multiple newsbeuter references

Newsboat version 2.10.1:

The name "newsbeuter" appears on the main feed screen and on the gnome notifications when new feeds are added. Shouldn't the name newsboat be used instead?

Persistent article-list filters

Filters are one of the great features of newsboat, however they only apply to the current article-list. For example, if I filter an article-list to only display items from today, the filter is cleared when I move on to the next article-list. It would be helpful if these filters could be set once and persist as I browse different article-lists, only resetting when I clear the filter manually. In my use case, this would allow me to eliminate certain query feeds based on date.

Fork description

It is mentioned that newsboat is a fork of newsbeuter. But there's no mention of why it is forked and what is changed in readme.md or newsboat.org. No need to have full list of changes, but at least create an entry in readme for fundamental differences.

As newsbeuter user, I am interested in this product, but I have no idea what to expect from it and I believe that some people who discovered this project have same feeling about it.

Enable set browser macros in URL view

First of all, Congratulations! I'm so excited to see that newsbeuter was finally forked for active development. This continues to be one of my favourite applications, looking forward to the improvements that come with newsboat.

One improvement that would be helpful is enabling macros commands in the URL view. Currently, the URL view only supports opening links in the default browser by pressing return, but enabling the macros commands could eliminate a step for viewing some links. For example, if I'm reading an article with a youtube link, I'd like to be able to open the link directly in mpv, or if I'm reading an article with an image link, I'd like to be able to open the link directly in an image viewer.

Better support for Vim-like key bindings

I prefer to use vim-style keybindings in most programs. One thing that I find missing from newsboat is fast navigation using g/G (go to first/last item in list) and ^d/^u (scroll half a page down/up). Would it be possible to add actions that I could bind to those keys?

Implement OAuth authorization for Inoreader

Inoreader support (#22) uses ClientLogin for user authentication, but Inoreader developers themselves point out that OAuth should be preferred. Newsboat also needs OAuth for other remote APIs, so Inoreader might well become an API that leads the way.

Since we're probably going to have more OAuth APIs, I don't mind adding a dependency on a library that implements OAuth-specific tasks. I looked at liboauthcpp, but it only supports OAuth 1.0a (Inoreader uses 2.0). There are a few others that require Qt, and that seems to be it. A bit more time spent on search won't hurt.

text-width does not wrap long URLs and links

Newsboat version (copy from newsboat -v): newsboat 2.10.1-r2.10.1-28-gad51

Steps to reproduce the issue:

  1. Set text-width to 80

  2. Open an article with a URL or link longer than 80 characters

Missing installation tips for cygwin

I spent some time trying to get this working on cygwin today. I couldn't get stfl to build with gcc. Anyone know the steps to get newsboat working on cygwin?, and can we get the instructions/tips added to a readme in the repo in the interim. Might be better than waiting for the build code to be updating to accomodate cygwin. Much appreciated!

FTBFS with -Werror

Newsboat version (copy from newsboat -v):
2.10.1 release tarball
Steps to reproduce the issue:

  1. unpack tarball on aarch64 on Guix

  2. (skip ./configure) run 'make' with prefix=custom_dir

filter/Scanner.cpp: In member function ?Token* Scanner::NextToken()?:
filter/Scanner.cpp:588:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
            ^
filter/Scanner.cpp:588:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                          ^
filter/Scanner.cpp:588:42: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                                          ^
filter/Scanner.cpp:588:56: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                                                        ^
filter/Scanner.cpp:588:86: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                                                                                      ^
filter/Scanner.cpp:588:100: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                                                                                                    ^
filter/Scanner.cpp:592:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if (ch <= L'!' || (ch >= L'#' && ch <= 65535)) {AddCh(); goto case_4;}
           ^
filter/Scanner.cpp:592:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if (ch <= L'!' || (ch >= L'#' && ch <= 65535)) {AddCh(); goto case_4;}
                          ^
filter/Scanner.cpp:601:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_6;}
            ^
filter/Scanner.cpp:601:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_6;}
                          ^
filter/Scanner.cpp:605:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_8;}
            ^
filter/Scanner.cpp:605:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_8;}
                          ^
filter/Scanner.cpp:610:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_8;}
            ^
filter/Scanner.cpp:610:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_8;}
                          ^
filter/Scanner.cpp:615:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_9;}
            ^
filter/Scanner.cpp:615:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_9;}
                          ^
filter/Scanner.cpp:620:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
            ^
filter/Scanner.cpp:620:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                          ^
filter/Scanner.cpp:620:42: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                                          ^
filter/Scanner.cpp:620:56: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                                                        ^
filter/Scanner.cpp:620:86: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                                                                                      ^
filter/Scanner.cpp:620:100: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if ((ch >= L'-' && ch <= L'.') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_3;}
                                                                                                    ^
filter/Scanner.cpp:621:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    else if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_6;}
                 ^
filter/Scanner.cpp:621:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    else if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_6;}
                               ^
cc1plus: all warnings being treated as errors
make: *** [Makefile:112: filter/Scanner.o] Error 1
make: *** Waiting for unfinished jobs....
phase `build' failed after 14.8 seconds

Other info you think is relevant:

When I removed '-Werror ' from Makefile:21 (from WARNFLAGS) then newsboat compiled without any problems. Adding '-Wno-error' to the WARNFLAGS also allowed it to compile, but it supressed all the warnings, which is undesirable. '-Wno-sign-compare' also worked.

Segfault in newsbeuter::formaction::get_form

I was trying to reproduce #17, but then got a segfault when viewing an article and then exiting again.

Stack:

#1  std::shared_ptr<newsbeuter::stfl::form>::shared_ptr (this=this@entry=0x7f236c96d550) at /usr/include/c++/7.2.0/bits/shared_ptr.h:119
#2  newsbeuter::formaction::get_form (this=0x0) at src/formaction.cpp:47
#3  0x000055a0a2e9b15f in newsbeuter::view::set_status_unlocked (this=this@entry=0x7ffe2641bac0, msg="(97/185) Loading http://feeds.feedburner.com/PythonInsider#81...") at src/view.cpp:129
#4  0x000055a0a2e9b355 in newsbeuter::view::set_status (this=this@entry=0x7ffe2641bac0, msg="(97/185) Loading http://feeds.feedburner.com/PythonInsider#81...") at src/view.cpp:141
#5  0x000055a0a2eb65eb in newsbeuter::controller::reload (this=this@entry=0x7ffe2641bc20, pos=pos@entry=96, max=max@entry=185, unattended=unattended@entry=false, easyhandle=easyhandle@entry=0x7f236c96d9d8) at src/controller.cpp:904
#6  0x000055a0a2ec081e in newsbeuter::controller::reload_range (this=this@entry=0x7ffe2641bc20, start=start@entry=0, end=end@entry=184, size=size@entry=185, unattended=unattended@entry=false) at src/controller.cpp:1021
#7  0x000055a0a2ec0ba9 in newsbeuter::controller::reload_all (this=0x7ffe2641bc20, unattended=unattended@entry=false) at src/controller.cpp:1053
#8  0x000055a0a2ed6df8 in newsbeuter::downloadthread::operator() (this=0x7f2368018288) at src/downloadthread.cpp:23
#9  0x000055a0a2ec5ca1 in std::__invoke_impl<void, newsbeuter::downloadthread> (__f=...) at /usr/include/c++/7.2.0/bits/invoke.h:60
#10 std::__invoke<newsbeuter::downloadthread> (__fn=...) at /usr/include/c++/7.2.0/bits/invoke.h:95
#11 std::thread::_Invoker<std::tuple<newsbeuter::downloadthread> >::_M_invoke<0ul> (this=<optimized out>) at /usr/include/c++/7.2.0/thread:234
#12 std::thread::_Invoker<std::tuple<newsbeuter::downloadthread> >::operator() (this=<optimized out>) at /usr/include/c++/7.2.0/thread:243
#13 std::thread::_State_impl<std::thread::_Invoker<std::tuple<newsbeuter::downloadthread> > >::_M_run (this=<optimized out>) at /usr/include/c++/7.2.0/thread:186
#14 0x00007f2372842a6f in std::execute_native_thread_routine (__p=0x7f2368018280) at /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:83
#15 0x00007f2373a9508a in start_thread () from /usr/lib/libpthread.so.0
#16 0x00007f23722b11bf in clone () from /usr/lib/libc.so.6

thread apply all bt full (huge): http://paste.the-compiler.org/view/raw/f4dfa837

last few lines of the log:

[2017-10-10 09:32:09] DEBUG: listformatter::add_line: `<unread>  10 N     (2/150) blogs - ddeimeke</>'
[2017-10-10 09:32:09] DEBUG: listformatter::add_line: `<unread>  28 N     (1/405) blogs - PID EINS!</>'
[2017-10-10 09:32:09] DEBUG: listformatter::add_line: `<unread>  34 N     (2/183) blogs - scratchbook</>'
[2017-10-10 09:32:09] DEBUG: listformatter::add_line: `<unread> 129 N    (34/200) qutebrowser - Archlinux Qt packages</>'
[2017-10-10 09:32:09] DEBUG: listformatter::add_line: `<unread> 130 N     (1/201) qutebrowser crashreports</>'
[2017-10-10 09:32:09] DEBUG: rss_feed: clearing items
[2017-10-10 09:32:09] DEBUG: rss_feed: clearing items
[2017-10-10 09:32:09] INFO: scope_measure: function `matcher::matches' took 0.000003 s
[2017-10-10 09:32:09] INFO: scope_measure: function `matcher::matches' took 0.000002 s
[2017-10-10 09:32:09] INFO: scope_measure: function `matcher::matches' took 0.000001 s
[2017-10-10 09:32:09] INFO: scope_measure: function `matcher::matches' took 0.000001 s
[2017-10-10 09:32:09] INFO: scope_measure: function `matcher::matches' took 0.000002 s
[2017-10-10 09:32:09] INFO: scope_measure: function `matcher::matches' took 0.000000 s
[2017-10-10 09:32:09] INFO: scope_measure: function `matcher::matches' took 0.000002 s
[2017-10-10 09:32:09] DEBUG: controller::reload_range: reloading feed #96
[2017-10-10 09:32:09] DEBUG: controller::reload: pos = 96 max = 185
[2017-10-10 09:32:09] INFO: scope_measure: function `matcher::matches' took 0.000002 s
[2017-10-10 09:32:09] INFO: scope_measure: function `matcher::matches' took 0.000005 s
[...]
[2017-10-10 09:32:09] INFO: scope_measure: function `matcher::matches' took 0.000000 s
[2017-10-10 09:32:09] DEBUG: feedlist_formaction::mark_pos_if_visible: match, setting position to 1
[2017-10-10 09:32:09] INFO: scope_measure: function `feedlist_formaction::mark_pos_if_visible' took 0.004976 s
[2017-10-10 09:32:09] INFO: scope_measure: function `rss_feed::purge_deleted_items' took 0.000002 s

'o' followed rapidly by 'Up' mark all article of current feed read

Hello,

Newsboat version

newsboat 2.10.1 - https://newsboat.org/
Copyright (C) 2006-2015 Andreas Krennmair
Copyright (C) 2015-2017 Alexander Batischev
Copyright (C) 2006-2017 Newsbeuter contributors
Copyright (C) 2017 Newsboat contributors

newsboat is free software and licensed under the MIT/X Consortium License.
Type `newsboat -vv' for more information.

newsboat 2.10.1
System: Linux 4.12.14-gentoo (x86_64)
Compiler: g++ 5.4.0
ncurses: ncurses 6.0.20150808 (compiled with 6.0)
libcurl: libcurl/7.56.1 OpenSSL/1.0.2m zlib/1.2.11 (compiled with 7.55.1)
SQLite: 3.19.3 (compiled with 3.19.3)
libxml2: compiled with 2.9.4

Steps to reproduce the issue:

  • Enter a feed article list page, press 'o' to open it in browser then 'Up' (or 'Down' I suppose) to move the article focus rapidly.
  • All the articles will be marked as read.

Config file:

proxy-type socks4
proxy 127.0.0.1:9050
use-proxy yes

articlelist-format "%f %D %t"
feedlist-format "%n %10u %t"
auto-reload yes
reload-time 15
notify-beep yes

browser "jailed-firefox.sh %u"

Extract feed URLs from webpages

To add a feed URL to Newsboat's urls file, a user has to find that URL. Some sites display their feeds prominently by adding an RSS icon, but some don't. In that case, user has to take additional steps to find the link (like opening "Page Details" in Firefox and using "Feeds" tab there.)

Newsboat might make it easier by providing something like this:

  1. user presses a key, and an input field shows up;
  2. user enters page URL;
  3. Newsboat downloads the page and presents the user with a list of all feeds the page links to. (It gets that list by examining <link rel="alternate"> tags in the <head> of the page);
  4. user chooses a URL from the list, Newsboat adds it to the end of urls file, the dialog is closed;
  5. (optional) if user wants their urls file sorted some particular way, the user can press E (edit-urls operation; already exists) and edit their file to their taste.

@noctux already drafted an implementation of the third step as a standalone app (backup gist). He also points out that there ought to be something similar for remote APIs; in that regard, I mentioned my old Newsbeuter PR. But that's probably worthy of an issue of its own, if anyone's interested.

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.