• Stars
    star
    173
  • Rank 218,853 (Top 5 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 9 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Image tools for social media sharing

Lunchbox

=============

What is this?

Lunchbox is a suite of tools to create images intended for social media sharing. It includes:

  • Quotable: Converts quoted text into a branded image.
  • Factlist: Produces a branded image with a list of items.
  • Waterbug: Creates a watermarked image with attribution.

Assumptions

Lunchbox is a customizable toolset deployable as a web app. The following instructions are meant for developers setting up and customizing the app for their organization. For end-users of the tools, see usage guidelines.

The following things are assumed to be true in this documentation.

  • You are running OSX.
  • You are using Python 2.7. (Probably the version that came OSX.)
  • You have virtualenv and virtualenvwrapper installed and working.

What's in here?

  • fabfile -- Fabric commands for automating setup and deployment.
  • less -- Application styles and Bootstrap less files.
  • templates -- HTML (Jinja2) templates, to be compiled locally.
  • www -- App assets and rendered files.
  • Lunchbox Setup.exe -- Lunchbox Demo installer for Windows.
  • Lunchbox.dmg -- Lunchbox Demo installer for OSX.
  • app.py -- A Flask app for rendering the project locally.
  • app_config.py -- Configuration variables for the Flask app.
  • package.json -- Node dependencies and scripts for building Electron app.
  • packager-config.json -- Configuration for create installers with Electron.
  • render_utils.py -- Helper functions for baking out Flask app.
  • requirements.txt -- Python requirements.
  • static.py -- Routes for static files in Flask app.

Quick Start

Clone or fork this repo (NPR users: Use the npr branch), then do the following:

Change to the project directory you just cloned:

cd lunchbox

Create a new virtualenv to get an isolated Python environment:

with virtualenvwrapper with Anaconda
mkvirtualenv lunchbox conda create --name lunchbox python=2.7

Then, activate your virtual environment.

with virtualenvwrapper with Anaconda
workon lunchbox conda activate lunchbox

Next, install Python dependencies:

pip install -r requirements.txt

Install the Node.js dependencies (most importantly, Less):

npm install

Then run the app:

fab app

Visit localhost:8000 in your browser to see the app.

Configuration

You can skip configuration if you just want to deploy Lunchbox and start using it with the application's default branding (or you can download the Demo ). Configuration options allow you to tailor the app to match your organization's branding and theme.

Assets

If you are customizing the branding of the apps, you will probably want to use your organization's web fonts and logos.

For fonts, we provide a Jinja template at templates/_fonts.html using Typekit's webfontloader for loading fonts from Google, Typekit, or custom stylesheets. Then, the fonts will be available in the CSS and JavaScript in all of the apps.

For your organization's logos, you can provide SVGs or PNGs. Make sure that there is no whitespace around the logo so that the padding performs properly. You can place them anywhere in the www folder as long as you link them correctly when you define your global variables, but we recommend www/img.

For Waterbug, you will want to have a white version and a black version of your logo so that you can choose the appropriate version for light and dark photos.

Define global variables

There are two places where variables are defined, one place for Quotable and Factlist and one place for Waterbug.

Quotable/Factlist

For Quotable and Factlist, all configuration takes places in less/variables.less. You can define font families, establish the default background color/text color and define the logo used on the images.

Importantly, if you use a custom logo, you will also need to explicitly define the width and height of the logo in both square crop and 16:9 crop scenarios. The variables at the top of the file will do this:

@logo-path: url('../path/to/logo.svg');
@logo-sq-width: 145px;
@logo-sq-height: 48px;
@logo-16x9-width: 121px;
@logo-16x9-height: 40px;

Additionally, you can fine-tune various aspects of Quotable and Factlist using the app-specific variables also listed in the file. The defaults should work well out of the box, but your organization's logo or font may require tweaks.

Waterbug

Waterbug has a different configuration system because it cannot be controlled through CSS. To customize Waterbug, go to www/js/waterbug-config.js and customize the variables at the top of the file.

In this file, you can define the logos used and the sizes with which they render by editing the logos object.

var logos = {
    'name-of-logo': {
        whitePath: '../path/to/logo-white.svg', // path to white logo
        blackPath: '../path/to/logo-black.svg', // path to black logo
        w: 200, // width of logo
        h: 67, // height of logo
        display: 'Name of logo' // how the button toggle will appear in the UI
    },
    'name-of-second-logo': {
        whitePath: '../path/to/second-logo-white.svg',
        blackPath: '../path/to/second-logo-black.svg',
        w: 150,
        h: 51,
        display: 'Name of second logo'
    }
};

If you have more than one logo, the UI will automatically add toggle buttons so that you can switch between logos on the fly.

Additionally, You can change every property of the font rendering (font face, size, shadow, etc.) as well as the padding around all of the elements (elementPadding) in the image and the export width of the image (canvasWidth).

You will want to configure the copyright options for Waterbug based on the photo providers your news organization can use. This is defined in an large object that contains an object for each copyright option. The boolean values control the behavior of the form:

// copyright options
var orgName = 'Your News Organization';
var freelanceString = 'for ' + orgName;

var copyrightOptions = {
    'internal': {
        showPhotographer: true, // show the photographer input box
        showSource: false, // show the source input box
        photographerRequired: false, // require a photographer
        sourceRequired: false, // require a source
        source: orgName, // How the source should appear on the image, e.g. 'NPR'
        display: orgName, // How the option will appear in the dropdown menu
    },
    'freelance': {
        showPhotographer: true,
        showSource: false,
        photographerRequired: true,
        sourceRequired: false,
        source: freelanceString,
        display: 'Freelance'
    },
    'ap': {
        showPhotographer: true,
        showSource: false,
        photographerRequired: false,
        sourceRequired: false,
        source: 'AP',
        display: 'AP'
    },
    'getty': {
        showPhotographer: true,
        showSource: false,
        photographerRequired: false,
        sourceRequired: false,
        source: 'Getty Images',
        display: 'Getty'
    },
    'thirdParty': {
        showPhotographer: true,
        showSource: true,
        photographerRequired: false,
        sourceRequired: true,
        source: '',
        display: 'Third Party/Courtesy'
    }
}

The app will automatically add all of your copyright options to the dropdown menu. Also, it will perform form validation based on the boolean values above.

Finally, you can configure the application defaults. Ensure that the logo and image paths point to existing files:

// app load defaults
var currentCrop = 'twitter'; // default crop size
var currentLogo = 'lunchbox'; // default logo slug
var currentLogoColor = 'white'; // default logo color
var currentTextColor = 'white'; // default text color
var defaultImage = '../img/test-kitten.jpg'; // path to image to load as test image
var defaultLogo = logos[currentLogo]['whitePath'] // path to default logo

At the bottom of the form, you will notice a Sharing Guidelines section. To edit that section, you can just update the list in templates/waterbug.html.

Multiple Themes

For Quotable and Factlist, you can provide up to three themes in addition to the default theme if your news organization requires different branding for different accounts (think NPR vs. NPR Music).

In less/variables.less, you can define themes at the bottom of the file. For each theme, you can change the background color, text color, and logo:

@theme2-bg-color: #41474E;
@theme2-text-color: #dbe0e6;
@theme2-logo-path: url('../img/icon-socializr-white.svg');
@theme2-sq-logo-width: 145px;
@theme2-sq-logo-height: 48px;
@theme2-16x9-logo-width: 121px;
@theme2-16x9-logo-height: 40px;

In the form UI, you can change the display of the theme selection buttons in each app's HTML template (templates/quotable.html, templates/factlist.html). Be sure not to change the ID attribute of the button, as these IDs control the JavaScript that adds and removes classes on the image.

Deployment

We support two separate deployment options: Amazon S3 and any fileserver that you can SSH into.

Deploy to Amazon S3

For Amazon S3, ensure that you've installed the AWS command-line interface (if you're using brew, you can use brew install awscli), and set up a new S3 bucket.

