New screenshots for homepage, updating all twitter links to x.com. Still need Android screenshot from S22.

This commit is contained in:
Samuel Clay 2024-11-13 23:18:09 -08:00
parent 5af380136c
commit 0e312ae7fd
19 changed files with 1031 additions and 795 deletions

139
README.md
View file

@ -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,34 +64,34 @@
## Using a custom domain
1. Run the custom domain script
1. Run the custom domain script
```
bash ./utils/custom_domain.sh <domain name>
```
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`
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`
- Change `NEWSBLUR_URL` and `SESSION_COOKIE_DOMAIN` in `newsblur_web/docker_local_settings.py`
- Change the domain in `config/fixtures/bootstrap.json`
3. A way to make sure you updated all the correct places:
You can also change domains: `bash ./utils/custom_domain.sh <old domain> <new domain>`
* 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
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:
- 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.
You can also confirm that there is a domain name mismatch in the database by running `make shell` & typing `Site.objects.all()[0]` to show the domain that NewsBlur is expecting.
## Making docker-compose work with your existing database
To make docker-compose work with your database, upgrade your local database to the docker-compose version and then volumize the database data path by changing the `./docker/volumes/` part of the volume directive in the service to point to your local database's data directory.
@ -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
@ -139,16 +142,16 @@ Performance tests use the locust performance testing tool. To run performance te
`make perf-cli users=1 rate=1 host=https://localhost`. Feel free to change the users, rate, and host
variables in the command to meet you needs.
You can also run locust performance tests using a UI by running `make perf-ui` and then navigating to
You can also run locust performance tests using a UI by running `make perf-ui` and then navigating to
http://127.0.0.1:8089. This allows you to chart and export your performance data.
To run locust using docker, just run `make perf-docker` and navigate to http://127.0.0.1:8089
## 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

View 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")}

View file

@ -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;

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View file

@ -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=',

View file

@ -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')
])

View file

@ -67,7 +67,7 @@
<h1><span class="error404">502</span> &middot; 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>

View file

@ -72,7 +72,7 @@ Content-Type: text/html
<h1><span class="error404">502</span> &middot; 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>

View file

@ -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">

View file

@ -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>

View file

@ -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>
<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">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> 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> &amp; <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>, &amp; <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> &amp;
<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>, &amp;
<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">Legal:</span> Privacy Policy &amp; 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>
<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>
{% endblock content %}
</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>
{% block footer %}
{% render_footer "about" %}
{% endblock footer %}
<div class="NB-module">
<h5 class="NB-module-title">
<span class="NB-module-title-prefix">Legal:</span> Privacy Policy &amp;
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>
<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>
{% endblock content %} {% block footer %} {% render_footer "about" %} {%
endblock footer %}

File diff suppressed because it is too large Load diff