New screenshots for homepage, updating all twitter links to x.com. Still need Android screenshot from S22.
123
README.md
|
@ -1,11 +1,11 @@
|
|||
# NewsBlur
|
||||
|
||||
* NewsBlur is a personal news reader bringing people together
|
||||
to talk about the world. A new sound of an old instrument.
|
||||
* [www.newsblur.com](http://www.newsblur.com).
|
||||
* Created by [Samuel Clay](http://www.samuelclay.com).
|
||||
* Twitter: [@samuelclay](http://twitter.com/samuelclay) and
|
||||
[@newsblur](http://twitter.com/newsblur).
|
||||
- NewsBlur is a personal news reader bringing people together
|
||||
to talk about the world. A new sound of an old instrument.
|
||||
- [www.newsblur.com](https://www.newsblur.com).
|
||||
- Created by [Samuel Clay](https://www.samuelclay.com).
|
||||
- X/Twitter: [@samuelclay](https://x.com/samuelclay) and
|
||||
[@newsblur](https://x.com/newsblur).
|
||||
|
||||
<a href="https://f-droid.org/repository/browse/?fdid=com.newsblur" target="_blank">
|
||||
<img src="https://f-droid.org/badge/get-it-on.png" alt="Get it on F-Droid" height="80"/></a>
|
||||
|
@ -16,46 +16,47 @@
|
|||
|
||||
## Features
|
||||
|
||||
1. Shows the original site (you have to see it to believe it).
|
||||
2. Hides stories you don't want to read based on tags, keywords, authors, etc.
|
||||
3. Highlights stories you want to read, based on the same criteria.
|
||||
1. Shows the original site (you have to see it to believe it).
|
||||
2. Hides stories you don't want to read based on tags, keywords, authors, etc.
|
||||
3. Highlights stories you want to read, based on the same criteria.
|
||||
|
||||
## Technologies
|
||||
|
||||
### Server-side
|
||||
|
||||
* [Python 3.7+](http://www.python.org): The language of choice.
|
||||
* [Django](http://www.djangoproject.com): Web framework written in Python, used
|
||||
to serve all pages.
|
||||
* [Celery](http://ask.github.com/celery) & [RabbitMQ](http://www.rabbitmq.com):
|
||||
Asynchronous queueing server, used to fetch and parse RSS feeds.
|
||||
* [MongoDB](http://www.mongodb.com), [Pymongo](https://pypi.python.org/pypi/pymongo), &
|
||||
[Mongoengine](http://www.github.com/hmarr/mongoengine): Non-relational database,
|
||||
used to store stories, read stories, feed/page fetch histories, and proxied sites.
|
||||
* [PostgreSQL](http://www.postgresql.com): Relational database, used to store feeds,
|
||||
subscriptions, and user accounts.
|
||||
* [Redis](http://redis.io): Programmer's database, used to assemble stories for the river, store story ids, manage feed fetching schedules, and the minuscule bit of caching that NewsBlur uses.
|
||||
* [Elasticsearch](http://elasticsearch.org): Search database, use for searching stories. Optional.
|
||||
- [Python 3.7+](http://www.python.org): The language of choice.
|
||||
- [Django](http://www.djangoproject.com): Web framework written in Python, used
|
||||
to serve all pages.
|
||||
- [Celery](http://ask.github.com/celery) & [RabbitMQ](http://www.rabbitmq.com):
|
||||
Asynchronous queueing server, used to fetch and parse RSS feeds.
|
||||
- [MongoDB](http://www.mongodb.com), [Pymongo](https://pypi.python.org/pypi/pymongo), &
|
||||
[Mongoengine](http://www.github.com/hmarr/mongoengine): Non-relational database,
|
||||
used to store stories, read stories, feed/page fetch histories, and proxied sites.
|
||||
- [PostgreSQL](http://www.postgresql.com): Relational database, used to store feeds,
|
||||
subscriptions, and user accounts.
|
||||
- [Redis](http://redis.io): Programmer's database, used to assemble stories for the river, store story ids, manage feed fetching schedules, and the minuscule bit of caching that NewsBlur uses.
|
||||
- [Elasticsearch](http://elasticsearch.org): Search database, use for searching stories. Optional.
|
||||
|
||||
### Client-side and design
|
||||
|
||||
* [jQuery](http://www.jquery.com): Cross-browser compliant JavaScript code. IE works without effort.
|
||||
* [Underscore.js](http://underscorejs.org/): Functional programming for JavaScript.
|
||||
Indispensable.
|
||||
* [Backbone.js](http://backbonejs.org/): Framework for the web app. Also indispensable.
|
||||
* Miscellaneous jQuery Plugins: Everything from resizable layouts, to progress
|
||||
bars, sortables, date handling, colors, corners, JSON, animations.
|
||||
[See the complete list](https://github.com/samuelclay/NewsBlur/tree/master/media/js).
|
||||
|
||||
- [jQuery](http://www.jquery.com): Cross-browser compliant JavaScript code. IE works without effort.
|
||||
- [Underscore.js](http://underscorejs.org/): Functional programming for JavaScript.
|
||||
Indispensable.
|
||||
- [Backbone.js](http://backbonejs.org/): Framework for the web app. Also indispensable.
|
||||
- Miscellaneous jQuery Plugins: Everything from resizable layouts, to progress
|
||||
bars, sortables, date handling, colors, corners, JSON, animations.
|
||||
[See the complete list](https://github.com/samuelclay/NewsBlur/tree/master/media/js).
|
||||
|
||||
### Prerequisites
|
||||
|
||||
* Docker
|
||||
* Docker-compose
|
||||
|
||||
## Installation Instructions
|
||||
1. Clone this repo
|
||||
2. Run `make nb` to build all of the NewsBlur containers. This will set up all necessary databases, front-end django apps, celery tasks, node apps, flask database monitor and metrics, nginx, and a haproxy load balancer.
|
||||
7. Navigate to:
|
||||
|
||||
1. Clone this repo
|
||||
2. Run `make nb` to build all of the NewsBlur containers. This will set up all necessary databases, front-end django apps, celery tasks, node apps, flask database monitor and metrics, nginx, and a haproxy load balancer.
|
||||
3. Navigate to:
|
||||
|
||||
https://localhost
|
||||
|
||||
|
@ -63,7 +64,7 @@
|
|||
|
||||
## Using a custom domain
|
||||
|
||||
1. Run the custom domain script
|
||||
1. Run the custom domain script
|
||||
|
||||
```
|
||||
bash ./utils/custom_domain.sh <domain name>
|
||||
|
@ -71,21 +72,21 @@
|
|||
|
||||
This script will do the following:
|
||||
|
||||
* Change `NEWSBLUR_URL` and `SESSION_COOKIE_DOMAIN` in `newsblur_web/docker_local_settings.py`
|
||||
* Change the domain in `config/fixtures/bootstrap.json`
|
||||
- Change `NEWSBLUR_URL` and `SESSION_COOKIE_DOMAIN` in `newsblur_web/docker_local_settings.py`
|
||||
- Change the domain in `config/fixtures/bootstrap.json`
|
||||
|
||||
You can also change domains: `bash ./utils/custom_domain.sh <old domain> <new domain>`
|
||||
You can also change domains: `bash ./utils/custom_domain.sh <old domain> <new domain>`
|
||||
|
||||
2. If you're using a custom subdomain, you'll also want to add it to `ALLOWED_SUBDOMAINS` in `apps/reader/views.py`
|
||||
2. If you're using a custom subdomain, you'll also want to add it to `ALLOWED_SUBDOMAINS` in `apps/reader/views.py`
|
||||
|
||||
3. A way to make sure you updated all the correct places:
|
||||
3. A way to make sure you updated all the correct places:
|
||||
|
||||
* Go to the website address in your browser
|
||||
* Open developer tools and look at the network tab
|
||||
* Try to login
|
||||
* Look again at the developer tools, there should be a POST call to /login
|
||||
* Observe the Response headers for that call
|
||||
* The value of the "set-cookie" header should contain a "Domain=" string
|
||||
- Go to the website address in your browser
|
||||
- Open developer tools and look at the network tab
|
||||
- Try to login
|
||||
- Look again at the developer tools, there should be a POST call to /login
|
||||
- Observe the Response headers for that call
|
||||
- The value of the "set-cookie" header should contain a "Domain=" string
|
||||
|
||||
If the string after `Domain=` is not the domain you are using to access the website, then your configuration still needs your custom domain.
|
||||
|
||||
|
@ -99,16 +100,17 @@ To make docker-compose work with an older database version, change the image ver
|
|||
|
||||
## Contribution Instructions
|
||||
|
||||
* Making Changes:
|
||||
* To apply changes to the Python or JavaScript code, use the `make` command.
|
||||
* To apply changes to the docker-compose.yml file, use the `make rebuild` command.
|
||||
* To apply changes to the docker/haproxy/haproxy.conf file, node packages, or any new database migrations you will need to use the `make nb` command.
|
||||
- Making Changes:
|
||||
|
||||
* Adding Python packages:
|
||||
Currently, the docker-compose.yml file uses the newsblur/newsblur_python3 image. It is built using the Dockerfile found in `docker/newsblur_base_image.Dockerfile`. Because of how the docker image is set up, you will need to create your own image and direct your docker-compose.yml file to use it. Please follow the following steps to do so.
|
||||
- To apply changes to the Python or JavaScript code, use the `make` command.
|
||||
- To apply changes to the docker-compose.yml file, use the `make rebuild` command.
|
||||
- To apply changes to the docker/haproxy/haproxy.conf file, node packages, or any new database migrations you will need to use the `make nb` command.
|
||||
|
||||
1. Add your new site-packages to config/requirements.txt.
|
||||
2. Add the following lines of code to your docker-compose.yml file to replace anywhere where it says `image: newsblur/newsblur_python3`
|
||||
- Adding Python packages:
|
||||
Currently, the docker-compose.yml file uses the newsblur/newsblur_python3 image. It is built using the Dockerfile found in `docker/newsblur_base_image.Dockerfile`. Because of how the docker image is set up, you will need to create your own image and direct your docker-compose.yml file to use it. Please follow the following steps to do so.
|
||||
|
||||
1. Add your new site-packages to config/requirements.txt.
|
||||
2. Add the following lines of code to your docker-compose.yml file to replace anywhere where it says `image: newsblur/newsblur_python3`
|
||||
|
||||
<code>
|
||||
build:
|
||||
|
@ -116,14 +118,15 @@ To make docker-compose work with an older database version, change the image ver
|
|||
dockerfile: docker/newsblur_base_image.Dockerfile
|
||||
</code>
|
||||
|
||||
3. Run the `make nb` command to rebuild your docker-compose containers
|
||||
3. Run the `make nb` command to rebuild your docker-compose containers
|
||||
|
||||
* Debugging Python
|
||||
* To debug your code, drop `import pdb; pdb.set_trace()` into the Python code where you would like to start debugging
|
||||
- Debugging Python
|
||||
|
||||
- To debug your code, drop `import pdb; pdb.set_trace()` into the Python code where you would like to start debugging
|
||||
and run `make` and then `make debug`.
|
||||
|
||||
* Using Django shell within Docker
|
||||
* Make sure your docker containers are up and run `make shell` to open
|
||||
- Using Django shell within Docker
|
||||
- Make sure your docker containers are up and run `make shell` to open
|
||||
the Django shell within the newsblur_web container.
|
||||
|
||||
### Running unit and integration tests
|
||||
|
@ -146,9 +149,9 @@ To run locust using docker, just run `make perf-docker` and navigate to http://1
|
|||
|
||||
## Author
|
||||
|
||||
* Created by [Samuel Clay](http://www.samuelclay.com).
|
||||
* Email address: <samuel@newsblur.com>
|
||||
* [@samuelclay](http://twitter.com/samuelclay) on Twitter.
|
||||
- Created by [Samuel Clay](https://www.samuelclay.com).
|
||||
- Email address: <samuel@newsblur.com>
|
||||
- [@samuelclay](https://x.com/samuelclay) on X/Twitter.
|
||||
|
||||
## License
|
||||
|
||||
|
|
34
apps/newsletters/amazon-ses-lambda.py
Normal file
|
@ -0,0 +1,34 @@
|
|||
import json
|
||||
import requests
|
||||
import boto3
|
||||
import email
|
||||
|
||||
|
||||
def lambda_handler(event, context):
|
||||
# Get the message ID for the email
|
||||
message_id = event["Records"][0]["ses"]["mail"]["messageId"]
|
||||
|
||||
# Retrieve the email content from S3 if configured to store
|
||||
s3_client = boto3.client("s3")
|
||||
bucket_name = "newsblur-email-logs"
|
||||
email_data = s3_client.get_object(Bucket=bucket_name, Key=message_id)
|
||||
raw_email = email_data["Body"].read().decode("utf-8")
|
||||
|
||||
# Parse the raw email
|
||||
parsed_email = email.message_from_string(raw_email)
|
||||
|
||||
# Prepare the payload for the webhook
|
||||
# Include original recipient
|
||||
payload = {
|
||||
"from": parsed_email["From"],
|
||||
"to": parsed_email["To"],
|
||||
"subject": parsed_email["Subject"],
|
||||
"body": parsed_email.get_payload(),
|
||||
"original_recipient": parsed_email["X-Original-Recipient"],
|
||||
}
|
||||
|
||||
# Send to webhook
|
||||
webhook_url = "https://push.newsblur.com/newsletters/receive/"
|
||||
response = requests.post(webhook_url, json=payload)
|
||||
|
||||
return {"statusCode": response.status_code, "body": json.dumps("Email forwarded to webhook")}
|
|
@ -169,7 +169,7 @@
|
|||
height: 300px;
|
||||
position: absolute;
|
||||
bottom: -350px;
|
||||
right: -40px;
|
||||
right: 0;
|
||||
border-radius: 2px;
|
||||
border-top-left-radius: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
|
@ -180,7 +180,7 @@
|
|||
height: 300px;
|
||||
position: absolute;
|
||||
bottom: -300px;
|
||||
right: 0;
|
||||
right: -80px;
|
||||
border-radius: 2px;
|
||||
margin-right: 100px;
|
||||
border-top-left-radius: 4px;
|
||||
|
|
BIN
media/img/iphone/iphone-16.png
Normal file
After Width: | Height: | Size: 1.2 MiB |
Before Width: | Height: | Size: 1 MiB |
Before Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 321 KiB |
BIN
media/img/welcome/welcome-android.png
Normal file
After Width: | Height: | Size: 1.6 MiB |
BIN
media/img/welcome/welcome-ios.png
Normal file
After Width: | Height: | Size: 1.3 MiB |
BIN
media/img/welcome/welcome-mac.png
Normal file
After Width: | Height: | Size: 1.5 MiB |
|
@ -2659,7 +2659,7 @@
|
|||
|
||||
send_story_to_twitter: function (story_id) {
|
||||
var story = this.model.get_story(story_id);
|
||||
var url = 'https://twitter.com/intent/tweet';
|
||||
var url = 'https://x.com/intent/post';
|
||||
var twitter_url = [
|
||||
url,
|
||||
'?text=',
|
||||
|
|
|
@ -281,11 +281,11 @@ _.extend(NEWSBLUR.ReaderTutorial.prototype, {
|
|||
$.make('div', { className: 'NB-page NB-page-5' }, [
|
||||
$.make('h4', 'Stay connected to NewsBlur on Twitter'),
|
||||
$.make('div', { className: 'NB-tutorial-twitter' }, [
|
||||
$.make('a', { className: 'NB-splash-link', href: 'http://twitter.com/samuelclay', target: '_blank' }, [
|
||||
$.make('a', { className: 'NB-splash-link', href: 'https://x.com/samuelclay', target: '_blank' }, [
|
||||
$.make('img', { src: NEWSBLUR.Globals.MEDIA_URL + '/img/static/Samuel%20Clay%20sq.jpg', style: 'border-color: #505050;' }),
|
||||
$.make('span', '@samuelclay')
|
||||
]),
|
||||
$.make('a', { className: 'NB-splash-link', href: 'http://twitter.com/newsblur', target: '_blank' }, [
|
||||
$.make('a', { className: 'NB-splash-link', href: 'http://x.com/newsblur', target: '_blank' }, [
|
||||
$.make('img', { src: NEWSBLUR.Globals.MEDIA_URL + '/img/logo_128.png' }),
|
||||
$.make('span', '@newsblur')
|
||||
])
|
||||
|
|
|
@ -67,7 +67,7 @@
|
|||
<h1><span class="error404">502</span> · NewsBlur is down</h1>
|
||||
<div class="description">
|
||||
<p>Please wait patiently while NewsBlur comes back.</p>
|
||||
<p><a href="http://twitter.com/newsblur">@newsblur on Twitter</a> may have more information.</p>
|
||||
<p><a href="https://x.com/newsblur">@newsblur on X/Twitter</a> may have more information.</p>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
|
|
|
@ -72,7 +72,7 @@ Content-Type: text/html
|
|||
<h1><span class="error404">502</span> · NewsBlur is down</h1>
|
||||
<div class="description">
|
||||
<p>Please wait patiently until NewsBlur comes back.</p>
|
||||
<p><a href="http://twitter.com/newsblur">@newsblur on Twitter</a> may have more information.</p>
|
||||
<p><a href="https://x.com/newsblur">@newsblur on X/Twitter</a> may have more information.</p>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
<li class="NB-splash-link NB-splash-link-api {% if page == "api" %}NB-active{% endif %}"><a href="{% url "api" %}">API</a></li>
|
||||
<li class="NB-splash-link NB-splash-link-ios {% if page == "ios" %}NB-active{% endif %}"><a href="{% url "ios-static" %}">iOS</a></li>
|
||||
<li class="NB-splash-link NB-splash-link-android {% if page == "android" %}NB-active{% endif %}"><a href="{% url "android-static" %}">Android</a></li>
|
||||
<li class="NB-splash-link NB-splash-link-github"><a href="http://github.com/samuelclay">GitHub</a></li>
|
||||
<li class="NB-splash-link NB-splash-link-github"><a href="https://github.com/samuelclay">GitHub</a></li>
|
||||
<li class="NB-splash-link NB-splash-link-discourse"><a href="https://forum.newsblur.com">Support</a></li>
|
||||
<li class="NB-splash-link NB-splash-link-blog"><a href="http://blog.newsblur.com">The Blog</a></li>
|
||||
<li class="NB-splash-link NB-splash-link-blog"><a href="https://blog.newsblur.com">The Blog</a></li>
|
||||
<li class="NB-splash-link NB-first NB-splash-link-facebook"><a href="https://facebook.com/newsblur">Facebook</a></li>
|
||||
<li class="NB-splash-link NB-first NB-splash-link-twitter"><a href="http://twitter.com/newsblur">@newsblur</a></li>
|
||||
<li class="NB-splash-link NB-first NB-splash-link-twitter"><a href="https://x.com/newsblur">@newsblur</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="NB-splash-link NB-splash-link-logo">
|
||||
|
|
|
@ -59,13 +59,13 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="NB-welcome-header-image NB-1 {% if not post_request %}NB-active{% endif %}">
|
||||
<img src="{{ MEDIA_URL }}img/welcome/header-web.png">
|
||||
<img src="{{ MEDIA_URL }}img/welcome/welcome-mac.png">
|
||||
</div>
|
||||
<div class="NB-welcome-header-image NB-2">
|
||||
<img src="{{ MEDIA_URL }}img/welcome/header-ios.png">
|
||||
<img src="{{ MEDIA_URL }}img/welcome/welcome-ios.png">
|
||||
</div>
|
||||
<div class="NB-welcome-header-image NB-3">
|
||||
<img src="{{ MEDIA_URL }}img/welcome/header-android.png">
|
||||
<img src="{{ MEDIA_URL }}img/welcome/welcome-android.png">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
@ -197,9 +197,9 @@
|
|||
<div class="NB-feature-text">Regularly used searches are conveniently given their own feeds</div>
|
||||
</div>
|
||||
<div class="NB-feature">
|
||||
<img src="{{ MEDIA_URL }}img/welcome/header-ios.png">
|
||||
<div class="NB-feature-caption">First-class iOS App</div>
|
||||
<div class="NB-feature-text">The NewsBlur iOS app is free and is jam-packed with features</div>
|
||||
<img src="{{ MEDIA_URL }}img/welcome/welcome-ios.png">
|
||||
<div class="NB-feature-caption">Native iOS/macOS Apps</div>
|
||||
<div class="NB-feature-text">The NewsBlur iOS and macOS apps are free and jam-packed with features</div>
|
||||
</div>
|
||||
<div class="NB-feature">
|
||||
<img src="{{ MEDIA_URL }}img/welcome/subfeature_3.png">
|
||||
|
@ -207,7 +207,7 @@
|
|||
<div class="NB-feature-text">The original story from truncated RSS feeds is seamlessly expanded</div>
|
||||
</div>
|
||||
<div class="NB-feature">
|
||||
<img src="{{ MEDIA_URL }}img/welcome/header-android.png">
|
||||
<img src="{{ MEDIA_URL }}img/welcome/welcome-android.png">
|
||||
<div class="NB-feature-caption">First-class Android App</div>
|
||||
<div class="NB-feature-text">The NewsBlur Android app is free and has it all</div>
|
||||
</div>
|
||||
|
@ -238,7 +238,7 @@
|
|||
</div>
|
||||
<div class="NB-feature">
|
||||
<img src="{{ MEDIA_URL }}img/welcome/subfeature_10.png">
|
||||
<div class="NB-feature-caption">Twitter & YouTube</div>
|
||||
<div class="NB-feature-caption">YouTube</div>
|
||||
<div class="NB-feature-text">Even sites that don't publish RSS feeds can be followed</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -362,11 +362,11 @@
|
|||
<div class="NB-welcome-footer-content NB-inner">
|
||||
<div class="NB-footer-icons">
|
||||
<a href="http://github.com/samuelclay" title="GitHub"><img src="{{ MEDIA_URL }}img/welcome/github_favicon.png"></a>
|
||||
<a href="http://twitter.com/newsblur" title="Twitter"><img src="{{ MEDIA_URL }}img/welcome/twitter_favicon.png"></a>
|
||||
<a href="http://x.com/newsblur" title="Twitter"><img src="{{ MEDIA_URL }}img/welcome/twitter_favicon.png"></a>
|
||||
</div>
|
||||
<a href="{% url "index" %}"><img src="{{ MEDIA_URL }}/img/logo_newsblur_blur.png" style="height: 32px;" class="NB-footer-logo" title="NewsBlur" alt="NewsBlur" /></a>
|
||||
is built in Cambridge, Massachusetts by
|
||||
<a href="http://twitter.com/samuelclay" class="NB-splash-link">
|
||||
is built in San Francisco and Western Massachusetts by
|
||||
<a href="http://x.com/samuelclay" class="NB-splash-link">
|
||||
<img src="{{ MEDIA_URL }}img/static/Samuel%20Clay.jpg" class="NB-twitter-avatar">
|
||||
@samuelclay
|
||||
</a>
|
||||
|
|
|
@ -1,158 +1,273 @@
|
|||
{% extends 'base.html' %}
|
||||
{% extends 'base.html' %} {% load utils_tags %} {% block bodyclass %}NB-static
|
||||
NB-static-about{% endblock %} {% block title %}About NewsBlur{% endblock %} {%
|
||||
block head %} {% endblock %} {% block content %}
|
||||
|
||||
{% load utils_tags %}
|
||||
<div class="NB-static-title">About NewsBlur</div>
|
||||
|
||||
{% block bodyclass %}NB-static NB-static-about{% endblock %}
|
||||
|
||||
{% block title %}About NewsBlur{% endblock %}
|
||||
|
||||
{% block head %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="NB-static-title">
|
||||
About NewsBlur
|
||||
</div>
|
||||
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title"><span class="NB-module-title-prefix">What:</span> NewsBlur's Motto</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-what">
|
||||
<li>NewsBlur is a personal news reader that brings people together to talk about the world.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title"><span class="NB-module-title-prefix">Why:</span> What makes NewsBlur better</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-why">
|
||||
<li><b>News reading</b>: With first-class iOS, Android, and web apps, NewsBlur is an easy and organized way to read the news wherever you are.</li>
|
||||
<li><b>Training</b>: By using NewsBlur's training filters, you can hide stories you don't want to see and highlight the stories that interest you. Teaching NewsBlur your preferences (or lack thereof) for certain blogs, authors, and topics cuts down on the noise and connects you with the news that interests you most.</li>
|
||||
<li><b>Social</b>: Sharing and talking about the news is not only fun, but allows you to break out of your routine and embrace the serendipity of your friends' tastes.</li>
|
||||
<li><b>Blurblogs</b>: Even if your friends aren't NewsBlur users, they can keep up with what you're reading through a public blog of all the stories you've shared, including your comments.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title"><span class="NB-module-title-prefix">Who:</span> A Labor of Love</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-who">
|
||||
<li>
|
||||
<img src="{{ MEDIA_URL }}img/static/Samuel Clay.jpg">
|
||||
<div class="NB-about-who-name">Samuel Clay</div>
|
||||
<div class="NB-acount-who-twitter"><a href="http://twitter.com/samuelclay">@samuelclay</a></div>
|
||||
<div class="NB-about-who-website"><a href="http://www.samuelclay.com">www.samuelclay.com</a></div>
|
||||
<div class="NB-about-who-email"><a href="mailto:samuel@newsblur.com">samuel@newsblur.com</a></div>
|
||||
</li>
|
||||
<li>
|
||||
<img src="{{ MEDIA_URL }}img/static/Lyric.jpg">
|
||||
<div class="NB-about-who-name">Lyric</div>
|
||||
<div class="NB-acount-who-twitter"><a href="http://twitter.com/newsblur">@newsblur</a></div>
|
||||
<div class="NB-about-who-email"><a href="mailto:lyric@newsblur.com">lyric@newsblur.com</a></div>
|
||||
</li>
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title">
|
||||
<span class="NB-module-title-prefix">What:</span> NewsBlur's Motto
|
||||
</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-what">
|
||||
<li>
|
||||
NewsBlur is a personal news reader that brings people together to talk
|
||||
about the world.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title"><span class="NB-module-title-prefix">Who:</span> Writing the Android App</h5>
|
||||
<div class="NB-module-content">
|
||||
</div>
|
||||
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title">
|
||||
<span class="NB-module-title-prefix">Why:</span> What makes NewsBlur better
|
||||
</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-why">
|
||||
<li>
|
||||
<b>News reading</b>: With first-class iOS, Android, and web apps,
|
||||
NewsBlur is an easy and organized way to read the news wherever you are.
|
||||
</li>
|
||||
<li>
|
||||
<b>Training</b>: By using NewsBlur's training filters, you can hide
|
||||
stories you don't want to see and highlight the stories that interest
|
||||
you. Teaching NewsBlur your preferences (or lack thereof) for certain
|
||||
blogs, authors, and topics cuts down on the noise and connects you with
|
||||
the news that interests you most.
|
||||
</li>
|
||||
<li>
|
||||
<b>Social</b>: Sharing and talking about the news is not only fun, but
|
||||
allows you to break out of your routine and embrace the serendipity of
|
||||
your friends' tastes.
|
||||
</li>
|
||||
<li>
|
||||
<b>Blurblogs</b>: Even if your friends aren't NewsBlur users, they can
|
||||
keep up with what you're reading through a public blog of all the
|
||||
stories you've shared, including your comments.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title">
|
||||
<span class="NB-module-title-prefix">Who:</span> A Labor of Love
|
||||
</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-who">
|
||||
<li>
|
||||
<img src="{{ MEDIA_URL }}img/static/Andrei.jpg">
|
||||
<div class="NB-about-who-name">Andrei Dan</div>
|
||||
<div class="NB-acount-who-github"><a href="https://github.com/sictiru">@sictiru</a></div>
|
||||
</li>
|
||||
{% comment %} <li>
|
||||
<img src="{{ MEDIA_URL }}img/static/Mark.jpg">
|
||||
<div class="NB-about-who-name">Mark Anderson</div>
|
||||
<div class="NB-acount-who-github"><a href="https://github.com/manderson23">@manderson23</a></div>
|
||||
</li> {% endcomment %}
|
||||
</ul>
|
||||
</div>
|
||||
<li>
|
||||
<img src="{{ MEDIA_URL }}img/static/Samuel Clay.jpg" />
|
||||
<div class="NB-about-who-name">Samuel Clay</div>
|
||||
<div class="NB-acount-who-twitter">
|
||||
<a href="https://x.com/samuelclay">@samuelclay</a>
|
||||
</div>
|
||||
<div class="NB-about-who-website">
|
||||
<a href="https://www.samuelclay.com">www.samuelclay.com</a>
|
||||
</div>
|
||||
<div class="NB-about-who-email">
|
||||
<a href="mailto:samuel@newsblur.com">samuel@newsblur.com</a>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<img src="{{ MEDIA_URL }}img/static/Lyric.jpg" />
|
||||
<div class="NB-about-who-name">Lyric</div>
|
||||
<div class="NB-acount-who-twitter">
|
||||
<a href="https://x.com/newsblur">@newsblur</a>
|
||||
</div>
|
||||
<div class="NB-about-who-email">
|
||||
<a href="mailto:lyric@newsblur.com">lyric@newsblur.com</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title"><span class="NB-module-title-prefix">Who:</span> Writing the iOS App</h5>
|
||||
<div class="NB-module-content">
|
||||
</div>
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title">
|
||||
<span class="NB-module-title-prefix">Who:</span> Writing the Android App
|
||||
</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-who">
|
||||
<li>
|
||||
<img src="{{ MEDIA_URL }}img/static/David.jpg">
|
||||
<div class="NB-about-who-name">David Sinclair</div>
|
||||
<div class="NB-acount-who-github"><a href="https://github.com/Dejal">@Dejal</a></div>
|
||||
</li>
|
||||
{% comment %} <li>
|
||||
<img src="{{ MEDIA_URL }}img/static/Nicholas.jpg">
|
||||
<div class="NB-about-who-name">Nicholas Riley</div>
|
||||
<div class="NB-acount-who-github"><a href="https://github.com/nriley">@nriley</a></div>
|
||||
</li> {% endcomment %}
|
||||
</ul>
|
||||
</div>
|
||||
<li>
|
||||
<img src="{{ MEDIA_URL }}img/static/Andrei.jpg" />
|
||||
<div class="NB-about-who-name">Andrei Dan</div>
|
||||
<div class="NB-acount-who-github">
|
||||
<a href="https://github.com/sictiru">@sictiru</a>
|
||||
</div>
|
||||
</li>
|
||||
{% comment %}
|
||||
<li>
|
||||
<img src="{{ MEDIA_URL }}img/static/Mark.jpg" />
|
||||
<div class="NB-about-who-name">Mark Anderson</div>
|
||||
<div class="NB-acount-who-github">
|
||||
<a href="https://github.com/manderson23">@manderson23</a>
|
||||
</div>
|
||||
</li>
|
||||
{% endcomment %}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title"><span class="NB-module-title-prefix">When:</span> The story behind NewsBlur</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-what">
|
||||
<li>During the summer of 2009, Samuel wanted a better way to read the news. So he built the first version of NewsBlur almost entirely underground on the A train in New York City.</li>
|
||||
<li>In mid-2010, NewsBlur launched to the public and to favorable reviews. In October 2010, premium accounts launched, paying for NewsBlur's increasing server costs.</li>
|
||||
<li>After Samuel enters Y Combinator in the summer of 2012, he's able to launch lots of new features, like Blurblogs, the iPad and Android apps, and better intelligence training. Samuel and his dog Shiloh celebrate with champagne and biscuits.</li>
|
||||
<li>On March 13th, 2013, Google sunsets Reader and Samuel's world is turned upside-down as thousands of users flee the dying giant. NewsBlur is one of the top contenders for the successor to the RSS throne and by charging cash American dollar for premium accounts, NewsBlur is able to offer sustainability and longevity as one of its selling points.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title">
|
||||
<span class="NB-module-title-prefix">Who:</span> Writing the iOS App
|
||||
</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-who">
|
||||
<li>
|
||||
<img src="{{ MEDIA_URL }}img/static/David.jpg" />
|
||||
<div class="NB-about-who-name">David Sinclair</div>
|
||||
<div class="NB-acount-who-github">
|
||||
<a href="https://github.com/Dejal">@Dejal</a>
|
||||
</div>
|
||||
</li>
|
||||
{% comment %}
|
||||
<li>
|
||||
<img src="{{ MEDIA_URL }}img/static/Nicholas.jpg" />
|
||||
<div class="NB-about-who-name">Nicholas Riley</div>
|
||||
<div class="NB-acount-who-github">
|
||||
<a href="https://github.com/nriley">@nriley</a>
|
||||
</div>
|
||||
</li>
|
||||
{% endcomment %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title"><span class="NB-module-title-prefix">How:</span> Server-side technologies</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-server">
|
||||
<li><a href="http://www.djangoproject.com">Django</a>: Web framework written in Python, used to serve all pages.</li>
|
||||
<li><a href="http://ask.github.com/celery">Celery</a> & <a href="http://www.rabbitmq.com">RabbitMQ</a>: Asynchronous queueing server, used to fetch and parse RSS feeds.</li>
|
||||
<li><a href="http://www.mongodb.com">MongoDB</a>, <a href="http://www.mongodb.com/pymongo">Pymongo</a>, & <a href="http://www.github.com/hmarr/mongoengine">Mongoengine</a>: Non-relational database, used to store stories, read stories, feed/page fetch histories, and proxied sites.</li>
|
||||
<li class=""><a href="http://www.postgresql.com">PostgreSQL</a>: Relational database, used to store feeds, subscriptions, and user accounts.</li>
|
||||
<li class="last"><a href="http://www.redis.io">Redis</a>: Non-relational database, used to calculate unread stories, and used to store friendships and unread story lists. Also used for pub/sub for real-time story updates. Also used as celery's queue backend. Fantastic database technology that changed the game for NewsBlur.</li>
|
||||
<li class="last"><a href="http://www.nodejs.org">Node</a>: Event-driven I/O server-side JavaScript. Used to support real-time story updates, syncing multiple open sessions for a single user (reading a story on your phone will instantly update the web), and a better favicon server.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title">
|
||||
<span class="NB-module-title-prefix">When:</span> The story behind NewsBlur
|
||||
</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-what">
|
||||
<li>
|
||||
During the summer of 2009, Samuel wanted a better way to read the news.
|
||||
So he built the first version of NewsBlur almost entirely underground on
|
||||
the A train in New York City.
|
||||
</li>
|
||||
<li>
|
||||
In mid-2010, NewsBlur launched to the public and to favorable reviews.
|
||||
In October 2010, premium accounts launched, paying for NewsBlur's
|
||||
increasing server costs.
|
||||
</li>
|
||||
<li>
|
||||
After Samuel enters Y Combinator in the summer of 2012, he's able to
|
||||
launch lots of new features, like Blurblogs, the iPad and Android apps,
|
||||
and better intelligence training. Samuel and his dog Shiloh celebrate
|
||||
with champagne and biscuits.
|
||||
</li>
|
||||
<li>
|
||||
On March 13th, 2013, Google sunsets Reader and Samuel's world is turned
|
||||
upside-down as thousands of users flee the dying giant. NewsBlur is one
|
||||
of the top contenders for the successor to the RSS throne and by
|
||||
charging cash American dollar for premium accounts, NewsBlur is able to
|
||||
offer sustainability and longevity as one of its selling points.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title"><span class="NB-module-title-prefix">How:</span> Client-side and design</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-client">
|
||||
<li><a href="http://www.jquery.com">jQuery</a>: Cross-browser compliant JavaScript code. IE works without effort.</li>
|
||||
<li><a href="http://documentcloud.github.com/backbone/">Backbone.js</a>: Models and views make for easy maintenance.</li>
|
||||
<li><a href="http://documentcloud.github.com/underscore/">Underscore.js</a>: Functional programming for JavaScript. Indispensible.</li>
|
||||
<li><b>Miscellaneous jQuery Plugins:</b> Everything from resizable layouts, to progress bars, sortables, date handling, colors, corners, JSON, animations. See the complete list on <a href="http://github.com/samuelclay/">NewsBlur's GitHub repository</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title">
|
||||
<span class="NB-module-title-prefix">How:</span> Server-side technologies
|
||||
</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-server">
|
||||
<li>
|
||||
<a href="http://www.djangoproject.com">Django</a>: Web framework written
|
||||
in Python, used to serve all pages.
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://ask.github.com/celery">Celery</a> &
|
||||
<a href="http://www.rabbitmq.com">RabbitMQ</a>: Asynchronous queueing
|
||||
server, used to fetch and parse RSS feeds.
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://www.mongodb.com">MongoDB</a>,
|
||||
<a href="http://www.mongodb.com/pymongo">Pymongo</a>, &
|
||||
<a href="http://www.github.com/hmarr/mongoengine">Mongoengine</a>:
|
||||
Non-relational database, used to store stories, read stories, feed/page
|
||||
fetch histories, and proxied sites.
|
||||
</li>
|
||||
<li class="">
|
||||
<a href="http://www.postgresql.com">PostgreSQL</a>: Relational database,
|
||||
used to store feeds, subscriptions, and user accounts.
|
||||
</li>
|
||||
<li class="last">
|
||||
<a href="http://www.redis.io">Redis</a>: Non-relational database, used
|
||||
to calculate unread stories, and used to store friendships and unread
|
||||
story lists. Also used for pub/sub for real-time story updates. Also
|
||||
used as celery's queue backend. Fantastic database technology that
|
||||
changed the game for NewsBlur.
|
||||
</li>
|
||||
<li class="last">
|
||||
<a href="http://www.nodejs.org">Node</a>: Event-driven I/O server-side
|
||||
JavaScript. Used to support real-time story updates, syncing multiple
|
||||
open sessions for a single user (reading a story on your phone will
|
||||
instantly update the web), and a better favicon server.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title"><span class="NB-module-title-prefix">Legal:</span> Privacy Policy & Terms of Service</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-tagline">
|
||||
<li><a href="/privacy">Privacy policy</a> lets you know that your data is yours alone</li>
|
||||
<li><a href="/tos">Terms of service</a> is what it takes to legally use NewsBlur</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title">
|
||||
<span class="NB-module-title-prefix">How:</span> Client-side and design
|
||||
</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-client">
|
||||
<li>
|
||||
<a href="http://www.jquery.com">jQuery</a>: Cross-browser compliant
|
||||
JavaScript code. IE works without effort.
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://documentcloud.github.com/backbone/">Backbone.js</a>:
|
||||
Models and views make for easy maintenance.
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://documentcloud.github.com/underscore/">Underscore.js</a>:
|
||||
Functional programming for JavaScript. Indispensible.
|
||||
</li>
|
||||
<li>
|
||||
<b>Miscellaneous jQuery Plugins:</b> Everything from resizable layouts,
|
||||
to progress bars, sortables, date handling, colors, corners, JSON,
|
||||
animations. See the complete list on
|
||||
<a href="http://github.com/samuelclay/">NewsBlur's GitHub repository</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title"><span class="NB-module-title-prefix">What:</span> NewsBlur's Tagline</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-tagline">
|
||||
<li>A new sound of an old instrument.</li>
|
||||
<a href="https://www.youtube.com/watch?v=Lks51ELeUB4"><img src="{{ MEDIA_URL }}img/static/Moondog.jpg"></a>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title">
|
||||
<span class="NB-module-title-prefix">Legal:</span> Privacy Policy &
|
||||
Terms of Service
|
||||
</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-tagline">
|
||||
<li>
|
||||
<a href="/privacy">Privacy policy</a> lets you know that your data is
|
||||
yours alone
|
||||
</li>
|
||||
<li>
|
||||
<a href="/tos">Terms of service</a> is what it takes to legally use
|
||||
NewsBlur
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
<div class="NB-module">
|
||||
<h5 class="NB-module-title">
|
||||
<span class="NB-module-title-prefix">What:</span> NewsBlur's Tagline
|
||||
</h5>
|
||||
<div class="NB-module-content">
|
||||
<ul class="NB-about-tagline">
|
||||
<li>A new sound of an old instrument.</li>
|
||||
<a href="https://www.youtube.com/watch?v=Lks51ELeUB4"
|
||||
><img src="{{ MEDIA_URL }}img/static/Moondog.jpg"
|
||||
/></a>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
{% block footer %}
|
||||
{% render_footer "about" %}
|
||||
{% endblock footer %}
|
||||
{% endblock content %} {% block footer %} {% render_footer "about" %} {%
|
||||
endblock footer %}
|
||||
|
|