Store your AWS Access Key ID and Secret Access Key as environment variables by running the following in Terminal:

export AWS_ACCESS_KEY_ID="YOURACCESSKEYID"
export AWS_SECRET_ACCESS_KEY="YOURSECRETACCESSKEY"

Then, in app_config.py, change your staging and production S3 targets:

PRODUCTION_S3_BUCKET = 'your.bucket.org'
STAGING_S3_BUCKET = 'stage-your.bucket.org'

Note: The placeholder is the name of your bucket and not its url. For a simple S3 bucket with no custom DNS named lunchbox-s3, you would use lunchbox-s3 instead of s3.amazonaws.com/lunchbox-s3, for instance.

With these variables set, you can run fab [production/staging] master deploy to deploy Lunchbox to your S3 bucket.

Deploy to other file server

For other file servers, you can change the following app_config variables:

FILE_SERVER_USER = 'ubuntu' # set this to the user you use to SSH onto the server
FILE_SERVER = 'your.fileserver.org' # set this to either the hostname or IP address of your file server
FILE_SERVER_PATH = '~/www' # set this to the path that your server serves files to the web from

Then, you can run fab fileserver master deploy. This will rsync the rendered files to FILE_SERVER_PATH/lunchbox.

Known Issues

  • Firefox compatibility with SVG: Firefox is not capable of rendering SVG logos with Quotable or Factlist.

About

Lunchbox consolidates NPR’s Quotable, Factlist and Waterbug, apps into a suite of tools for the newsroom.

It was worked on during the OpenNews Portland Code Convening on July 23-24, 2015.

Additional contributors:

More Repositories

1

app-template

The NPR visuals team's opinionated project template for client-side apps.
JavaScript
1,536
star
2

bestpractices

Best practices and coding conventions for the NPR Visuals team.
286
star
3

dailygraphics

NPR Visuals' rig for deploying daily graphics projects in responsive iframes.
JavaScript
285
star
4

copytext

A library for accessing a spreadsheet as a native Python object suitable for templating.
Python
225
star
5

tshirt

Planet Money Makes A T-Shirt
JavaScript
151
star
6

mapturner

A command line utility for generating topojson from various data sources for fast maps.
Python
110
star
7

quotable

REPO DEPRECATED; see the current version in Lunchbox http://github.com/nprapps/lunchbox
JavaScript
93
star
8

nprapps.github.com

The NPR visuals team's blog.
HTML
77
star
9

interactive-template

A Node-based template for starting news apps and interactive pages
JavaScript
55
star
10

newscast.js

A library to radically simplify Chromecast web app development.
JavaScript
54
star
11

dailygraphics-next

NPR's daily graphics rig, 2.0
JavaScript
43
star
12

heat-income

Analysis of heat and income in U.S. cities
Python
34
star
13

book-concierge

A concierge for every year
Less
33
star
14

armslist-scraper

A simple scraper for armslist.com listings
Python
32
star
15

waterbug

REPO DEPRECATED; see the current version in Lunchbox http://github.com/nprapps/lunchbox
JavaScript
29
star
16

sidechain

Modern responsive iframes
JavaScript
29
star
17

roku-tinydesk

Tiny Desk Concerts Roku app
Brightscript
28
star
18

books13

NPR's Book Concierge: Our Guide To 2013's Great Reads
JavaScript
27
star
19

totebot2

Everything is better in the new building, even the totebot.
CoffeeScript
25
star
20

django-starter-kit

Opinionated template for Django projects on Python 3 and PostgreSQL
Python
24
star
21

lookatthis

Stories about how you see the world.
JavaScript
22
star
22

betty

An unambiguous dialect of ArchieML
JavaScript
20
star
23

trump-tweet-analysis

Data and sentiment analysis of Trump's tweets
Jupyter Notebook
20
star
24

anno-docs

Live transcription rig
JavaScript
19
star
25

graphics-archive

Archived graphics published using our dailygraphics rig
JavaScript
16
star
26

worldvalues

World Values Survey data analysis
Python
15
star
27

elections16

App for 2016 primary elections
JavaScript
15
star
28

carebot

NPR Visual's Carebot (deprecated, now in: https://github.com/thecarebot/carebot)
Python
15
star
29

walmart

Mapping the growth of Wal-Mart in urban areas.
Shell
14
star
30

ucr-clearance-parser

parse uniform crime reporting clearance data
Python
13
star
31

envivo

A live-blogging application.
Python
13
star
32

bestsongs14

Songs We Love 2014
JavaScript
13
star
33

electris

Elections 2012
PLpgSQL
13
star
34

copydoc

Like copytext, but for docs
HTML
12
star
35

papertrail

Rig for deploying DocumentCloud viewers to S3.
JavaScript
12
star
36

tumble

A rig for handling static tumblr themes in a reasonable fashion.
CSS
12
star
37

playgrounds2

A community-edited guide to accessible playgrounds in the United States.
JavaScript
11
star
38

elections14

We're having an election party.
JavaScript
11
star
39

barkedu

The world is starting to forget about Ebola. The village of Barkedu can't.
JavaScript
10
star
40

dailygraphics-templates

Graphic templates for the dailygraphics-next rig
JavaScript
9
star
41

stl-lobbying

Lobbying in Missouri project with SLPR
JavaScript
9
star
42

bernard

Python
9
star
43

servers

Server setup scripts for NPR Apps servers.
Shell
9
star
44

hollerith

Publish Sheets to S3 as JSON
JavaScript
8
star
45

leso

Processing scripts for Defense Logistics Agency LESO data
Shell
8
star
46

books14

NPR's Book Concierge app
JavaScript
8
star
47

photo-finder

An internal-facing tool for searching instagram.
JavaScript
8
star
48

arrested-development

The one about Arrested Development.
JavaScript
8
star
49

us-wildfires

Fire-forecast data for the United States.
JavaScript
8
star
50

elections20-interactive

Front-end graphics for the 2020 general election
JavaScript
8
star
51

ap-election-loader

basic AP election loader
Shell
8
star
52

mental-health

A Silent Epidemic: The Mental Health Crisis In Our Schools
JavaScript
8
star
53

elections20-primaries

Primary results for 2020
JavaScript
7
star
54

borders-map

Borderland collaboration with CIR
JavaScript
7
star
55

cron-starter-kit

This is a simple starter kit for deploying and maintaining cron jobs on EC2 servers.
Python
7
star
56

austin

The Austin 100
JavaScript
7
star
57

shelf-life

A Tumblr rig for pantry raids.
JavaScript
7
star
58

school-choice

Data analysis for education's school choice in Indiana project
Jupyter Notebook
6
star
59

elections22

Data pipeline and results graphics for the 2022 general election. Building off elections20-interactive.
JavaScript
6
star
60

nprchat

Experimental chat using Firebase.
JavaScript
6
star
61

armslist-analysis

Analysis of the armslist dataset
Python
6
star
62

liveblog-standalone

NPR's liveblog rig 2.0
JavaScript
6
star
63

inauguration

NPR Inauguration 2013 live chat (built on Scribble Live) and "Dear Mr. President" listener call-out (built on Tumblr)
JavaScript
6
star
64

wolves

Big beautiful Gilkey photos of wolves & Nate Rott's audio opus
JavaScript
6
star
65

civilrights

Behind The Civil Rights Act: How it was made and what it means today—commentary on the landmark Civil Rights Act of 1964.
JavaScript
6
star
66

congress-bot

Bot to track legislation and other activity by members of Congress from a specific state
Python
5
star
67

graeae

JavaScript
5
star
68

books18

Best books of 2018
JavaScript
5
star
69

books16

book concierge 2016 edition
JavaScript
5
star
70

elections18-graphics

2018 midterm election front-end; iteration upon 2016 GE work
JavaScript
5
star
71

oscars

Oscar Night 2013 live chat / liveblog (built on Scribble Live), and Best Picture cheat sheet
JavaScript
5
star
72

anno-lambda-authorizer

AWS lambda function that serves as a custom authorizer for AWS API Gateway
Python
5
star
73

geocode-nominatim

Geocode structured & unstructured addresses using Nominatim service
Python
4
star
74

cypher

A Vagrant config for running NPR's news apps
4
star
75

clerk

A cron job --> Slack webhook that posts new action from the House floor
Python
4
star
76

pym-particle

Active development moved to Sidechain
JavaScript
4
star
77

ahca

Python
4
star
78

rockymountain

JavaScript
4
star
79

in-memoriam-2013

NPR Music remembers the singers, instrumentalists, songwriters and personalities who died in 2013.
JavaScript
4
star
80

disability

HTML breakout story page for the Planet Money / This American Life / NPR project "Unfit For Work."
JavaScript
4
star
81

executive-orders

Cron job that posts to Slack incoming webhook when new executive orders (or actions or memos) are published to whitehouse.gov
Python
4
star
82

autocomplete-input

JavaScript
3
star
83

sanctuary-cities

Python
3
star
84

bestsongs15-midyear

best songz, 2015 midyear edition
JavaScript
3
star
85

commencement

The Best Commencement Speeches, Ever
JavaScript
3
star
86

sea-level-scroll

Visual narrative: Who Will Pay To Protect Tech Giants From Rising Seas?
JavaScript
3
star
87

okkervil

An audio-guided tour through a Leaflet map
JavaScript
3
star
88

syria

With Syria engulfed in civil war, here are four stories of families struggling to stay together.
JavaScript
3
star
89

elections18-general

2018 midterm election back-end: Associated Press data ETL, database, admin panel, and JSON output; iteration upon 2016 GE work
JavaScript
3
star
90

nola

The End Of Neighborhood Schools: New Orleans charter schools
JavaScript
3
star
91

science-of-joy

It's a joy generator
JavaScript
3
star
92

factcheck-db

Python
3
star
93

sotu

Application for aggregating NPR's State of the Union coverage (built on Scribble Live)
JavaScript
3
star
94

elections16-general

You already know what it is.
JavaScript
2
star
95

musicgame

JavaScript
2
star
96

elections16graphics

Front-end for 2016 elections
JavaScript
2
star
97

wildfire-scroll

Visual narrative: United States of Wildfire
JavaScript
2
star
98

us-drought

JavaScript
2
star
99

liveblog-headlines

RSS widget for liveblogs or NPR.org API feeds
JavaScript
2
star
100

familymeal

An NPR project (built on Tumblr) centered around user-submitted photos of their dinners.
JavaScript
2
star