Changeset - a2f38653fb02
conservancy/blog/admin.py
Show inline comments
 
from django.contrib import admin
 

	
 
from .models import Entry, EntryTag
 

	
 

	
 
@admin.register(EntryTag)
 
class EntryTagAdmin(admin.ModelAdmin):
 
    prepopulated_fields = {'slug': ('label',)}
 

	
 

	
 

	
 
@admin.register(Entry)
 
class EntryAdmin(admin.ModelAdmin):
 
    list_display = ('pub_date', 'headline', 'author')
 
    list_filter = ['pub_date']
 
    date_hierarchy = 'pub_date'
 
    search_fields = ['headline', 'summary', 'body']
 
    prepopulated_fields = {'slug': ("headline",)}
 
    filter_horizontal = ('tags',)
 

	
 

	
conservancy/blog/views.py
Show inline comments
 
from datetime import datetime
 
from functools import reduce
 

	
 
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
 
from django.shortcuts import get_object_or_404, render
 
from django.views.generic.dates import (
 
    DateDetailView,
 
    DayArchiveView,
 
    MonthArchiveView,
 
    YearArchiveView,
 
)
 

	
 
from ..staff.models import Person
 
from .models import EntryTag
 

	
 

	
 
def OR_filter(field_name, objs):
 
    from django.db.models import Q
 
    return reduce(lambda x, y: x | y,
 
                  [Q(**{field_name: x.id}) for x in objs])
 

	
 
def last_name(person):
 
    return person.formal_name.rpartition(' ')[2]
 

	
 
def custom_index(request, queryset, *args, **kwargs):
 
    """Blog list view that allows scrolling and also shows an index by
 
    year.
 
    """
 

	
 
    extra_context = kwargs.get('extra_context', {}).copy()
 
    date_field = kwargs['date_field']
 

	
 
    if not kwargs.get('allow_future', False):
 
        queryset = queryset.filter(**{'%s__lte' % date_field: datetime.now()})
 

	
 
    authors = []
 
    if 'author' in request.GET:
 
        authors = [get_object_or_404(Person, username=author)
 
                   for author in request.GET.getlist('author')]
 
        extra_context['authors'] = authors
 
        queryset = queryset.filter(OR_filter('author', authors))
 

	
 
    tags = []
 
    if 'tag' in request.GET:
 
        tags = [get_object_or_404(EntryTag, slug=tag)
 
                for tag in request.GET.getlist('tag')]
 
        extra_context['tags'] = tags
 
        queryset = queryset.filter(OR_filter('tags', tags))
 

	
 
    if authors or tags:
 
        query_string = '&'.join(['author=%s' % a.username for a in authors]
 
                                + ['tag=%s' % t.slug for t in tags])
 
        extra_context['query_string'] = query_string
 

	
 
    else:
 
        date_list = queryset.dates(date_field, 'year')
 
        extra_context['date_list'] = date_list
 

	
 
    paginate_by = kwargs.get('paginate_by', 6)  # Show 6 news items per page, by default
 
    paginator = Paginator(queryset, paginate_by)
 
    page = request.GET.get('page')
 

	
 
    try:
 
        blog_entries = paginator.page(page)
 
    except PageNotAnInteger:
 
        # If page is not an integer, deliver first page.
 
        blog_entries = paginator.page(1)
 
    except EmptyPage:
 
        # If page is out of range (e.g. 9999), deliver last page of results.
 
        blog_entries = paginator.page(paginator.num_pages)
 

	
 
    extra_context['blog_entries'] = blog_entries
 

	
 
    return render(request, 'blog/entry_list.html', extra_context)
 

	
 
def techblog_redirect(request):
 
    """Redirect from the old 'techblog' to the new blog
 
    """
 

	
 
    path = request.path[len('/technology'):]
 
    if path == '/blog/':
 
        path += "?author=bkuhn"
 

	
 
    return relative_redirect(request, path)
 

	
 
def query(request):
 
    """Page to query the blog based on authors and tags
 
    """
 

	
 
    if request.GET:
 
        d = request.GET.copy()
 
        if 'authors' in d.getlist('all'):
 
            d.setlist('author', []) # remove author queries
 
        if 'tags' in d.getlist('all'):
 
            d.setlist('tag', []) # remove tag queries
 
        d.setlist('all', []) # remove "all" from the query string
 

	
 
        base_url = '/blog/'
 
        if 'rss' in d:
 
            base_url = '/feeds/blog/'
 
            d.setlist('rss', []) # remove it
 

	
 
        query_string = d.urlencode()
 

	
 
        return relative_redirect(request, '{}{}{}'.format(base_url, '?' if query_string else '', query_string))
 

	
 
    else:
 
        authors = sorted(Person.objects.filter(currently_employed=True,
 
                                               entry__isnull=False).distinct(),
 
                         key=last_name)
 
        tags = EntryTag.objects.all().order_by('label')
 
        return render(request, 'blog/query.html', {'authors': authors, 'tags': tags})
 

	
 
def relative_redirect(request, path):
 
    from django import http
 

	
 
    host = request.get_host()
 

	
 
    url = "{}://{}{}".format(request.is_secure() and 'https' or 'http', host, path)
 
    return http.HttpResponseRedirect(url)
 

	
 
class BlogYearArchiveView(YearArchiveView):
 
    make_object_list = True
 
    allow_future = True
 
    extra_context = {}
 
    
 

 
    def get_context_data(self, **kwargs):
 
        context = super().get_context_data(**kwargs)
 
        context.update(self.extra_context)
 
        return context
 

	
 
class BlogMonthArchiveView(MonthArchiveView):
 
    allow_future = True
 
    extra_context = {}
 
    
 

 
    def get_context_data(self, **kwargs):
 
        context = super().get_context_data(**kwargs)
 
        context.update(self.extra_context)
 
        return context
 

	
 
class BlogDayArchiveView(DayArchiveView):
 
    allow_future = True
 
    extra_context = {}
 
    
 

 
    def get_context_data(self, **kwargs):
 
        context = super().get_context_data(**kwargs)
 
        context.update(self.extra_context)
 
        return context
 

	
 
class BlogDateDetailView(DateDetailView):
 
    allow_future = True
 
    extra_context = {}
 
    
 

 
    def get_context_data(self, **kwargs):
 
        context = super().get_context_data(**kwargs)
 
        context.update(self.extra_context)
 
        return context
conservancy/content/about/board/index.html
Show inline comments
 
{% extends "base_about.html" %}
 
{% block subtitle %}Directors - {% endblock %}
 
{% block submenuselection %}Directors{% endblock %}
 
{% block content %}
 

	
 
<h1>Directors</h1>
 

	
 
<p>Like many non-profits, Conservancy is directed by a
 
self-perpetuating Board of Directors, who
 
appoint the <a href="/about/staff/">Executive Director and staff</a> to carry out the
 
day-to-day operations of the organization.  The Directorship of the
 
Conservancy includes both talented non-profit managers and experienced
 
FLOSS project leaders who can both guide the administrative operations of
 
the organization as well as mentor member project leaders as needed.  Our
 
Directors constantly search for additional directors who can contribute a
 
variety of expertise and perspective related to the Conservancy's
 
mission.</p>
 

	
 
<p>Currently, the directors of Conservancy are:</p>
 

	
 
<h2 id="jeremy">Jeremy Allison</h2>
 

	
 
<p>Jeremy Allison is one of the lead developers on the Samba Team, a
 
group of programmers developing an Open Source Windows compatible file
 
and print server product for UNIX systems. Developed over the Internet
 
in a distributed manner similar to the Linux system, Samba is used by
 
all Linux distributions as well as many thousands of corporations and
 
products worldwide. Jeremy handles the co-ordination of Samba
 
development efforts and acts as a corporate liaison to companies using
 
the Samba code commercially.</p>
 

	
 
<p>He works for CIQ as a Distinguished Engineer, working on Open
 
Source code.</p>
 

	
 
<h2 id="laura">Dr. Laura Fortunato</h2>
 

	
 
<p><a href="http://www.santafe.edu/~fortunato/">Dr. Laura Fortunato</a>
 
is a professor of evolutionary anthropology at the University
 
of Oxford, where she researches the evolution of human social and
 
cultural behavior, working at the interface of anthropology and
 
biology. An advocate of reproducible computational methods in
 
research, including the use of Free/Open-Source tools, she founded the
 
<a href="https://rroxford.github.io/">Reproducible Research Oxford</a>
 
project, with the aim to foster a culture of reproducibility and open
 
research at Oxford.</p>
 

	
 
<p>Laura holds a degree in Biological Sciences from the University of
 
Padova and masters and PhD in Anthropology from University College
 
London. Before joining Oxford she was an Omidyar fellow at the <a
 
href="http://www.santafe.edu/">Santa Fe Institute</a>, where she is
 
currently an External Professor and a member of the Science Steering
 
Committee. She is also a member of the steering group of the <a
 
href="http://www.ukrn.org/">UK Reproducibility Network</a>, a peer-led
 
consortium that aims to promote robust research practice in the UK.</p>
 

	
 
<h2 id="mark">Dr. Mark Galassi</h2>
 

	
 
<p>Mark Galassi has been involved in the GNU project since 1984. He
 
currently works as a researcher in the International, Space, and Response
 
division at Los Alamos National Laboratory, where he has worked on the
 
HETE-2 satellite, ISIS/Genie, the Raptor telescope, the Swift satellite,
 
and the muon tomography project. In 1997 Mark took a couple of years off
 
from Los Alamos (where he was previously in the ISR division and the
 
Theoretical Astrophysics group) to work for Cygnus (now a part of Red Hat)
 
writing software and books for eCos, although he continued working on the
 
HETE-2 satellite (an astrophysical Gamma Ray Burst mission) part
 
time. Mark earned his BA in Physics at Reed College and a PhD from the
 
Institute for Theoretical Physics at Stony Brook. </p>
 

	
 
<h2 id="bdale">Bdale Garbee</h2>
 

	
 
<p><a href="https://gag.com/bdale/">Bdale Garbee</a> has been a contributor
 
to the Free Software community since 1979.  Bdale's background also includes
 
many years of hardware design, Unix internals, and embedded systems work.
 
He was an early participant in the Debian project, helped port Debian
 
GNU/Linux to 5 architectures, served as Debian Project Leader, then
 
chairman of the Debian Technical Committee for nearly a decade, and remains
 
active in the Debian community.</p>
 

	
 
<p>Bdale served as an HP Fellow in the Office of the CTO until 2016 where
 
he led HP's open source strategy work.  Bdale served as President of
 
Software in the Public Interest for a decade.  He served nearly as long on
 
the board of directors of the Linux Foundation representing individual
 
affiliates and the developer community.  Bdale currently serves on the
 
boards of the Freedombox Foundation, Linux Professional Institute, and
 
Aleph Objects.</p>
 

	
 
<h2 id="bkuhn">Bradley M. Kuhn</h2>
 

	
 
<p><a href="http://ebb.org/bkuhn/">Bradley M. Kuhn</a> is
 
the <a href="/about/staff/#bkuhn">Policy Fellow and Hacker-in-Residence</a>
 
at <a href="/">Software Freedom Conservancy</a> and editor-in-chief
 
of <a href="https://copyleft.org">copyleft.org</a>. Kuhn began his work in
 
the software freedom movement as a volunteer in 1992, when he became an early
 
adopter of Linux-based systems, and began contributing to various Free
 
Software projects, including Perl.  He worked during the 1990s as a system
 
administrator and software developer for various companies, and taught AP
 
Computer Science at Walnut Hills High School in Cincinnati.  Kuhn's
 
non-profit career began in 2000, when he was hired by the FSF.  As FSF's
 
Executive Director from 2001&ndash;2005, Kuhn
 
led <a href="https://www.fsf.org/licensing">FSF's GPL enforcement</a>,
 
launched <a href="https://www.fsf.org/associate/">its Associate Member
 
program</a>, and invented
 
the <a href="http://www.gnu.org/licenses/agpl-3.0.html">Affero GPL</a>.  Kuhn
 
was appointed President of Software Freedom Conservancy in April 2006, was
 
Conservancy's primary volunteer from 2006&ndash;2010, and has been a
 
full-time staffer since early 2011.  Kuhn holds a summa cum laude B.S. in
 
Computer Science
 
from <a href="http://www.loyola.edu/academic/computerscience">Loyola
 
University in Maryland</a>, and an M.S. in Computer Science from
 
the <a href="http://www.cs.uc.edu/">University of
 
Cincinnati</a>.  <a href="http://www.ebb.org/bkuhn/articles/thesis/">Kuhn's
 
Master's thesis</a> discussed methods for dynamic interoperability of Free
 
Software programming languages.  Kuhn received
 
the <a href="http://www.oscon.com/oscon2012/public/schedule/detail/25039">O'Reilly
 
Open Source Award in 2012</a>, in recognition for his lifelong policy work on
 
copyleft licensing.  Kuhn has <a href="http://ebb.org/bkuhn/blog/">a
 
blog</a> and co-hosts
 
the audcast, <a href="http://faif.us/"><cite>Free as in Freedom</cite></a>.</p>
 
  
 

 
<h2 id="allison">Dr. Allison Randal - Chair of the Board</h2>
 

	
 
<p> Over the course of multiple decades as a free software developer,
 
 Allison has worked in a wide variety of projects and domains, from
 
 games, linguistic analysis tools, websites, mobile apps, shipping
 
 fulfillment, and talking smart-home appliances, to programming language
 
 design, compilers, hypervisors, containers, deployment automation,
 
 database replication, operating systems and kernels, and hardware
 
 architectures and microarchitectures.</p>
 

	
 
<p>She is a board member at the Open Infrastructure Foundation, vice chair
 
 of the Microarchitecture Side Channels (Security) SIG at RISC-V
 
 International, and co-founder of the FLOSS Foundations group for free
 
 software community leaders. At various points in the past she has served
 
 as chair of the board at the Open Infrastructure Foundation, president
 
 and board member of the Open Source Initiative, president and board
 
 member of the Perl Foundation, board member of the Python Software
 
 Foundation, chair of the board at the Parrot Foundation, chief architect
 
 of the Parrot virtual machine, Open Source Evangelist at O’Reilly Media,
 
 conference chair of OSCON, Technical Architect of Ubuntu, Open Source
 
 Advisor at Canonical, Distinguished Technologist and Open Source
 
 Strategist at HP, and Distinguished Engineer at SUSE. She collaborates
 
 in the Debian and RISC-V projects, and currently works on free software
 
 and open hardware at Rivos.</p>
 

	
 
<h2 id="tony">Tony Sebro</h2>
 

	
 
<p>Tony currently serves as the Deputy General Counsel for
 
    the <a href="https://foundation.wikimedia.org/wiki/Home">Wikimedia
 
    Foundation</a>, where he manages the day-to-day operations of Wikimedia's
 
    legal department, and provide specific expertise on free and open source
 
    licensing, intellectual property, non-profit law, and privacy matters.
 
    Tony is also an organizer of
 
    Conservancy's <a href="https://outreachy.org">Outreachy</a> project,
 
    which provides paid internships in free and open source for people from
 
    groups traditionally underrepresented in tech.  Prior to joining
 
    Wikimedia, Tony served as General Counsel (and &ldquo;Employee #2&rdquo;)
 
    of Software Freedom Conservancy for over six years.  Tony has also spent
 
    time in the private sector with PCT Law Group and Kenyon &amp; Kenyon, and as
 
    an intellectual property licensing and business development professional
 
    with IBM.  Tony received an O'Reilly Open Source Award in 2017.  Tony is
 
    an active participant in and supporter of the non-profit community, and
 
    lives in the Bay Area with his family.</p>
 

	
 
{% endblock %}
conservancy/content/about/staff/index.html
Show inline comments
 
{% extends "base_about.html" %}
 
{% block subtitle %}Staff - {% endblock %}
 
{% block submenuselection %}Staff{% endblock %}
 
{% block content %}
 
<h1>Staff</h1>
 

	
 
<p>The staff are listed alphabetically by surname.</p>
 

	
 
<h2 id="dimesio">Rosanne DiMesio - Technical Bookkeeper</h2>
 

	
 
<p>Rosanne DiMesio is the Technical Bookkeeper at the Software Freedom
 
Conservancy where she handles incoming and outgoing accounting
 
activities for all its member projects as well as financial operations
 
for Conservancy itself. Rosanne has been volunteering with the Wine
 
Project since 2008 where she focuses on user support and documentation.
 
She has worked as an English teacher, a freelance writer and as IT
 
support. She is passionate about helping free software projects improve
 
their user experience. Rosanne received her Masters in Communication &amp;
 
Theater at the University of Illinois at Chicago and her Bachelor&rsquo;s
 
degree in English from the University of Chicago.</p>
 

	
 
<h2 id="denver">Denver Gingerich - Director of Compliance</h2>
 

	
 
<p>Denver manages SFC's license compliance work, including its technical parts
 
(such as triaging new reports and verifying complete corresponding source) as
 
well as planning and carrying out our enforcement strategy (with advice and
 
input from SFC's Executive Director and Policy Fellow).  Outside of SFC, Denver
 
also co-runs a FOSS business. Previously, Denver authored financial trading
 
software on Linux.  Denver writes free software in his spare time: his patches
 
have been accepted into Wine, Linux, and wdiff.  Denver received his BMath in
 
Computer Science from the University of Waterloo.  He gives presentations about
 
digital civil rights and how to ensure FOSS remains sustainable as a community
 
and financially, having spoken at conferences such as LinuxCon North America,
 
Texas Linux Fest, LibrePlanet, CopyCamp Toronto, FOSSLC's Summercamp,
 
CopyleftConf, and the Open Video Conference.</p>
 

	
 
<h2 id="tracy">Tracy Homer - Operations Manager</h2>
 
<p>Tracy acts as Operations Manager at Software Freedom Conservancy. 
 
<p>Tracy acts as Operations Manager at Software Freedom Conservancy.
 
Bringing her super-skills of organization and love of bureaucracy,
 
she helps things run at SFC smoothly behind the scenes.
 
Tracy also serves on the board of her local hackerspace, an organization
 
committed to teaching and promoting open technology exclusively.
 
She feels that open techonology allows people to express their creativity
 
regardless of their financial situation or technical background.
 
Tracy is currently persuing a degree in GIS from the University of Tennessee.</p>
 

	
 

	
 
<h2 id="bkuhn">Bradley M. Kuhn - Policy Fellow and Hacker-in-Residence</h2>
 

	
 
<p><a href="http://ebb.org/bkuhn/">Bradley M. Kuhn</a> is
 
the <a href="https://sfconservancy.org/about/staff/#bkuhn">Policy Fellow and
 
Hacker-in-Residence</a> at <a href="https://sfconservancy.org/">Software Freedom
 
Conservancy</a> and editor-in-chief
 
of <a href="https://copyleft.org">copyleft.org</a>. Kuhn began his work in
 
the software freedom movement as a volunteer in 1992, when he became an early
 
adopter of Linux-based systems, and began contributing to various Free
 
Software projects, including Perl.  He worked during the 1990s as a system
 
administrator and software developer for various companies, and taught AP
 
Computer Science at Walnut Hills High School in Cincinnati.  Kuhn's
 
non-profit career began in 2000, when he was hired by the FSF.  As FSF's
 
Executive Director from 2001&ndash;2005, Kuhn
 
led <a href="https://www.fsf.org/licensing">FSF's GPL enforcement</a>,
 
launched <a href="https://www.fsf.org/associate/">its Associate Member
 
program</a>, and invented
 
the <a href="http://www.gnu.org/licenses/agpl-3.0.html">Affero GPL</a>.  Kuhn
 
began as Conservancy's primary volunteer from 2006–2010, and became its first
 
staff person in 2011.  Kuhn holds a summa cum laude B.S. in Computer Science
 
from <a href="http://www.loyola.edu/academic/computerscience">Loyola
 
University in Maryland</a>, and an M.S. in Computer Science from
 
the <a href="http://www.cs.uc.edu/">University of
 
Cincinnati</a>.  <a href="http://www.ebb.org/bkuhn/articles/thesis/">Kuhn's
 
Master's thesis</a> discussed methods for dynamic interoperability of Free
 
Software programming languages.  Kuhn received
 
the <a href="http://www.oscon.com/oscon2012/public/schedule/detail/25039">O'Reilly
 
Open Source Award in 2012</a>, in recognition for his lifelong policy work on
 
copyleft licensing.  Kuhn has <a href="http://ebb.org/bkuhn/blog/">a
 
blog</a> and co-hosts
 
the audcast, <a href="http://faif.us/"><cite>Free as in
 
Freedom</cite></a>.</p>
 

	
 
<h2 id="rick">Rick Sanders - General Counsel</h2>
 

	
 
<p>Rick Sanders, has over 20 years' experience as a intellectual-property
 
litigator. He started his legal career at Fenwick & West's Silicon Valley
 
office, then moved to Nashville to join Waller,   before co-founding Aaron &
 
Sanders, with the goal of providing sophisticated legal services to technology
 
clients in Middle Tennessee. Rick also taught copyright law at Vanderbilt
 
University School of Law, and he co-produced The Copyright Office   Comes to
 
Music City for many years. He is also a past chair of the American Bar
 
Association's Trademarks and the Internet   committee, and the Nashville Bar
 
Association's Intellectual Property Section. He is admitted to the bar of the
 
States of California and Tennessee, as well as the U.S. Court of Appeal for the
 
Sixth and Ninth Circuits and all U.S. District Courts in California and
 
Tennessee. Before becoming a lawyer, Rick was a college instructor in English
 
composition and literature, especially Shakespeare. He is a native of Mountain
 
View, California and now lives in Nashville.</p>
 

	
 
<h2 id="karen">Karen M. Sandler - Executive Director</h2>
 

	
 
<p>Karen M. Sandler is an attorney and the executive director of Software Freedom
 
Conservancy, a 501c3 nonprofit organization focused on ethical technology. As
 
a patient deeply concerned with the technology in her own body, Karen is known
 
as a cyborg lawyer for her advocacy for free software as a life-or-death
 
issue, particularly in relation to the software on medical devices. She
 
co-organizes Outreachy, the award-winning outreach program for people who face
 
under-representation, systemic bias, or discrimination in tech. She is an
 
adjunct Lecturer-In-Law of Columbia Law School and a visiting scholar at
 
University of California Santa Cruz.</p>
 

	
 
<p>Prior to joining Software Freedom Conservancy, Karen was the executive
 
director of the GNOME Foundation. Before that, she was the general counsel of
 
the Software Freedom Law Center. She began her career as a lawyer at Clifford
 
Chance and Gibson, Dunn & Crutcher LLP.</p>
 

	
 
<p>Karen received her law degree from Columbia Law School where she was a James
 
Kent Scholar and co-founder of the Columbia Science and Technology Law Review.
 
She also holds a bachelor of science in engineering from
 
The Cooper Union for the Advancement of Science and Art.</p>
 

	
 
<p>Sandler has won awards for her work on behalf of software freedom, including
 
the O’Reilly Open Source Award in 2011. She received an honorary doctorate
 
from KU Leuven in 2023.</p>
 

	
 
<h2 id="sage">Sage Sharp - Senior Director of Diversity & Inclusion</h2>
 
<p>Sage Sharp is the Senior Director of Diversity & Inclusion at the Software
 
Freedom Conservancy. Sage runs Outreachy, which is Conservancy's diversity
 
initiative that provides paid, remote internships to people who are subject to
 
systemic bias or impacted by underrepresentation in tech. Sage is a
 
long-standing free software contributor, and is known for their work as a
 
Linux kernel maintainer for seven years. They also founded their own company,
 
Otter Tech, which has trained over 400 people on how to enforce a Code of
 
Conduct.</p>
 

	
 
<h2 id="pono">Daniel Pono Takamori - Community Organizer & Non-Profit Problem Solver</h2>
 
<p>Pono joined Conservancy to help fill a community need for bridging technical
 
and non-technical roles. Having worked at FOSS foundations and organizations
 
for over a decade, his background in FOSS infrastructure led him to think more
 
deeply about how to better use community intelligence instead of technology
 
to solve governance questions. He is passionate about making FOSS a more
 
equitable and inclusive space. With a background in mathematics and physics,
 
he looks forward to mobilizing social intelligence and community goveranance
 
as a basis for solving both technical and non-technical problems.</p>
 

	
 
<h2 id="paul">Paul Visscher - Systems Administrator</h2>
 
<p>Paul has been using Linux and FOSS for over 26 years and working as a sysadmin
 
for over 20 years. Having fallen in love with computers at a young age, he
 
found it intellectually intersting and found the FOSS world an incredible
 
and natural place to learn. He brings a passion for how free and open source
 
software can make our society a much more equitable place, and work for us
 
rather than against us. </p>
 

	
 
{% endblock %}
conservancy/content/copyleft-compliance/about.html
Show inline comments
 
{% extends "base_compliance.html" %}
 
{% block subtitle %}Copyleft Compliance Projects - {% endblock %}
 
{% block submenuselection %}CopyleftCompliance{% endblock %}
 
{% block content %}
 
<h1 id="ourwork">Conservancy's Copyleft Compliance Projects</h1>
 

	
 
<p>As existing donors and sustainers know, the Software Freedom Conservancy
 
  is a 501(c)(3) non-profit charity registered in New York, and Conservancy
 
  helps people take control of their computing by growing the software
 
  freedom movement, supporting community-driven alternatives to proprietary
 
  software, and defending free software with practical initiatives.
 
  Conservancy accomplishes these goals with various initiatives, including
 
  defending and upholding the rights of software users and consumers under
 
  copyleft licenses, such as the GPL.</p>
 

	
 
<p>Free and open source software (FOSS) is everywhere and in everything; yet
 
our software freedom is constantly eroded.  With the help of its
 
volunteers, <a href="/members/current/">member projects</a>,
 
and <a href="/about/staff/">staff</a>, Conservancy stands up for users'
 
software freedom via its copyleft compliance work.</p>
 

	
 
<p>Conservancy's primary work in copyleft compliance currently focuses on
 
our <a href="/copyleft-compliance/enforcement-strategy.html">Strategic GPL
 
Enforcement Initiative</a>.  This initiative, <a href="/news/2020/oct/01/new-copyleft-strategy-launched-with-ARDC-grant/">launched in October 2020</a>,
 
represents the culmination of nearly 15 years of compliance work of
 
Conservancy spanning ten different fiscally sponsored projects, past lawsuits
 
against more than a dozen defendants, and hundreds of non-litigation
 
compliance actions.</p>
 

	
 
<p>For these many years, Conservancy has always given the benefit of the
 
  doubt to companies who exploited our good nature and ultimately simply
 
  ignore the rights of users and consumers.  In that time, the compliance
 
  industrial complex has risen to a multi-million-dollar industry &mdash;
 
  selling (mostly proprietary) products, services, and consulting to
 
  companies.  Yet, these compliance efforts ignore consistently the most
 
  essential promise of copyleft &mdash; the complete, Corresponding Source
 
  and &ldquo;the scripts used to control compilation and installation of the
 
  executable&rdquo;.</p>
 

	
 
<p>We encourage our sustainers and software freedom enthusiasts everywhere to
 
  <a href="/copyleft-compliance/enforcement-strategy.html">read our detailed
 
  strategic plan for GPL enforcement</a> and its companion
 
  project, <a href="/copyleft-compliance/firmware-liberation.html">our
 
    Firmware Liberation Project</a>.</p>
 

	
 
<h2 id="projects">Compliance Relationship to Fiscally Sponsored Projects</h2>
 

	
 
<p>Historically, Conservancy was well-known for its ongoing license
 
compliance efforts on behalf of its BusyBox member project.  Today,
 
Conservancy does semi-regular compliance work for its BusyBox, Git, Inkscape,
 
Mercurial, Samba, QEMU and Wine member projects.  If you are a copyright
 
holder in any member project of Conservancy, please contact the project's
 
leadership committtee,
 
via <a href="mailto:PROJECTNAME@sfconservancy.org">&lt;PROJECTNAME@sfconservancy.org&gt;</a>
 
for more information on getting involved in compliance efforts in that
 
project.
 
</p>
 

	
 
<h2 id="linux">GPL Compliance Project For Linux Developers</h2>
 

	
 
<p>In May
 
2012, <a href="/news/2012/may/29/compliance/">Conservancy
 
launched</a> the <cite>GPL
 
Compliance Project for Linux Developers</cite>, which handles compliance and
 
enforcement activities on behalf of more than a dozen Linux copyright
 
holders.</p>
 
 
 

 
<p>The GPL Compliance Project for Linux Developers is comprised of copyright
 
holders in the kernel, Linux, who have contributed to Linux under its
 
license, <a href="http://www.gnu.org/licenses/gpl-2.0.html">the
 
GPLv2</a>. These copyright holders have formally asked Conservancy to engage
 
in compliance efforts for their copyrights in the Linux kernel.  In addition,
 
some developers have directly assigned their copyrights on Linux to Conservancy,
 
so Conservancy also enforces the GPL on Linux via its own copyrights in Linux.</p>
 

	
 
<p>Linux copyright holders who wish to assign copyright to or sign an enforcement agreement with
 
Conservancy should
 
  contact <a href="mailto:linux-services@sfconservancy.org">&lt;linux-services@sfconservancy.org&gt;</a>.
 
  In 2016,
 
  Conservancy <a href="/news/2016/nov/03/linux-compliance-agreements/">made
 
    public the template agreements used as part of this project</a>; both the
 
  <a href="/docs/blank_linux-enforcement-agreement.pdf">non-anonymous</a> and
 
  <a href="/docs/blank_anonymous-linux-enforcement-agreement.pdf">anonymous</a>
 
  versions are available.  However, please <strong>do not</strong> sign these
 
  unilaterally without contacting and discussing
 
  with <a href="mailto:linux-services@sfconservancy.org">&lt;linux-services@sfconservancy.org&gt;</a>
 
  first.</p>
 

	
 
<h2 id="debian">The Debian Copyright Aggregation Project</h2>
 

	
 
<p>In August 2015, <a href="/news/2015/aug/17/debian/">Conservancy announced the Debian Copyright Aggregation
 
Project</a>.  This project allows Debian contributors to assign copyrights to
 
Conservancy, or sign enforcement agreements allowing Conservancy to enforce
 
Free and Open Source (FOSS) licenses on their behalf.  Many Debian contributors
 
have chosen each of these options already, and more continue to join.</p>
 

	
 
<p>Debian contributors who wish to assign copyright to or sign an enforcement agreement with
 
Conservancy should contact <a href="mailto:debian-services@sfconservancy.org">&lt;debian-services@sfconservancy.org&gt;</a>.</p>
 

	
 
<h2 id="commitment">Conservancy's Commitment to Copyleft License Compliance</h2>
 

	
 
<p>Conservancy is dedicated to encouraging all users of software to comply
 
  with Free Software licenses. Toward this goal, in its compliance efforts,
 
  Conservancy helps distributors of Free Software in a friendly spirit of
 
  cooperation and participation.  In this spirit, Conservancy has co-published,
 
  with the Free Software Foundation (FSF), <a href="/copyleft-compliance/principles.html">the principles that both organizations
 
  follow in their compliance efforts</a>.
 
  </p>
 

	
 
{% endblock %}
conservancy/content/copyleft-compliance/enforcement-strategy.html
Show inline comments
 
{% extends "base_compliance.html" %}
 
{% block subtitle %}Copyleft Compliance Projects - {% endblock %}
 
{% block submenuselection %}EnforcementStrategy{% endblock %}
 
{% block content %}
 

	
 
<h1 id="strategic-gpl-enforcement-initiative">The Strategic GPL Enforcement Initiative</h1>
 

	
 
<p>As existing donors and sustainers know, the Software Freedom Conservancy
 
  is a 501(c)(3) non-profit charity registered in New York, and Conservancy
 
  helps people take control of their computing by growing the software
 
  freedom movement, supporting community-driven alternatives to proprietary
 
  software, and defending free software with practical initiatives.
 
  Conservancy accomplishes these goals with various initiatives, including
 
  defending and upholding the rights of software users and consumers under
 
  copyleft licenses, such as the <acronym title="General Public License">GPL</acronym>.</p>
 

	
 
<h2 id="brief-history-of-user-focused-gpl-enforcement">Brief History of
 
  User-Focused GPL Enforcement</h2>
 

	
 
<p>The spring of 2003 was a watershed moment for software freedom on
 
  electronic devices. 802.11 wireless technology had finally reached the
 
  mainstream, and wireless routers for home use had flooded the market
 
  earlier in the year. By June
 
  2003, <a href="https://hardware.slashdot.org/story/03/06/08/1749217/is-linksys-violating-the-GPL">the
 
  general public knew that Linksys (a division of Cisco) was violating the
 
  GPL</a> on their WRT54G model wireless routers. Hobbyists discovered
 
  (rather easily) that Linux and BusyBox were included in the router, but
 
  Linksys and Cisco had failed to provide source code or any offer for source
 
  code to its customers.</p>
 

	
 
<p>A coalition formed made up of organizations and individuals — including
 
  Erik Andersen (major contributor to and former leader of the BusyBox
 
  project) and Harald Welte (major contributor to Linux’s netfilter
 
  subsystem) — to enforce the
 
  GPL. <a href="https://sfconservancy.org/about/staff/#bkuhn">Bradley
 
  M. Kuhn</a>, who is now Conservancy’s Policy Fellow and
 
  Hacker-in-Residence, led and coordinated that coalition (when he was
 
  Executive Director of the <acronym title="Free Software Foundation">FSF</acronym>). By early 2004, this coalition, through the
 
  process of GPL enforcement, compelled Linksys to release an
 
  almost-GPL-compliant source release for the
 
  WRT54G. A <a href="https://openwrt.org/about/history">group of volunteers
 
  quickly built a new project, called OpenWrt</a> based on that source
 
  release. In the years that have followed, OpenWrt has been ported to almost
 
  every major wireless router product.  Now, more than 15 years later, the
 
  OpenWrt project routinely utilizes GPL source releases to build, improve
 
  and port OpenWrt.  The project has also joined coalitions to fight the FCC
 
  to ensure that consumers have and deserve rights to install modified
 
  firmwares on their devices and that such hobbyist improvements are no
 
  threat to spectrum regulation.</p>
 

	
 
<p>Recently, <a href="https://sfconservancy.org/news/2020/sep/10/openwrt-joins/">OpenWrt joined Conservancy as one its member projects</a>,
 
  and Conservancy has committed to long-term assistance to this project.</p>
 

	
 
<p>OpenWrt has spurred companies to create better routers and other wireless
 
  devices than such companies would otherwise have designed because they now need to
 
  either compete with hobbyists, or (better still) cooperate with those hobbyists to
 
  create hardware that fully supports OpenWrt’s features and improvements
 
  (such as dealing
 
  with <a href="https://openwrt.org/docs/guide-user/network/traffic-shaping/sqm">the
 
  dreaded “bufferbloat” bugs</a>). This interplay between the hobbyist
 
  community and for-profit ventures promotes innovation in
 
  technology. Without both permission <em>and</em> the ability to build and
 
  modify the software on their devices, the hobbyist community
 
  shrinks. Without intervention to ensure companies respect the hobbyist
 
  community, hobbyists are limited by the oft-arbitrary manufacturer-imposed
 
  restraints in the OEM firmware. OpenWrt saved the wireless router market
 
  from this disaster; we seek to help other embedded electronic subindustries
 
  avoid that fate. The authors of GPL’d software chose that license so its
 
  source is usable and readily available to hobbyists. It is our duty, as
 
  activists for the software freedom of hobbyists, to ensure these legally
 
  mandated rights are never curtailed.</p>
 

	
 
<p>(More on the OpenWrt project’s history and its connection to GPL
 
  enforcement can be found
 
  in <a href="https://www.youtube.com/watch?v=r4lCMx-EI1s">Kuhn’s talk
 
    at <em>OpenWrt Summit 2016</em></a>.)</p>
 

	
 
<p>Conservancy has had substantial success in leveraging more device freedom
 
  in other subindustries through GPL compliance. In 2009, Conservancy, with
 
  co-Plaintiff Erik Andersen, sued fourteen defendants in federal court under
 
  copyright claims on behalf of its BusyBox member project. Conservancy 
 
  copyright claims on behalf of its BusyBox member project. Conservancy
 
  achieved compliance for the BusyBox project in all fourteen
 
  cases. Most notably, the GPL-compliant source release obtained in the
 
  lawsuit for certain Samsung televisions provided the basis for
 
  the <a href="https://www.samygo.tv/">SamyGo project</a> — an alternative
 
  firmware that works on that era of Samsung televisions and allows consumers
 
  to modify and upgrade their firmware using FOSS.</p>
 

	
 
<p>Harald Welte also continued his efforts during the early and mid-2000s,
 
  after the Linksys enforcement, through
 
  his <a href="https://gpl-violations.org/">gpl-violations.org
 
    project</a>. Harald successfully sued many companies (mostly in the
 
  wireless router industry) in Germany to achieve compliance and yield source
 
  releases that helped OpenWrt during that period.</p>
 

	
 
<h2 id="importance-of-linux-enforcement-specifically">Importance of Linux Enforcement Specifically</h2>
 

	
 
<p>In recent years, embedded systems technology has expanded beyond wireless
 
  routers to so-called “Internet of Things” (IoT) devices designed for
 
  connectivity with other devices in the home and to the “Cloud”. Consumer
 
  electronics companies now feature and differentiate products based on
 
  Internet connectivity and related services. Conservancy has seen
 
  Linux-based firmwares on refrigerators, baby monitors, virtual assistants,
 
  soundbars, doorbells, home security cameras, police body cameras, cars, AV
 
  receivers, and televisions.</p>
 

	
 
<p>This wide deployment of general purpose computers into
 
  mundane household devices raises profound privacy and consumer rights
 
  implications. <a href="https://www.nytimes.com/2019/12/15/us/Hacked-ring-home-security-cameras.html">Home</a> <a href="https://www.washingtonpost.com/technology/2019/01/23/family-says-hacked-nest-camera-warned-them-north-korean-missile-attack/">security</a> <a href="https://www.npr.org/sections/thetwo-way/2018/06/05/617196788/s-c-mom-says-baby-monitor-was-hacked-experts-say-many-devices-are-vulnerable">cameras</a> <a href="https://www.cnn.com/2019/12/12/tech/ring-security-camera-hacker-harassed-girl-trnd/index.html">are</a> <a href="https://abc7.com/baby-monitor-hack-leads-to-kidnap-scare/4931822/">routinely</a> <a href="https://www.bbc.com/news/av/uk-44117337/security-footage-viewed-by-thousands">compromised</a>
 
  — invading the privacy and security of individual homes. Even when
 
  companies succeed in keeping out third parties, consumers
 
  are <a href="https://www.theguardian.com/technology/2019/aug/29/ring-amazon-police-partnership-social-media-neighbor">pressured
 
  by camera makers</a> to automatically upload their videos to local
 
  police. Televisions
 
  routinely <a href="https://techcrunch.com/2019/01/07/vizio-settlement-moves-forward/">spy
 
  on consumers for the purposes of marketing and massive data
 
  collection</a>.</p>
 

	
 
<p>There is one overarching irony to this growing dystopia: nearly all these
 
  devices are based primarily on GPL'd software: most
 
  notably, Linux. While Linux-based systems do allow proprietary user-space
 
  applications (i.e., not licensed under GPL), the kernel and many other system
 
  utilities routinely used in embedded systems, such as Conservancy’s BusyBox
 
  project, are under that license (or similar copyleft licenses such as the
 
  LGPL). These licenses require device makers to provide complete,
 
  corresponding source code to everyone in possession of their
 
  devices. Furthermore, Linux’s specific license (GPL, version 2), mandates
 
  that source code must also include “the scripts used to control compilation
 
  and installation of the executable”. In short, the consumers must receive
 
  all the source code and the ability to modify, recompile and reinstall that
 
  software. Upholding of this core freedom for Linux made OpenWrt
 
  possible. We work to preserve (or, more often, restore) that software
 
  freedom for consumers of other types of electronic devices.</p>
 

	
 
<p>When devices are compliant with the GPL’s requirements, customers can
 
  individually or collectively take action against the surveillance and other
 
  predatory behavior perpetuated by the manufacturers of these devices by
 
  modifying and replacing the software. Hobbyists can aid their community by
 
  providing these alternatives. People with no technical background already
 
  replace firmware on their wireless routers with OpenWrt to both improve
 
  network performance and allay privacy concerns. Furthermore, older
 
  equipment is often saved from planned obsolescence by alternative
 
  solutions. E-recyclers
 
  like <a href="https://www.freegeek.org/">Freegeek</a> do this regularly for
 
  desktop and laptop machines with GNU/Linux distributions like Debian, and
 
  with OpenWrt for wireless routers. We seek to ensure they can do this for
 
  other types of electronic products. However, without the complete,
 
  corresponding source code (CCS), including the scripts to control its compilation and
 
  installation, the fundamental purpose of copyleft is frustrated. Consumers,
 
  hobbyists, non-profit e-recyclers and the general public are left without
 
  the necessary tools they need and deserve, and which the license promises
 
  them.</p>
 

	
 
<p>Additionally, copyleft compliance relates directly to significant
 
  generational educational opportunities. There are few easier ways to
 
  understand technology than to experiment with a device one already
 
  has. Historically, FOSS has succeeded because young hobbyists could
 
  examine, modify and experiment with software in their own devices. Those
 
  hobbyists became the professional embedded device developers of today!
 
  Theoretically, the advent of the “Internet of Things” — with its many
 
  devices that run Linux — <em>should</em> give opportunities for young
 
  hobbyists to quickly explore and improve the devices they depend on in
 
  their every day lives.  Yet, that’s rarely possible in reality.  To ensure
 
  that both current and future hobbyists can practically modify their
 
  Linux-based devices, we must enforce Linux’s license. With public awareness
 
  that their devices can be improved, the desire for learning will increase,
 
  and will embolden the curiosity of newcomers of all ages and
 
  backgrounds. The practical benefits of this virtuous cycle are immediately
 
  apparent. With technological experimentation, people are encouraged to try
 
  new things, learn how their devices work, and perhaps create whole new
 
  types of devices and technologies that no one has even dreamed of
 
  before.</p>
 

	
 
<p>IoT firmware should never rely on one vendor — even the vendor of the
 
  hardware itself. This centralized approach is brittle and inevitably leads
 
  to invasions of the public’s privacy and loss of control of their
 
  technology. Conservancy’s GPL enforcement work is part of the puzzle that
 
  ensures users can choose who their devices connect to, and how they
 
  connect. Everyone deserves control over their own computing — from their
 
  laptop to their television to their toaster. When the public can modify (or
 
  help others modify) the software on their devices, they choose the level of
 
  centralized control they are comfortable with. Currently, users with
 
  Linux-based devices usually don’t even realize what is possible with
 
  copyleft; Conservancy aims to show them.</p>
 

	
 
<h2 id="the-gpl-compliance-project-for-linux-developers">The GPL Compliance
 
  Project for Linux Developers</h2>
 

	
 
<p>In May 2012, Software Freedom Conservancy
 
  formed <a href="https://sfconservancy.org/copyleft-compliance/#linux">The GPL
 
    Compliance Project for Linux Developers</a> in response to frustration by
 
  upstream Linux developers about the prevalence of noncompliance in the
 
  field, and their desire to stand with Conservancy’s BusyBox, Git and Samba
 
  projects in demanding widespread GPL compliance. This coalition of Linux
 
  developers works with Conservancy to enforce the GPL for the rights of
 
  Linux users everywhere — particularly consumers who own electronic
 
  devices. We accept violation reports from the general public, and
 
  prioritize enforcement in those classes of devices where we believe that we
 
  can do the most good to help achieve GPL compliance that will increase
 
  software freedom for the maximum number of device users.</p>
 

	
 
<h2 id="the-need-for-litigation">The Need for Litigation</h2>
 

	
 
<p>While we still gain some success, we have found that the landscape of GPL
 
  compliance has changed in recent years. Historically, the true “bad actors”
 
  were rare. We found in the early days that mere education and basic
 
  supply-chain coordination assistance yielded compliance. We sought and
 
  often achieved goodwill in the industry via education-focused
 
  compliance.</p>
conservancy/content/copyleft-compliance/firmware-liberation.html
Show inline comments
 
{% extends "base_compliance.html" %}
 
{% block subtitle %}Copyleft Compliance Projects - {% endblock %}
 
{% block submenuselection %}LiberateFirmware{% endblock %}
 
{% block content %}
 

	
 
<h1 id="software-freedom-conservancy-proposal-for-firmware-liberation-project">Firmware Liberation Project</h1>
 

	
 
<p>Conservancy plans to select a class of product in the Linux-based embedded
 
system space.  For this product, Conservancy will launch, or assist, a
 
project that creates a functioning alternative firmware for those devices.
 
The promise of GPL enforcement is only realized through actual, practical use
 
and improvement of the released software for users.</p>
 

	
 
<h2 id="gpl-enforcement-needs-follow-through">GPL Enforcement Needs Follow-Through</h2>
 

	
 
<p>Simply enforcing the GPL is an important first step, and Conservancy
 
  <a href="enforcement-strategy.html">continues our efforts in that
 
  regard</a>. However, we can
 
  replicate <a href="/copyleft-compliance/enforcement-strategy.html#brief-history-of-user-focused-gpl-enforcement">the
 
  success found with OpenWrt</a> <em>only by</em> a substantial
 
  effort <strong>after</strong> enforcement occurs to turn the compliant
 
  source release into a viable alternative firmware for the platform.</p>
 
                                           
 

 
<p>Conservancy has seen non-compliant Linux-based firmwares on refrigerators,
 
  baby monitors, virtual assistants, soundbars, doorbells, home security
 
  cameras, police body cameras, cars, AV receivers, and televisions.  We
 
  believe that building an alternative firmware for one of these classes of
 
  devices &mdash; or joining our work with an existing alternative firmware project
 
  that is struggling due to lack of sources available &mdash; will lead to
 
  more palpable software freedom for users of these device.</p>
 

	
 

	
 
<h2 id="limited-success-of-alternative-hardware">Limited Success of
 
  Alternative Hardware</h2>
 

	
 
<p>Alternative hardware projects remain an essential component of small
 
  device freedom. Conservancy supports and engages with communities that seek
 
  to source and build IoT-style devices from the ground up. We’re excited to
 
  see deployable boards that allow Maker efforts to create new devices.</p>
 

	
 
<p>Nevertheless, we remain ever-cognizant that FOSS succeeded on servers,
 
  laptop, desktop, and wireless router computers <em>precisely</em> because
 
  users could buy commodity hardware at any store and install FOSS
 
  alternatives to the vendor-provided software.  Throughout the history of
 
  FOSS, most new users who seek to experience software freedom want to do so
 
  with their existing devices first.  Many don't even know much about the
 
  issues involved in software liberation <em>until they've already purchased
 
  hardware</em>.  Conservancy therefore believes support of alternative
 
  firmwares for such devices is paramount.</p>
 

	
 
<h3 id="demonstrating-the-power-of-software-freedom">Demonstrating the power
 
  of software freedom</h3>
 

	
 
<p>To many, the benefits of software freedom are abstract. For less technical
 
  users, the idea of modifying or even reviewing the software on their
 
  devices is wholly theoretical. For technical users, there is a limited time
 
  available to invest in the devices they use for their everyday
 
  lives. Bringing people together to take collective action for the control
 
  of their own technology is a powerful proposition that has rarely been
 
  demonstrated.</p>
 

	
 
<p>When alternative firmware projects like OpenWrt exist for IoT devices,
 
  non-technical users can replace the software on their devices and benefit
 
  from custom, community-controlled software. Technical users are more likely
 
  to contribute knowing their efforts will be meaningful.</p>
 

	
 
<p>However, decades of corporate involvement in copyleft have demonstrated
 
  that without an organized effort, control over one’s own software is purely
 
  theoretical, even when software has a copyleft license, and
 
  sometimes <em>even when</em> compliance with the copyleft license is
 
  acheived. Conservancy recognizes that there is a unique opportunity for
 
  charitable organizations to step in and change the power dynamic of the
 
  tech industry for consumers.</p>
 

	
 
<h2 id="conservancys-plan-for-action">Conservancy’s Plan For Action</h2>
 

	
 
<p>Conservancy seeks to fund work on liberating firmware for a specific
 
  device. This is accomplished with a two-prong approach: first, we will
 
  leverage increased interest and tendency toward GPL compliance throughout
 
  the embedded industry to more quickly achieve compliant source releases in
 
  a particular subindustry.</p>
 

	
 
<p>Second, depending on what subindustry (i.e., specific class of devices)
 
  seems most responsive to increased enforcement activity and willing to
 
  provide compliant source releases quickly, we will launch, coordinate and
 
  fund an alternative firmware project for that class, or, if appropriate,
 
  merge our efforts with an existing alternative firmware project for that
 
  class of device.</p>
 

	
 
<h2 id="leveraging-on-increased-enforcement">Leveraging on Increased
 
  Enforcement</h2>
 

	
 
<p><a href="enforcement-strategy.html">Conservancy already plans to select a
 
  specific violation and engage in litigation.</a> Based on past experience,
 
  we expect that the press and attention to that ongoing litigation will
 
  yield increased responsiveness by violators throughout the industry. (A
 
  similar outcome occurred after our BusyBox-related litigation in 2006.)
 
  This expected change in behavior will open opportunities to replicate the
 
  OpenWrt approach in another embedded electronic subindustry. Fast action
 
  will be necessary; most IoT products have an 18 month lifecycle, so we seek
 
  to quickly identify the right subindustry, gain compliance there, and move
 
  on to the next phase.</p>
 

	
 
<h3 id="funding-firmware-liberation">Funding Firmware Liberation</h3>
 

	
 
<p>While we’ve long hoped that volunteers would take up compliant sources
 
  obtained in our GPL enforcement efforts and build alternative firmware
 
  projects as they did with OpenWrt, history shows us that the creation of
 
  such projects is not guaranteed and exceedingly rare.</p>
 

	
 
<p>Traditionally, our community has relied exclusively on volunteers to take
 
  up this task, and financial investment only comes after volunteers have put
 
  in the unfunded work to make a Minimum Viable Product (MVP) liberated
 
  firmware. While volunteer involvement remains essential to the success of
 
  alternative firmware projects, we know from our fiscal sponsorship work
 
  that certain aspects of FOSS projects require an experienced charity to
 
  initiate and jump-start some of the less exciting aspects of FOSS project
 
  creation and development. (In our last fiscal year, Conservancy funded 160
 
  contributors to work on FOSS.)</p>
 

	
 
<p>In the initial phase, Conservancy will select a specific
 
  class of device. Upon achieving compliant source releases in that
 
  subindustry through GPL enforcement, Conservancy will launch an alternative
 
  firmware project for that class of device.</p>
 

	
 
<p>Conservancy will seek to fund the time of project leaders and
 
  infrastructure for the project. The goal is to build a firm base that draws
 
  volunteers to the project. We know that sustaining funding over long
 
  periods for a grassroots hobbyist activity is quite challenging; we seek to
 
  bootstrap and catalyze interest and contribution to the project. Ideally,
 
  Conservancy would run the project with a single full-time staffer for about
 
  a year, and achieve a volunteer base sufficient to reduce funding to one
 
  part-time staffer.</p>
 

	
 
<h3 id="criteria-for-device-selection">Criteria for Device Selection</h3>
 

	
 
<p>The IoT device industry moves quickly and we must be prepared to adapt
 
  based on new information. The first stage in this work will be to carefully
 
  evaluate and select the device on which to focus for this
 
  project. Conservancy will evaluate the following criteria in selecting a
 
  class of devices:</p>
 

	
 
<ul>
 
<li><p>Do most devices in the subindustry already run a known FOSS system
 
    (such as Android/Linux, BusyBox/Linux or GNU/Linux)?</p></li>
 

	
 
<li><p>In response to our increased enforcement activity, how many existing
 
    GPL-compliant source releases are available from how many different
 
    vendors in this subindustry?</p></li>
 

	
 
<li><p>Is there a known userspace application that runs on Maker-built
conservancy/content/copyleft-compliance/help.html
Show inline comments
 
{% extends "base_compliance.html" %}
 
{% block subtitle %}Copyleft Compliance Projects - {% endblock %}
 
{% block submenuselection %}HelpComply{% endblock %}
 
{% block content %}
 
<h1 id="ourwork">Help Defend Software Freedom and Rights</h1>
 

	
 
<p>Folks often ask us how they can help us defend the software freedoms and
 
  rights that copyleft makes possible.  There are lots of ways to help and we
 
  believe that the entire public can help.</p>
 

	
 
<h2 id="request">Request Source Code</h2>
 

	
 
<p>All versions of the GPL and LGPL allow companies to make an <em>offer</em>
 
    for Complete, Corresponding Source (CCS) <em>rather than</em> giving you
 
    the CCS outright with the product.  Sadly, <strong>many</strong>
 
    companies make an offer with no intention of actually providing that CCS
 
    to you.  As consumers, you have a right to that source code.  Look in
 
    every manual and &ldquo;Legal Notices&rdquo; section of every product you
 
    buy.  If you see an offer, follow the instructions and <strong>request
 
    that CCS</strong>!  If you don't get it, or they give you the run-around,
 
    then <a href="#reporting">report the violation to us</a>!</p>
 

	
 
<h2 id="reporting">Reporting GPL Violations To Us</h2>
 

	
 
<p>If you are aware of a license violation or compliance issue regarding any
 
  copyleft license, such as the AGPL, GPL or LGPL,
 
  please <a href="mailto:compliance@sfconservancy.org">contact us by email at
 
  &lt;compliance@sfconservancy.org&gt;</a>.</p>
 

	
 
<!--- FIXME: bkuhn is rewriting this blog post fresh the weekend of --
 
      2020-07-18 so we need not link to ebb.org anymore when we roll out
 
      these changes ... which never happened, still need to do that --> 
 
      these changes ... which never happened, still need to do that -->
 

	
 
<p>If you think you've found a GPL violation, we encourage you to
 
   read <a href="http://ebb.org/bkuhn/blog/2009/11/08/gpl-enforcement.html">this
 
   personal blog post by our Policy Fellow, Bradley M. Kuhn</a>, about good
 
   practices in discovering and reporting GPL violations.</p>
 
   
 

 
<h2 id="sustain">Donate to Sustain This Work</h2>
 

	
 
<p>Finally, Conservancy welcomes <a href="#donate-box"
 
  class="donate-now">donations</a> in support of our copyleft compliance work,
 
  and we encourage you to become a <a href="/sustainer/">an official
 
  Sustainer of Software Freedom Conservancy</a>. </p>
 
{% endblock %}
conservancy/content/copyleft-compliance/vizio-filing-press-release.html
Show inline comments
...
 
@@ -5,135 +5,135 @@
 

	
 
<h1>Software Freedom Conservancy files right-to-repair lawsuit against California TV manufacturer Vizio Inc. for alleged GPL violations</h1>
 
<h2>Litigation is historic in nature due to its focus on consumer rights, filing as third-party beneficiary</h2>
 

	
 
<p><strong>FOR IMMEDIATE RELEASE</strong></p>
 

	
 
<p>IRVINE, Calif. (Oct. 19, 2021) Software Freedom Conservancy announced today
 
it has filed a lawsuit against Vizio Inc. for what it calls repeated failures
 
to fulfill even the basic requirements of the General Public License (GPL).</p>
 

	
 

	
 
<p>The lawsuit alleges that Vizio’s TV products, built on its SmartCast system,
 
contain software that Vizio unfairly appropriated from a community of
 
developers who intended consumers to have very specific rights to modify,
 
improve, share, and reinstall modified versions of the software.</p>
 

	
 

	
 
<p>The GPL is a copyleft license that ensures end users the freedom to run,
 
study, share, and modify the software. Copyleft is a kind of software
 
licensing that leverages the restrictions of copyright, but with the intent
 
to promote sharing (using copyright licensing to freely use and repair
 
software).</p>
 

	
 
<p>Software Freedom Conservancy, a nonprofit organization focused on ethical
 
technology, is filing the lawsuit as the purchaser of a product which has
 
copylefted code. This approach makes it the first legal case that focuses on
 
the rights of individual consumers as third-party beneficiaries of the GPL.
 

	
 
<p>&ldquo;That’s what makes this litigation unique and historic in terms of
 
defending consumer rights,&rdquo; says Karen M. Sandler, the organization’s
 
executive director.</p>
 

	
 

	
 
<p>According to the lawsuit, a consumer of a product such as this has the
 
right to access the source code so that it can be modified, studied, and
 
redistributed (under the appropriate license conditions).</p>
 

	
 

	
 

	
 
<p>&ldquo;We are asking the court to require Vizio to make good on its
 
  obligations under copyleft compliance requirements,&rdquo; says
 
  Sandler. She explains that in past litigation, the plaintiffs have always
 
  been copyright holders of the specific GPL code. In this case, Software
 
  Freedom Conservancy hopes to demonstrate that it's not just the copyright
 
  holders, but also the receivers of the licensed code who are entitled to
 
  rights.</p>
 

	
 
<p>The lawsuit suit seeks no monetary damages, but instead seeks access to
 
the technical information that the copyleft licenses require Vizio to provide
 
to all customers who purchase its TVs (specifically, the plaintiff is asking
 
for the technical information via &ldquo;specific performance&rdquo; rather
 
than &ldquo;damages&rdquo;).</p>
 

	
 

	
 
<p>&ldquo;Software Freedom Conservancy is standing up for customers who are
 
  alienated and exploited by the technology on which they increasingly
 
  rely,&rdquo; says Sandler, adding that the lawsuit also aims to help
 
  educate consumers about their right to repair their devices as well as show
 
  policy makers that there are mechanisms for corporate accountability
 
  already in place that can be leveraged through purchasing power and
 
  collective action.</p>
 

	
 

	
 
<p>Copyleft licensing was designed as an ideological alternative to the
 
classic corporate software model because it: allows people who receive the
 
software to fix their devices, improve them and control them; entitles people
 
to curtail surveillance and ads; and helps people continue to use their
 
devices for a much longer time (instead of being forced to purchase new
 
ones).</p>
 

	
 

	
 
<p>&ldquo;The global supply chain shortages that have affected everything
 
from cars to consumer electronics underscore one of the reasons why it is
 
important to be able to repair products we already own,&rdquo; says
 
Sandler. &ldquo;Even without supply chain challenges, the forced obsolescence
 
of devices like TVs isn’t in the best interest of the consumer or even the
 
planet. This is another aspect of what we mean by &lsquo;ethical
 
technology.&rsquo; Throwing away a TV because its software is no longer
 
supported by its manufacturer is not only wasteful, it has dire environmental
 
consequences. Consumers should have more control over this, and they would if
 
companies like Vizio played by the rules.&ldquo;</p>
 

	
 

	
 
<p>According to Sandler, the organization first raised the issue of
 
non-compliance with the GPL with Vizio in August 2018. After a year of
 
diplomatic attempts to work with the company, it was not only still refusing
 
to comply, but stopped responding to inquiries altogether as of January 2020.</p>
 

	
 

	
 
<p>&ldquo;By July 2021, the TV model that we originally complained was
 
non-compliant was discontinued,” says Sandler. “When we purchased new models,
 
we found that despite our efforts they still had no source code included with
 
the device, nor any offer for source code. People buying these models would
 
never know that there was anything special about the software in these
 
devices, or that they had any rights whatsoever connected with the software
 
on their TVs.&rdquo;</p>
 

	
 

	
 
<p>Software Freedom Conservancy analyzed the TVs and concluded that not only
 
was Vizio not providing the source code and technical information that
 
copyleft licenses require, Vizio was not even informing its customers about
 
copylefted software and the rights it gives them as consumers.</p>
 

	
 

	
 
<h3>ABOUT SOFTWARE FREEDOM CONSERVANCY</h3>
 

	
 

	
 
<p>Software Freedom Conservancy is a nonprofit organization centered around
 
ethical technology. Our mission is to ensure the right to repair, improve,
 
and reinstall software. We promote and defend these rights through fostering
 
free and open source software (FOSS) projects, driving initiatives that
 
actively make technology more inclusive, and advancing policy strategies that
 
defend FOSS (such as copyleft). The organization is incorporated in New
 
York. For more information, go
 
to <a href="https://sfconservancy.org">sfconservancy.org</a>.</p>
 

	
 

	
 

	
 
<h3>SUPPLEMENTAL RESOURCES FOR JOURNALISTS</h3>
 

	
 
<ul>
 
<li><a href="https://sfconservancy.org/docs/software-freedom-conservancy-v-vizio-announce-press-kit.pdf">A
 
full press kit, with substantial additional information and resources for
 
    journalists covering this story, can be viewed and downloaded here.</li>
 

	
 
<li><a href="/docs/software-freedom-conservancy-v-vizio-complaint-2021-10-19.pdf">The
 
    legal complaint is available</a>.</li>
 
</ul>
 
  
 

 

	
 
<h3>MEDIA CONTACT</h3>
 

	
 
<p>Hannah Gregory, Media Rep for Good Causes<br/>
 
<a href="mailto:media@sfconservancy.org">&lt;media@sfconservancy.org&gt;</a></p>
 
{% endblock %}
conservancy/content/copyleft-compliance/vmware-lawsuit-appeal.html
Show inline comments
 
{% extends "base_compliance.html" %}
 
{% block subtitle %}Copyleft Compliance Projects - {% endblock %}
 
{% block submenuselection %}PastLawsuits{% endblock %}
 
{% block content %}
 
<h2>The time has come to stand up for the GPL.</h2>
 

	
 
<p><strong>Update 2019-04-02:</strong> Please
 
  see <a href="https://sfconservancy.org/news/2019/apr/02/vmware-no-appeal/">this
 
  announcement regarding conclusion of the VMware suit in Germany</a>.  Since the suit has
 
  concluded, any funds you donate here will support our ongoing compliance efforts.  The
 
  remaining material below is left as it was before that announcement:</p>
 

	
 
<p><em>In March 2015, Conservancy <a href="/news/2015/mar/05/vmware-lawsuit/">announced Christoph Hellwig's
 
    lawsuit against VMware in Germany</a>.  In July 2016,
 
    we <a href="/news/2016/aug/09/vmware-appeal/">announced that Christoph
 
    would appeal the lower court's ruling</a>.</p>
 
    Support Conservancy's and Christoph's efforts in this area
 
    by <a href="/sustainer/">becoming a Conservancy
 
    sustainer</a> or <a href="#donate-box" class="donate-now">donating via
 
    the link on the right</a>.</em></p>
 

	
 

	
 
<p>We were told to ask nicely and repeatedly, so we did.</p>
 

	
 
<p>We asked allies to help us make contact in friendly and professional
 
  ways.</p>
 

	
 
<p>Everyone asked us to give companies as many chances as possible and as
 
  much help as possible to comply with copyleft, so we did.</p>
 

	
 
<p>We've worked for years to help VMware comply with the GPL, but they
 
refuse. Negotiations broke down for the last time when they insisted on an 
 
refuse. Negotiations broke down for the last time when they insisted on an
 
NDA just to discuss settlement terms!</p>
 

	
 
<p>Christoph is among the most active developers of Linux.  As of Feburary 
 
19, 2015, Christoph has contributed 279,653 lines of code to the Linux kernel, 
 
and ranks 20th among the 1,340 developers involved in the latest 3.19 kernel 
 
<p>Christoph is among the most active developers of Linux.  As of Feburary
 
19, 2015, Christoph has contributed 279,653 lines of code to the Linux kernel,
 
and ranks 20th among the 1,340 developers involved in the latest 3.19 kernel
 
release.  Christoph also
 
ranks 4th among those who have reviewed third-party source code, tirelessly
 
corrected and commented on other developers' contributions.  Christoph
 
licenses his code to the public under the terms of the GPL for practical and
 
ideological reasons.  VMware, a company with net revenue of over $1 billion
 
and over 14,000 employees, ignored Christoph's choice.  They took Christoph's
 
code from Linux and modified it to work with their own kernel without releasing
 
source code of the resulting complete work.  This is precisely the kind of
 
activity Christoph and other kernel developers seek to prevent by choosing
 
the GPL.  The GPL was written to prevent this specific scenario!</p>
 

	
 
<h3>This is a matter of principle.</h3>
 

	
 
<p>Free and open source software is everywhere and in everything; yet our
 
  software freedom is constantly eroded.</p>
 

	
 
<p>We want companies to incorporate our software into new products, but there
 
are a few simple rules.  Copylefted free software is so prevalent because
 
there's no way a company can compete without using a significant amount of
 
free software to bring products to market in reasonable time. They get so
 
much benefit from our work.  Allowing the whole community to review, use,
 
improve and work with the code seems very little to ask in return.  Copyleft
 
also ensures competitors cannot undercut those who contribute.  Without active enforcement, the GPL is
 
effectively no different from a non-copyleft license.</p>
 

	
 
<p>What point is there for companies to make sure that they're compliant if
 
there are no consequences when the GPL is violated? Many will continue to
 
ignore the rules without enforcement.  We know that there are so many
 
companies that willingly comply and embrace GPL as part of their business.
 
Some are temporarily out of compliance and need to be brought up to speed,
 
but willingly comply once they realize there is an issue.  Sadly, VMware sits
 
in the rare but infamous class of perpetually non-compliant companies. VMware
 
has been aware of their noncompliance for years but actively refuses to do
 
the right thing.  Help us do right by those who take the code in the spirit
 
it was given and comply with copyleft, and stop those don't.</p>
 

	
 
<p>We know that copyleft isn't a favorite licensing strategy for some in our
 
community.  Even so, this case will help bring clarity on the question of
 
combined and derivative works, and is essential to the future of all software
 
freedom.  This case deserves support from copyleft and non-copyleft free
 
software communities alike.</p>
 

	
 
<h3>Show you care</h3>
 

	
 
<p>Bad actors have become complacent because they think you don't care.  A
 
  strong show of public support for Conservancy and Christoph's position will
 
  help our legal case and demonstrate the interpretive context for it.
 
  Please <a href="#donate-box" class="donate-now">donate</a> to our campaign to enforce the GPL.  Help Conservancy
 
  increase its number of individual donors, so we have clear evidence to show
 
  bad actors that the GPL matters to the individuals in our community.
 
  After you <a href="#donate-box" class="donate-now">donate</a>, go and tell the world: &ldquo;Play by the rules, @VMware. I defend the #GPL with Christoph &amp; @Conservancy. #DTRTvmware  Help at https://sfconservancy.org/sustainer/ &rdquo; on your blog or microblog.
 
  </p>
 

	
 

	
 
<h3>Isn't the combined works and/or derivative works question a legal grey area?</h3>
 

	
 
<p>We don't think so, but this case will let the court to decide that question.
 
Either way, it's beneficial to our entire community to find out what the
 
judges think.  (Check out our <a href="/copyleft-compliance/vmware-lawsuit-faq.html">FAQ to find out more
 
information</a>.)</p>
 

	
 
<p>Help us pay for this expensive lawsuit and to generally defend software
 
  freedom and the GPL.  Help us show the world that copyleft matters.  We are excited 
 
  to announce that we already reached an anonymous match for this campaign, where every dollar donated 
 
  freedom and the GPL.  Help us show the world that copyleft matters.  We are excited
 
  to announce that we already reached an anonymous match for this campaign, where every dollar donated
 
  was matched up to $50,000. However, that $100,000 is just an initial step
 
  and there is so much GPL enforcement work to do.  So, please
 
  donate now: by becoming <a href="/sustainer/">a Conservancy Sustainer</a> or
 
  via <a href="#donate-box" class="donate-now">donate link on the right</a>.</p>
 

	
 
<h3>Want To Know More?</h3>
 

	
 
<p>Watch the video below of Conservancy Executive Director, Karen Sandler,
 
  <a href="/news/2015/mar/31/libreplanet/">delivering a keynote on this topic
 
  at
 
    LibrePlanet 2015</a>:</p>
 
<p>
 
 <video controls
 
         preload="auto" class="video-js vjs-default-skin"
 
         data-setup='{"height": 276,
 
                      "width": 640 }'>
 
    <source src="https://media.libreplanet.org/mgoblin_media/media_entries/113/karen-sandler-keynote-2015.medium.webm"
 

	
 
              type="video/webm; codecs=&#34;vp8, vorbis&#34;"
 
             />
 
   
 

 
 </video>
 
</p>
 

	
 
<p>Or, read <a href="/copyleft-compliance/vmware-lawsuit-faq.html">our FAQ about
 
    the lawsuit</a>.</p>
 

	
 
{% endblock %}
conservancy/content/npoacct/index.html
Show inline comments
 
{% extends "base_conservancy.html" %}
 
{% load humanize %}
 
{% load static %}
 

	
 
{% block subtitle %}NPOAcct - {% endblock %}
 
{% block category %}npoacct{% endblock %}
 

	
 
{% block content %}
 

	
 
<div class="donate-sidebar">
 
<table style="background-color:#afe478;width:100%;">
 
<tr><td style="text-align:center;padding:10px;padding-bottom:10px;">
 
<div id="donate-box" class="toggle-unit"><h1 class="toggle-content">Support
 
    Now!</h1></div>
 

	
 
<h3>Support NPOAcct Now!</h3>
 

	
 
<p>
 
  To support our non-profit accounting work,
 
  please&hellip; </p>
 

	
 
<p><span class="donate-box-highlight">Donate now via PayPal:</span>
 
</p>
 
<!-- PayPal start -->
 
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
 
<input type="hidden" name="cmd" value="_s-xclick">
 
<input type="hidden" name="hosted_button_id" value="3VRTJALJ5PQRW">
 
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" style="border:0" name="submit" alt="Donate Now!">
 
<img alt="" style="border:0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
 
</form>
 
<!-- PayPal end -->
 

	
 
<p>Or, <a href="/sustainer/#annual"><span class="donate-box-highlight">become a Conservancy
 
      Sustainer</span></a> (&mdash; a better option if you're donating more
 
      than $120, since you'll get a t-shirt!).</p>
 
</td></tr></table>
 
</div>
 
<div class="content-with-donate-sidebar">
 

	
 
<h2>Non-Profit Accounting Software</h2>
 

	
 
<img src="{% static 'img/conservancy-accounting-campaign-logo.png' %}" alt="Conservancy accounting campaign logo" style="float:left;" />
 

	
 
<p>Conservancy has a plan to help all non-profit organizations (NPOs) by
 
creating an Open Source and Free Software accounting system usable by
 
non-technical bookkeepers, accountants, and non-profit managers.  You can
 
help us do it by donating now.
 
</p>
 

	
 
<h3>News</h3>
 

	
 
<p><b>31 August 2016</b>: We're beginning work on a system for Payment and Reimbursement Requests.  This is a smaller piece of the larger NPO Accounting project.  Because it doesn't require much integration with larger accounting systems, we can help address this specific bookkeeping problem for NPOs sooner, and start building interest in the larger NPO Accounting project.</p>
 

	
 
<p>We haven't started writing code yet, so now's a great time to get in on the ground floor!  Check the <a href="https://npoacct.sfconservancy.org/Reimbursements/Requirements/">Requirements document</a> we're putting together on the wiki.  <a href="https://lists.sfconservancy.org/mailman/listinfo/npo-accounting">Join us on the mailing list</a> to let us know what's missing, and hear first other ways you can contribute as we start building the system.</p>
 

	
 
<h3>What is the Non-Profit Accounting Software Project?</h3>
 

	
 
<p>To keep their books and produce annual government filings, most NPOs rely
 
on proprietary software, paying exorbitant licensing fees.  This is
 
fundamentally at cross purposes with their underlying missions of charity,
 
equality, democracy, and sharing.</p>
 

	
 
<p>This project has the potential to save the non-profit sector
 
millions in licensing fees every year.  Even non-profits that continue to use proprietary accounting
 
software will benefit, since the existence of quality Open Source and Free
 
  Software for a particular task curtails predatory behavior by proprietary
 
  software companies, and creates a new standard of comparison.</p>
 

	
 
<p>But, more powerfully, this project's realization
 
will increase the agility and collaborative potential
 
for the non-profit sector &mdash; a boon to funders, boards, and employees &mdash;  bringing the Free Software and general NPO communities
 
into closer collaboration and understanding.</p>
 

	
 
<p><a href="#endorsements">Endorsers of this effort</a> include April, Fractured Atlas, The Free Software
 
Foundation, Mozilla Foundation, GNOME Foundation, OpenHatch, Open
 
Source Initiative, QuestionCopyright.org, and Software in the Public
 
Interest; all encourage you to <a href="#donate-box" class="donate-now">donate and support it</a>.</p>
 

	
 

	
 
<h3>Background</h3>
 

	
 
<p>Like many non-profit organizations (NPOs) in the USA, Conservancy's
 
  financial accounts are audited annually by an independent accounting firm;
 
  we recently completed our fiscal year 2011 audit.  As usual, our auditors
 
  asked plenty of questions about our accounting software.  Conservancy uses
 
  only Free Software, of course, centered around a set of straightforward reporting
 
  scripts that we created to run on top
 
  of <a href="http://www.ledger-cli.org/">Ledger CLI</a>. (Conservancy's
 
  current configuration using Ledger CLI
 
  is <a href="https://gitorious.org/ledger/npo-ledger-cli">publicly
 
  documented and explained</a>.)</p>
 

	
 
<p>Our auditors were only familiar with proprietary accounting software, and
 
  so our system seemed foreign to them, as it relies on Ledger CLI's text files, Emacs and
 
  version control.  During their questions
 
  about our setup, we asked them to hypothetically prescribe a specific
 
  proprietary software setup as a model for  managing Conservancy's
 
  accounts.  Our chief auditor started by mentioning a few well-known
 
  proprietary solutions.   But then he paused and continued:  <q>Given
 
  that Conservancy's a fiscal sponsor with so many temporarily restricted
 
  accounts, existing systems really wouldn't do that good of a job for
 
  you</q>.</p>
 

	
 
<p>Indeed, Conservancy reached out into the broader fiscal sponsorship
 
  community beyond the <abbr title="Free, Libre and Open Source Software">FLOSS</abbr>
 
  <abbr title="Non-profit Organization">NPO</abbr> community and discovered that many larger fiscal sponsors &mdash; even
 
  those willing to use proprietary components &mdash; have cobbled together
 
  their own unique systems, idiosyncratically tailored to their specific
 
  environments.  Thus, good, well-designed, and reusable accounting software
 
  for non-profit fiscal sponsorship is not just missing in the software
 
  freedom community; it's missing altogether.</p>
 

	
 

	
 
<p>The project that Conservancy proposes will take a modest step
 
  forward in creating a better solution for everyone. 
 
  forward in creating a better solution for everyone.
 
  <a href="#quotes">Many NPO leaders and academics agree</a> with Conservancy about the
 
  immediate need for work to begin on this
 
  effort.  <a id="endorsements"
 
  style="text-decoration:none"></a><a href="http://april.org">April</a>, <a href="https://www.fracturedatlas.org">Fractured Atlas</a>, The <a href="http://fsf.org">Free Software
 
  Foundation</a>, The <a href="https://www.mozilla.org/foundation/">Mozilla
 
Foundation</a>, The <a href="http://www.gnome.org/foundation/">GNOME Foundation</a>,  <a
 
        href="https://openhatch.org/">OpenHatch</a>, <a href="http://opensource.org/node/658">Open Source Initiative</a>,
 
  <a href="http://QuestionCopyright.org">QuestionCopyright.org</a>, and <a href="http://www.spi-inc.org/">Software in the Public Interest</a> have
 
  all endorsed Conservancy's plan, and they encourage you to <a href="#donate-box" class="donate-now">donate and
 
  support it</a>.</p>
 

	
 
<p>Conservancy is uniquely qualified to undertake this task.  Using only Free
 
  Software, Conservancy already meets the complex accounting challenges of
 
  earmarked, directed donations for over thirty different projects.  We've
 
  learned much about this work in our first seven years of
 
  operation, and we're prepared to apply what we've learned to solve
 
  this problem not just for ourselves, but for anyone who seeks a
 
  solution that both respects software freedom and handles non-profit
 
  accounting for all sorts of NPOs, including fiscal sponsors.  General NPO
 
  accounting is just a &ldquo;base case&rdquo; of fiscal sponsorship (i.e.,
 
  an NPO is just a fiscal sponsor for one and only one specific project),
 
  and Conservancy therefore believes a solution that handles fiscal sponsors
 
  will also handle the simpler case as well.</p>
 

	
 
<h3>Why Conservancy Must Fund This Work</h3>
 

	
 
<p>As it stands, nearly all Open Source and Free Software NPOs either use
 
  proprietary software, or fully outsource their bookkeeping and accounting
 
  to third-parties.  Those that don't do so (such as Conservancy and the Free
 
  Software Foundation) have long complained that existing Free Software in
 
  this area is inadequate, and have been forced to develop customized,
 
  one-off solutions in-house to make the systems work.</p>
 

	
 
<p>It's highly unlikely that the for-profit sector will adapt existing Free
 
  Software accounting systems to meet the differing needs of NPOs (let alone
 
  the more complex needs of fiscal sponsors; based on
 
  advice from our auditors and other fiscal sponsors, Conservancy understands that <em>no existing
 
  solution &mdash; proprietary or Free &mdash; meets the requirements of fiscal sponsorship accounting</em>).  Fiscal sponsors like
 
  Conservancy must track a separate set of books for every project, keeping
 
  in mind that a project may leave at any time for another NPO and need to take
 
  their books with them.  Yet, the books of the entire organization are the
 
  aggregate of the books of all these projects, and internally, they need to
 
  be presented as a single set of books for those purposes.</p>
 

	
 
<p>Meanwhile, even if an organization is not a fiscal sponsor, non-profit
 
  accounting is <em>just different</em> than for-profit accounting, particularly in
 
  the USA.  For example, for-profit-oriented systems often make problematic
 
  assumptions about the workflow of accounting tasks (often because NPOs
 
  rely primarily on donations, rather than fee-for-service or widget-selling
 
  income).  Also, non-profit income is categorized differently than
 
  for-profit income, and the reporting requirements vary wildly from their
 
  for-profit equivalents.</p>
 

	
 
<p>Conservancy's existing system is working adequately, but requires daily
 
  the relatively more expensive time of a highly technical person to do the
 
  job of bookkeeping.  Also, the system cannot easily be adapted in its
 
  current form for another NPO, unless they also have a
 
  skilled technical employee to act as bookkeeper.  This project aims to build
 
  on what Conservancy has learned and produce a non-profit accounting system
 
  that corrects these flaws.</p>
 

	
 
<p>Finally, Conservancy's mission (as stated
 
on <a href="/docs/conservancy_Form-1023.pdf">our Form
 
1023 with the USA IRS</a>) includes producing Open Source and Free Software.
 
Thus, this project is a great way to pursue Conservancy's mission and address a
 
specific need that so many NPOs (including us) have.  If no one steps up to create Free Software to replace the widely used
 
proprietary software, NPOs in aggregate will pay <em>much more</em> money for
 
proprietary licensing than Conservancy will ever spend in developing a
 
replacement. Please <a href="#donate-box" class="donate-now">donate
 
generously</a> to help us do it!</p>
 

	
 
<a id="quotes"></a>
 
<h3>Statements of Support For This Project from Others</h3>
 

	
 
<p><q>As a national fiscal sponsor with over 3,000 arts and cultural projects
 
under our umbrella, Fractured Atlas is ecstatic about this effort's
 
potential. After 15 years wrestling with Quickbooks and other inadequate
 
options, the idea of an open source tool designed specifically for this niche
 
of the field is beyond welcome. We wholeheartedly support the Conservancy's
 
work on this front and look forward to seeing where it leads.</q> &mdash;
 
<a href="https://www.fracturedatlas.org/site/bios/staff/1/Adam%20Forest_Huttler">Adam
 
  Huttler</a>, Chief Executive Officer, <a href="https://www.fracturedatlas.org">Fractured Atlas</a></p>
 

	
 
<p><q><a href="http://QuestionCopyright.org">QuestionCopyright.org</a> is
 
just one of many organizations that would benefit from a Free Software
 
accounting system that is usable by non-technical people.  We
 
enthusiastically support the Conservancy's campaign to create one, and look
 
forward to using the result.</q>
 
&mdash; <a href="http://questioncopyright.org/speakers/karl_fogel">Karl
 
Fogel</a>, Executive Director,
 
  <a href="http://QuestionCopyright.org">QuestionCopyright.org</a></p>
 

	
 
<p><q>Software in the Public Interest is a fiscal sponsor for 44 free and open
 
source projects. We share many of the accounting needs and challenges of
 
the Conservancy and are excited to collaborate on a Free Software
 
solution to these needs and challenges.</q>
 
&mdash; Michael Schultheiss, Treasurer, <a href="http://www.spi-inc.org/">Software
 
    in the Public Interest</a></p>
 

	
 
<p><q>Open Source accounting software specifically tailored for non-profits
 
    will fill a pretty large need.</q>
 
    &mdash; <a href="http://wagner.nyu.edu/calabrese">Thad Calabrese</a>,
 
    Assistant Professor of Public and Nonprofit Financial Management
 
    at <a href="http://wagner.nyu.edu/">NYU Wagner</a>, and co-author
 
    of <cite>Financial Management for Public, Health, and Not-for-Profit
 
    Organizations, 4th Edition</cite>.</p>
 

	
 
<p><q>The Open Source Initiative has shared the experiences of Software
 
     Freedom Conservancy in navigating the financial management needs of
 
     non-profit organisations and shares their concern. We have many NPOs as
 
     members and we welcome this useful initiative by Conservancy.</q>
 
     &mdash; Simon Phipps, (former) President, <a href="http://opensource.org/node/658">Open Source
 
     Initiative</a></p>
 

	
 
<p><q>The <a href="https://fsf.org/">Free Software Foundation</a> is committed to doing all of its work,
 
both public-facing and internal, using only free software. We are thankful to
 
the developers of SQL Ledger for providing the accounting software that has
 
served us well for many years. As we have grown, so have the complexities of
 
our finances.  Because of our own needs and our mission to help other
 
organizations &mdash; both inside and outside of the technology sphere
 
&mdash; run their operations on exclusively free software, we wholeheartedly
 
support this Conservancy initiative.</q> &mdash; <a href="http://www.fsf.org/about/staff-and-board#johns">John Sullivan</a>, Executive
 
Director, <a href="https://fsf.org">Free Software Foundation</a></p>
 

	
 
<p><q>Open source is a great way to solve new problems and make software that
 
is more flexible and responsive to the needs of the people who use it. That's
 
as true for the finance industry as it is on the web.</q>
 
&mdash; <a href="http://blog.mozilla.org/press/bios/mark-surman/">Mark
conservancy/content/press/qanda.html
Show inline comments
 
{% extends "base_vizio.html" %}
 
{% block subtitle %}Press - {% endblock %}
 
{% block submenuselection %}VizioQandA{% endblock %}
 
{% block content %}
 
<h1 id="QandA">Vizio Lawsuit Q &amp; A</h1>
 

	
 
<a href="https://shoestring.agency/wp-content/uploads/2021/10/SFC_QA_GeneralPublic.pdf">[
 
         A PDF version of this Q&amp;A is available. ]</a>
 

	
 
<h3 id="">Q: Who is the defendant in this lawsuit?</h3>
 

	
 
<p>The defendant is Vizio, Inc., a U.S.-based TV maker and media company that has been publicly traded on the New York Stock Exchange since March 2021.</p>
 

	
 
<h3 id="">Q: What did Vizio do wrong?</h3>
 

	
 
<p>The lawsuit alleges that Vizio’s TV products, built on its SmartCast system, contain software that Vizio unfairly appropriated from a community of developers who intended consumers to have very specific rights to modify, improve, share, and reinstall modified versions of the software.</p>
 

	
 
<h3 id="">Q: So, Vizio didn’t create SmartCast?</h3>
 

	
 
<p>It appears from extensive research that the core components of SmartCast were not created by Vizio, but rather, are based on various components licensed to the public under free and open-source software (FOSS) licenses. Most notably, many of the programs that are part of the SmartCast system are licensed under the GPL.</p>
 

	
 
<h3 id="">Q: What is copyleft?</h3>
 

	
 
<p>Copyleft is a term used to describe a license that uses the rights granted under copyright—not to restrict usage, but instead to ensure that the software is always shared freely.</p>
 

	
 
<h3 id="">Q: What is FOSS? </h3>
 

	
 
<p>“FOSS” stands for free and open-source software that allows for software freedom. “Software freedom” means the freedom of a user to run, study, (re)distribute, and (re)install (modified) versions of a piece of software. More generally, it is the idea that we are entitled to rights when using software and there should be equal protections for privacy and redistribution. The rights should treat everyone equally: big businesses and individual consumers and users alike.</p>
 

	
 
<h3 id="">Q: I thought FOSS allowed companies to simply take software from the commons and put it into their products whenever they wanted? Isn’t that the whole point of FOSS—for companies to get components for their products and lower their cost of production?</h3>
 
   
 

 
<p>While that is the main advantage that big corporations get from FOSS, it was never the primary impetus behind FOSS. Particularly through special licensing terms like the GPL, this licensing approach creates an egalitarian community of users, developers, and consumers. When functioning correctly, each individual and organization that participates in FOSS stands on equal footing with everyone else. Licenses like the GPL have rules to assure everyone's rights in that ecosystem are treated with equal respect and reverence. This is why compliance with these rules is important and we must stand up against companies who refuse to comply. </p>
 
 
 

 
<h3 id="">Q: But, I'm not a software developer. Why should I care at all that Vizio won’t let me modify and reinstall GPL’d components in its SmartCast system?</h3>
 
 
 

 
<p>Right-to-repair software is essential for everyone, even if you don't know how to make the repairs yourself. Once upon a time, we had lots of local vendors that could repair and fix TVs when they broke.  That’s because TVs were once analog hardware devices that could be taken apart and understood merely by inspection from someone with the sufficient knowledge. TVs today are simply a little computer attached to a large display. As such, the most important part that needs repairs is usually when the software malfunctions, has bugs, or otherwise needs upgrades and changes. The GPL was specifically designed to assure such fixes could be done, and that consumers (or agents those consumers hire on the open market) can make such repairs and changes. </p>
 
     
 

 
<h3 id="">Q: Alright, that makes sense, but I’m happy with Vizio’s SmartCast right now. What difference does it make to me if Vizio won’t give me the rights under the GPL?</h3>
 

	
 
<p>Time and time again, companies stop supporting the software build for the device long before the computer inside the device fails. In other words, these devices are built for planned premature obsolescence. </p>
 

	
 
<p>By refusing to comply with the pro-consumer terms of the GPL, Vizio has the power to disable your TV at any time it wants, over your internet connection, without your knowledge or consent. If Vizio complied with the GPL, all would not be lost in this scenario: volunteers and third-party entities could take GPL’d software as a basis for a replacement for SmartCast. Without these rights, consumers are essentially forced to purchase new devices when they could be repaired.</p>
 

	
 
<h3 id="">Q: Creation of a replacement for SmartCast seems far-fetched to me. After all, most of the software in SmartCast is not actually GPL’d, only a portion of the components and programs are GPL’d.  How will Vizio's compliance with the GPL actually lead to an alternative firmware?</h3>
 
    
 

 
<p>Years ago, people said the very same thing about wireless routers, which had only partially GPL'd firmwares. However, thanks to actions to enforce the GPL in the wireless router market, the OpenWrt project was born! That project is now the premiere replacement software for wireless routers from almost every major manufacturer on the market. There is now healthy competition and even occasional cooperation between a hobbyist and community-led firmware project and the wireless router manufacturers. We believe the same can happen for TVs, but the first step is assuring the entire TV market complies with the GPL.</p>
 
    
 

 
<h3 id="">Q: What indications do you have that compliance with the GPL will be a catalyst for alternative firmwares?</h3>
 

	
 
<p>Beyond the OpenWrt example, Software Freedom Conservancy sued 14 defendants for GPL violations in 2009, including Samsung for its 2009-era TV models. Thanks to the source release that was achieved through the settlement of that lawsuit, a community-led SamyGo project was created for that era of TVs. (source)</p>
 
    
 

 
<h3 id="">Q: Who is the plaintiff in the lawsuit?</h3>
 

	
 
<p>Software Freedom Conservancy is the plaintiff in this case. The organization is filing as a third-party beneficiary, as the purchaser of a product which has copylefted code on it. A consumer of a product such as this has the right to access the source code so that it can be modified, studied, and redistributed (under the appropriate license conditions).</p>
 

	
 
<h3 id="">Q: What makes this different than other GPL compliance lawsuits?</h3>
 

	
 
<p>In the past, the plaintiffs have always been copyright holders of the specific GPL code. In this case Software Freedom Conservancy is demonstrating that it's not just the copyright holders, but also the receivers of the licensed code which are entitled to their rights.</p>
 

	
 
<h3 id="">Q: What type of case is this?  How does it compare to previous litigation by Software Freedom Conservancy regarding the GPL?</h3>
 

	
 
<p>Previously, Software Freedom Conservancy filed as a copyright holder in federal court, or coordinated or funded litigation by other copyright holders in copyright cases in the U.S. and Germany. This is an example of how, historically, GPL litigation has focused on the rights of the developers. However, the rights assured by the GPL are actually not intended primarily for the original developers, but rather for people who purchase products that contain GPL’d software. That is what makes this litigation unique and historic in terms of defending consumer rights. It is the first case that focuses on the rights of individual consumers as third-party beneficiaries of the GPL.</p>
 
     
 

 
<h3 id="">Q: Why are you filing a third-party beneficiary claim instead of a copyright claim?</h3>
 

	
 
<p>For too long, GPL enforcement has focused only on the rights of developers, who are often not the ones impacted by the technology in question. Some of those same developers even have lucrative jobs working for the various companies that violate the GPL. The GPL was designed to put the rights of hobbyists, individual developers, consumers, small companies, and nonprofit organizations on equal footing with big companies. With the advent of more contributions to GPL’d software coming from for-profit multinational corporations and fewer from individuals, the rights of these other parties are often given second-class billing. The third-party beneficiary claim prioritizes the consumers, who are the users and the most important beneficiaries of the rights under GPL.</p>
 

	
 
<h3 id="">Q:  Are you saying the rights of developers under the GPL are not important?</h3>
 

	
 
<p>Not at all! Most would agree that individual developers care deeply about the software freedom of users. They are the artists who create the amazing FOSS on which all of us rely. However, as Francis Ford Coppola once said (paraphrased), “to understand who holds the power in any culture, look not to the artists but who employs the artists”—a quote which suits this situation well. Large multinational corporations have co-opted FOSS for their own bottom lines. While many developers privately cheer Software Freedom Conservancy’s efforts and donate money to this cause, they fear the power that their employers exert and have asked Software Freedom Conservancy to fight for the software freedom of users.</p>
 
    
 

 
<h3 id="">Q:  Why is this important for the future of developers?</h3>
 

	
 
<p>The next generation of developers comes from the users of today. The golden age of FOSS that the industry now enjoys came to fruition from the counterculture created by FOSS activists in the 1990s and early 2000s. During this time, Linux and other GPL’d software was considered just a curiosity (and was even accused of being anti-American). Nevertheless, the rights assured by the GPL ultimately led to a new generation of software developers learning how to build Linux and all the amazingly useful FOSS around it. To recruit a diverse group of the next generation of enthusiastic developers, we must ensure that the rights under GPL are available to every single individual, consumer and hobbyist around the globe. That is what this lawsuit is about.</p>
 

	
 
<h3 id="">Q: If the goal is to fight for all consumer rights, why not file this lawsuit as a class action? </h3>
 

	
 
<p>Forcing consumers to fight for their individual rights is one way that for-profit corporations exert their inappropriate power. Actions such as this lawsuit seek to disrupt this power dynamic by asserting that all consumers of copylefted code deserve the opportunity to know, access and modify the code on their devices. However, expecting all consumers to have to personally participate in that process not only puts an undue burden on them, it simply is not realistic. It is not how change happens. Furthermore, pursuant to “The Principles of Community Oriented GPL Enforcement,” the lawsuit does not prioritize financial remedy over compliance. This lawsuit seeks the most important remedy for the public good: release of the Complete, Corresponding Source (CCS) for all GPL’d components on Vizio TVs. Once that is achieved, the benefit is immediately available to not only all who purchased a Vizio TV, but also to the entire FOSS community.  </p>
 
     
 

 
<h3 id="">Q: What are “The Principles of Community Oriented GPL Enforcement”?</h3>
 

	
 
<p>In 2016, Software Freedom Conservancy published “The Principles of Community-Oriented GPL Enforcement” in response to those who might use copyleft licenses for their own financial gain. Software Freedom Conservancy is part of a long tradition of using copyleft enforcement as intended: to further the rights and freedoms of individual users, consumers, and developers. Pursuant to those principles, Software Freedom Conservancy never prioritizes financial gain over assuring the rights guaranteed by the GPL are upheld.</p>
 
     
 

 
<h3 id="">Q: Are the court documents released? Does that relate to why the litigation was brought in the U.S.?</h3>
 

	
 
<p>Software Freedom Conservancy brought this litigation within the U.S. specifically because litigation in this country is completely public. Historically, Germany has been one of the most popular venues for GPL litigation but it also has a huge downside: the German legal system keeps all details of the cases private and there is little transparency. </p>
 

	
 
<h3 id="">Q: Who is funding this lawsuit? </h3>
 

	
 
<p>This lawsuit is central to the mission of Software Freedom Conservancy. The organization has received grants from Amateur Radio Digital Communications (ARDC) to support GPL compliance work. As a nonprofit, charitable donations are also an important source of funding to carry out the work. This combined financial support allowed for this litigation to begin. However, continued donor support will be vital since litigation like this is quite expensive.</p>
 

	
 
<h3 id="">Q: How can someone make a donation?</h3>
 

	
 
<p>To make a tax-deductible donation to Software Freedom Conservancy, go to sfconservancy.org/donate. The best way to support this important work is to join as an official Sustainer. Details on that program are available at sfconservancy.org/sustainer. </p>
 

	
 
<h3 id="">Q: Why must you file a lawsuit? Isn’t there any other way to convince Vizio to comply with the GPL? </h3>
 

	
 
<p>Vizio has a long history of violating copyleft. The company has also stopped replying to inquiries from Software Freedom Conservancy. Vizio has been benefiting from the use of an abundance of existing copylefted software, but completely ignores the responsibilities that come with using the licenses. Furthermore, Vizio has already been subject to a large class-action suit that alleged that Vizio was misusing its customers’ private information (Vizio settled that class action for $17 million).</p>
 

	
 
<h3 id="">Q: What GPL code has been discovered in Vizio’s SmartCast? </h3>
 

	
 
<p>SmartCast is a Linux-based operating system. That means that not only do multiple copies of the Linux kernel appear in the firmware, other GPL'd and LGPL'd programs were found, including U-Boot, bash, gawk, tar, glibc, and ffmpeg.</p>
 

	
 
<h3 id="">Q: How can I verify Software Freedom Conservancy’s technical findings above? </h3>
 

	
 
<p>Object code can be found on the TVs and source code/binaries on the filesystem. There are multiple models in which we can confirm the findings. Go to sfconservancy.org/vizio for details.</p>
 

	
 
<a href="https://shoestring.agency/wp-content/uploads/2021/10/SFC_QA_GeneralPublic.pdf">[
 
         A PDF version of this Q&amp;A is available. ]</a>
 

	
 
{% endblock %}
conservancy/content/projects/apply/conservancy-fsa-template.tex
Show inline comments
 
\documentclass[letterpaper,12pt]{article}
 
\usepackage{draftcopy}
 
\usepackage{enumitem}
 
\usepackage{parskip}
 
\usepackage{fancyhdr}
 
\usepackage{xspace}
 
\usepackage[verbose, twoside, dvips,
 
              paperwidth=8.5in, paperheight=11in,
 
              left=1in, right=1in, top=1.25in, bottom=.75in,
 
           ]{geometry}
 

	
 
\pagestyle{fancy}
 

	
 
\lhead{}
 
\rhead{}
 
\chead{}
 

	
 
\cfoot{\thepage}
 
\lfoot{}
 
\rfoot{Initials: \rule{0.15\textwidth}{0.2mm}}
 
\renewcommand{\headrulewidth}{0pt}
 
\renewcommand{\footrulewidth}{0pt}
 

	
 
\newcommand{\projectname}{FIXME-PROJECT-NAME\xspace}
 
\newcommand{\signatories}{FIXME-SIGNATORIES\xspace}
 
\newcommand{\leadershipbody}{FIXME-LEADERSHIP-BODY-NAME\xspace}
 
\newcommand{\signature}[3]{
 
\vspace{2ex}
 

	
 
By: \hspace{0.95em}\rule{0.50\textwidth}{0.2mm} \hfill{}Date: \rule{0.25\textwidth}{0.2mm}
 

	
 
\if\relax\detokenize{#1}\relax
 
\else
 
\hspace{2.5em} \textsc{#1}
 
\fi
 
\if\relax\detokenize{#2}\relax
 
\else
 

	
 
\hspace{2.5em} #2
 
\fi
 
\if\relax\detokenize{#3}\relax
 
\else
 

	
 
\hspace{2.5em} #3
 
\fi
 
\vspace{6ex}
 
}
 

	
 
\begin{document}
 

	
 
\begin{center}
 
\textsc{\Huge Fiscal Sponsorship Agreement}{\Huge {} } 
 
\textsc{\Huge Fiscal Sponsorship Agreement}{\Huge {} }
 
\par\end{center}
 

	
 
\bigskip{}
 

	
 

	
 
This Agreement is made by and between Software Freedom Conservancy
 
(``Conservancy'') and FIXME-CONTRIBUTOR-NAMES (the ``\signatories'')
 
on behalf of the project known as \projectname (the ``Project'') (each, a 
 
``Party''; together, ``the Parties'').  Conservancy is a New York nonprofit 
 
public benefit corporation located in Brooklyn, New York, which has received 
 
recognition of exemption from federal income tax under Section 501(c)(3) of 
 
the Internal Revenue Code (IRC) and classification as a public charity under 
 
on behalf of the project known as \projectname (the ``Project'') (each, a
 
``Party''; together, ``the Parties'').  Conservancy is a New York nonprofit
 
public benefit corporation located in Brooklyn, New York, which has received
 
recognition of exemption from federal income tax under Section 501(c)(3) of
 
the Internal Revenue Code (IRC) and classification as a public charity under
 
IRC Sections 509(a)(1) and 170(b)(1)(A)(vi).
 

	
 
\textsc{Whereas:}
 

	
 
\begin{enumerate}[label=\Alph*.,ref=\S \Alph*]
 
\item Conservancy's organizational mission and charitable goal is to promote,
 
improve, develop and defend Free, Libre, and Open Source Software
 
projects. 
 
projects.
 
\item The purpose of the Project is to produce, distribute, document, and
 
improve software and/or documentation that can be freely copied, modified and redistributed,
 
and for which modified versions can also be redistributed (``Free Software''),
 
and to facilitate and organize its production, improvement and ease
 
of use. 
 
of use.
 
\item Conservancy desires to act as the fiscal sponsor of the Project beginning
 
on the Effective Date (as defined below) to assist the Project in
 
accomplishing its purpose, which Conservancy has determined will further
 
Conservancy's charitable goals. The \signatories desire to manage
 
the Project under the sponsorship of Conservancy. 
 
the Project under the sponsorship of Conservancy.
 
\item Conservancy's Board of Directors has approved the establishment
 
of a fund to receive donations of cash and other property earmarked
 
for support of the Project and to make disbursements in furtherance
 
of the Project's mission (the ``Project Fund''). Currently, the
 
principal office of the Project is located at: [FIXME: MAILING ADDRESS]. 
 
principal office of the Project is located at: [FIXME: MAILING ADDRESS].
 
\end{enumerate}
 
\medskip{}
 

	
 

	
 
\textsc{Now, therefore, the Parties hereby agree as follows:}
 

	
 
\begin{enumerate}[label=\arabic*.,ref=\S~\arabic*]
 
\item \textbf{Term of Agreement}. As of the Effective Date, the Project
 
joins Conservancy, which relationship will continue unless and until
 
terminated as set forth in \ref{Termination}. 
 
terminated as set forth in \ref{Termination}.
 
\item \textbf{Project Management and Activities}.
 

	
 

	
 
\begin{enumerate}[label=\alph*.,ref=\theenumi(\alph*)]
 
\item \textbf{The \leadershipbody Will Manage the Project}. \label{ProjectManagement}
 
Authority to manage the technical, artistic and philanthropic direction
 
of the Project and the program activities of the Project is delegated
 
to the \leadershipbody as defined in \ref{Representation},
 
subject at all times to the direction and control of Conservancy's
 
Board of Directors. Conservancy will only intervene in the program
 
activities to the extent the Project is not in compliance with \ref{FreeSoftware}
 
or \ref{CharitablePurpose} of this Agreement. 
 
or \ref{CharitablePurpose} of this Agreement.
 
\item \textbf{The Project Will Be Free Software}. \label{FreeSoftware}
 
Conservancy and the \leadershipbody agree that any and all software
 
and/or documentation distributed by the Project will be distributed solely as Free Software.
 
Conservancy retains the sole right to determine whether the Project's
 
software and/or documentation constitutes Free Software (as defined herein).
 
\item \textbf{Ultimate Responsibility of Project}. Subject to \ref{ProjectManagement}
 
of this Agreement, all community programs, public information work,
 
fundraising events, processing and acknowledgment of cash and non-cash
 
revenue items, accounts payable and receivable, negotiation of leases
 
and contracts, disbursement of Project funds (including grants), and
 
other activities planned by the Project shall be the ultimate responsibility
 
of Conservancy and shall be conducted in the name of Conservancy,
 
beginning on the Effective Date. 
 
beginning on the Effective Date.
 
\item \textbf{Project Not An Agent Of Conservancy}. The \signatories
 
hereby acknowledge that the Project and the \leadershipbody
 
do not and shall not act as an agent for Conservancy unless specifically
 
authorized in writing by Conservancy to do so. 
 
authorized in writing by Conservancy to do so.
 
\end{enumerate}
 
\item \textbf{Fees}. The \signatories agree to donate ten percent
 
(10\%) of the Project's gross revenue (including, but not necessarily limited
 
to, all income and donations) to Conservancy for its general operations.
 

	
 

	
 
Notwithstanding the above, the \signatories agree that should Conservancy
 
be required to pay any taxes (including but not limited to sales taxes
 
and unrelated business taxable income) as the result of any activity
 
of the Project and/or activities undertaken by Conservancy on the
 
Project's behalf, such taxes shall be deducted from the Project Fund.
 

	
 

	
 
Conservancy will monitor any unrelated business taxable income and
 
may require the Project to cease activities generating such income
 
if the overall amounts exceed amounts permissible or prudent for Conservancy,
 
given Conservancy's tax exempt status.
 

	
 
\item \textbf{Project Fund/Variance Power}. Beginning on the Effective Date,
 
Conservancy shall place all gifts, grants, contributions and other
 
revenues received by Conservancy and identified with the Project into
 
a Project Fund to be used for the sole benefit of the Project's mission
 
as that mission may be defined by the \leadershipbody from
 
time to time with the approval of Conservancy. Conservancy retains
 
the unilateral right to spend such funds so as to accomplish the purposes
 
of the Project as nearly as possible within Conservancy's sole judgment.
 
Conservancy agrees to make a good faith effort to consider any expressed
 
donor intent in making determinations on the expenditure of that donor's
 
gift; however, the Parties acknowledge that expressions of donor intent
 
are not legally binding on Conservancy. The Parties agree that all
 
money, and the fair market value of all property, deposited in the
 
Project Fund be reported as the income of Conservancy, for both tax
 
purposes and for purposes of Conservancy's financial statements. It
 
is the intent of the Parties that this Agreement be interpreted to
 
provide Conservancy with variance powers necessary to enable Conservancy
 
to treat the Project Fund as Conservancy's asset in accordance with
 
Financial Accounting Statement No. 136 issued by the Financial Accounting
 
Standards Board, while this Agreement is in effect. 
 
Standards Board, while this Agreement is in effect.
 
\item \textbf{Project Fund Management / Performance of Charitable Purposes}.
 
\label{CharitablePurpose} All of the assets received by Conservancy
 
under the terms of this Agreement shall be devoted to the purposes
 
of the Project, within the tax-exempt purposes of Conservancy. The
 
\signatories agree not to use its funds or operate in any way which would
 
jeopardize the tax-exempt status of Conservancy. No item of revenue
 
shall be earmarked for use in any attempt to influence legislation
 
within the meaning of IRC Section 501(c)(3) and no agreement, oral
 
or written, to that effect shall be made between Conservancy and any
 
revenue source. Conservancy shall not use any portion of the assets
 
to participate or intervene in any political campaign on behalf or
 
in opposition to any candidate for public office, to induce or encourage
 
violations of law or public policy, to cause any private inurement
 
or improper private benefit to occur, nor to take any other action
 
inconsistent with IRC Section 501(c)(3). 
 
inconsistent with IRC Section 501(c)(3).
 

	
 
\item \textbf{Representation of the Project in Conservancy}. \label{Representation}The
 
\signatories, each a signatory hereto, hereby establish and comprise
 
the initial members of the \leadershipbody
 
to represent the Project in its official communication with Conservancy.
 
The \signatories hereby acknowledge that the \leadershipbody
 
will be subject to all terms of this Agreement.
 
On the Effective Date, the \signatories hereby transfer all
 
rights, obligations and privileges of this Agreement over to the
 
\leadershipbody.
 

	
 
[FIXME: Note: The rest of this section should describe the way in which the
 
Project wishes to interface with Conservancy; including who has
 
authority to communicate with Conservancy regarding the Project
 
and what is required in order for Conservancy to act on behalf
 
of the Project. For example, all of the Contributors confirm their
 
approval of a certain action, or can any one of the Contributors instruct
 
Conservancy to take a certain action. Also, the Contributors may
 
want to identify certain other individuals that have the power to
 
represent the Project. Here a few samples of how projects have handled
 
this clause in the other projects:
 

	
 
\begin{itemize}
 
\item \textbf{Simple Self-Perpetuating Committee}. The \signatories,
 
each a signatory hereto, shall initially [FIXME: form or comprise]
 
the \leadershipbody as a Project Committee (``Committee'')
 
to represent the Project in its official communication with Conservancy.
 
Existing Project Committee Members (``Members'') can be removed
 
from and new Members can be added to the Committee by simple majority
 
vote of the existing Committee; however, three (3) shall be the mandatory
 
minimum number of Members. All decisions of the Committee shall be
 
made by simple majority. The Committee shall appoint, by majority
 
vote, one Member as its ``Representative'' to communicate all Project
 
decisions to Conservancy.
 

	
 

	
 
The Representative shall promptly inform Conservancy of changes in
 
the Committee composition and of contact information for all Members.
 
If Conservancy is unable, after all reasonable efforts, to contact
 
a majority of the Members for a period of sixty (60) days, or if the
 
minimum number of Members is fewer than three for a period of at least
 
sixty days, Conservancy may unilaterally appoint new Members from
 
the Project community to replace any unreachable Members and/or to
 
increase the Committee composition to three Members.
 

	
 
\item \textbf{Self-Perpetuating Committee, w/ avoiding employees of same
 
company serving together}. The \signatories, each a signatory
 
hereto, shall initially [FIXME: form or comprise] the \leadershipbody
 
as a Project Committee (``Committee'') to represent the Project
 
in its official communication with Conservancy. Existing Project
 
Committee Members (``Members'') can be removed from and new Members
 
can be added to the Committee by simple majority vote of the existing
 
Committee; however, three (3) (the ``Minimum'') shall be the mandatory
 
minimum number of Members.
 

	
 

	
 
For purposes of this Agreement, a Member is ``Employed'' by an Entity
 
if the Member is compensated for more than thirty-two (32) hours of
 
work per week by such Entity for a continuous period of more than
 
sixty (60) days. No more than one Member may be Employed by the same
 
Entity.
 

	
 

	
 
Should two (2) or more Members be Employed by the same Entity at any
 
time (e.g., if an existing Member changes employers while a Member),
 
Members Employed by the same Entity must immediately resign in succession
 
until only one (1) of them remains on the Committee. Should voluntarily
 
resignations fail to yield the aforementioned result after sixty (60)
 
days, the Members Sharing an Employer shall be removed by Conservancy
 
from the Committee in order of decreasing seniority. Seniority shall
 
be determined by length of service by the Member on the Committee,
 
including all historical periods of non-contiguous service.
 

	
 

	
 
All decisions of the Committee shall be made by simple majority. The
 
Committee shall appoint, by majority vote, one Member as its Representative
 
to communicate all Project decisions to Conservancy. The Representative
 
shall promptly inform Conservancy of changes in the Committee composition
 
and of contact information for all Members. If Conservancy is unable,
 
after all reasonable efforts, to contact a majority of the Members
 
for a period of sixty (60) days, or if the number of Members is fewer
 
than the Minimum for a period of at least sixty days, Conservancy
 
may, after at least thirty days notice to Project, unilaterally appoint
 
new Members from the Project community to replace any unreachable
 
Members and/or to increase the Committee composition to the required
 
Minimum.
 

	
 
\item \textbf{An Elected Oversight Committee.} The \signatories, each
 
a signatory hereto, shall initially [FIXME: form or comprise] the 
 
\leadershipbody as a Project Committee (``Committee'') to 
 
a signatory hereto, shall initially [FIXME: form or comprise] the
 
\leadershipbody as a Project Committee (``Committee'') to
 
represent the Project in its official communication with Conservancy.  The
 
Committee shall hereafter be elected by community members of the Project as
 
designated by the Committee or a subcommittee of the Committee (the 
 
``Community Members'').  
 

	
 
The positions on the Committee will be on a two-year staggered basis 
 
([FIX-ME: some portion] of the initial board seats will be for one year).  
 
The members of the Committee may be removed from the position at any time 
 
by a majority vote of the Community Members.  Upon the resignation or 
 
removal of a member of the Oversight Board, the Community Members shall 
 
elect a replacement Community Member to serve on the Committee. 
 

	
 
The Committee will elect a single individual to communicate with 
 
Conservancy (the ``Representative'') and shall notify Conservancy promptly 
 
following the election of a new Representative.  The Representative will 
 
designated by the Committee or a subcommittee of the Committee (the
 
``Community Members'').
 

	
 
The positions on the Committee will be on a two-year staggered basis
 
([FIX-ME: some portion] of the initial board seats will be for one year).
 
The members of the Committee may be removed from the position at any time
 
by a majority vote of the Community Members.  Upon the resignation or
 
removal of a member of the Oversight Board, the Community Members shall
 
elect a replacement Community Member to serve on the Committee.
 

	
 
The Committee will elect a single individual to communicate with
 
Conservancy (the ``Representative'') and shall notify Conservancy promptly
 
following the election of a new Representative.  The Representative will
 
have the authority to instruct Conservancy on the Project's behalf on all
 
matters.  
 
matters.
 

	
 
This section may be modified by a vote of at least $\frac{3}{4}$ths of the 
 
Community Members, with the consent of Conservancy, such consent not to be 
 
This section may be modified by a vote of at least $\frac{3}{4}$ths of the
 
Community Members, with the consent of Conservancy, such consent not to be
 
unreasonably withheld.
 

	
 

	
 
\end{itemize}
 

	
 
Note again that the above are merely examples, not a list of options.
 
Conservancy's goal is to draft the Representation section to match
 
the existing and natural leadership structure of the Project, so each
 
project usually has a uniquely worded Representation section. ]
 

	
 
\item \textbf{Outstanding Liabilities}. The \signatories represent
 
that any liabilities that may be outstanding in connection with the
 
Project have been disclosed to Conservancy. 
 
Project have been disclosed to Conservancy.
 
\item \textbf{Termination}. \label{Termination} The \leadershipbody or Conservancy
 
may terminate this Agreement at any time subject to the following
 
understandings:
 

	
 

	
 
\begin{enumerate}[label=\alph*.,ref=\theenumi(\arabic*)]
 

	
 
\item \textbf{Notice and Successor Search}. Either Conservancy or the \leadershipbody
 
may terminate this Agreement on sixty (60) days' written notice (``the Notice Period'') to
 
the other Party, so long as a Successor can be found that meets the
 
following requirements (the ``Successor has Qualified''):
 

	
 

	
 
    \begin{enumerate}[label=\roman*.,ref=\theenumi(\alph{enumii})(\roman*)]
 
\item the Successor is another nonprofit corporation which is tax-exempt
 
under IRC Section 501(c)(3), 
 
under IRC Section 501(c)(3),
 
\item the Successor is not classified as a private foundation under Section
 
509(a), 
 
\item the Successor is willing and able to sponsor the Project, and, 
 
509(a),
 
\item the Successor is willing and able to sponsor the Project, and,
 
\item the Successor has (a) communicated its willingness to sponsor the
 
  Project in writing to Conservancy and (b) sent a copy of its 501(c)(3) determination letter to Conservancy, and, 
 
  Project in writing to Conservancy and (b) sent a copy of its 501(c)(3) determination letter to Conservancy, and,
 
\item the Successor is approved in writing by both Parties by the end of
 
the Notice Period, such approval not to be unreasonably withheld. 
 
the Notice Period, such approval not to be unreasonably withheld.
 
\end{enumerate}
 
\item \textbf{Additional Search Periods}. If the Parties cannot agree on
 
a Successor to sponsor the Project, the \leadershipbody
 
shall have an additional 60 days to find a Successor willing and able
 
to sponsor the Project. Any subsequent search periods of any length
 
shall only be granted at Conservancy's written permission. 
 
shall only be granted at Conservancy's written permission.
 
\item \textbf{Transfer to a Successor}. If a Successor has Qualified, the balance
 
of assets in the Project Fund, together with any other assets held
 
or liabilities incurred by Conservancy in connection with the
 
Project, shall be transferred to the Successor within thirty (30)
 
days of the approval of the Successor in writing by both Parties or
 
any extension thereof, subject to the approval of any third parties
 
that may be required.
 
\item \textbf{Termination Without a Successor}. If no Successor is found,
 
Conservancy may dispose of Project assets and liabilities
 
in any manner consistent with applicable tax and charitable trust
 
laws. 
 
\item \textbf{\signatories' Right to Terminate.} 
 
laws.
 
\item \textbf{\signatories' Right to Terminate.}
 
The \signatories hereby acknowledge that they will relinquish any
 
       rights to terminate separate from the \leadershipbody as
 
       of the Effective Date.
 
\end{enumerate}
 
\item \textbf{Miscellaneous}. Each provision of this Agreement shall be
 
separately enforceable, and the invalidity of one provision shall
 
not affect the validity or enforceability of any other provision.
 
This Agreement shall be interpreted and construed in accordance with
 
the laws of the State of New York. This Agreement constitutes the
 
only agreement, and supersedes all prior agreements and understandings,
 
both written and oral, among the Parties with respect to the subject
 
matter hereof. 
 
matter hereof.
 
\item \textbf{Amendments. }This Agreement may not be amended or modified,
 
except in writing and signed by both Conservancy and the entirety of \leadershipbody. 
 
except in writing and signed by both Conservancy and the entirety of \leadershipbody.
 
\item \textbf{Counterparts / Facsimile}. This Agreement may be executed
 
in two or more counterparts, each of which shall constitute an original,
 
but all of which, when together, shall constitute but one and the
 
same instrument, and shall become effective when one or more counterparts
 
have been signed by each Party hereto and delivered to the other Party.
 
In lieu of the original, a facsimile transmission or copy of the original
 
shall be as effective and enforceable as the original. 
 
shall be as effective and enforceable as the original.
 
\end{enumerate}
 
\vfill{}
 

	
 

	
 
\textsc{In witness whereof}, the Parties have executed this Fiscal
 
Sponsorship Agreement effective on the FIXME day of FIXME, FIXME (the
 
``Effective Date'').
 

	
 
\vspace{3em}
 

	
 
\signature{Software Freedom Conservancy, Inc.}{Bradley M. Kuhn}{Title: President}
 

	
 
\signature{}{FIXME-CONTRIBUTOR}{}
 
\signature{}{FIXME-CONTRIBUTOR}{}
 
\signature{}{FIXME-CONTRIBUTOR}{}
 
\end{document}
conservancy/content/projects/apply/index.html
Show inline comments
 
{% extends "base_projects.html" %}
 
{% block subtitle %}Project Services - {% endblock %}
 
{% block submenuselection %}Applying{% endblock %}
 
{% block content %}
 

	
 
<h1> Applying to Join Conservancy as a Member Project</h1>
 

	
 
<p>Part of Conservancy's activity is through its member projects.  These
 
  projects become formally part of Conservancy and have a close relationship
 
  with our activity.  Most of our projects are purely software projects, but
 
  we also occasionally accept initiatives designed to advance software
 
  freedom, such as Outreachy.</p>
 

	
 
<p>The situation for non-profit homes for FOSS activities has improved
 
  greatly since Conservancy was founded in 2006.  In the USA, options now
 
  exist for 501(c)(3), 501(c)(6) and even for-profit fiscal sponsorship, and
 
  there are other options around the globe as well.  Prospective member
 
  projects should carefully consider what type of structure is right for
 
  them.</p>
 

	
 
<p>For our part, Conservancy seeks projects that dedicate themselves to the
 
  advancement of software freedom and focus their projects on the rights of
 
  users to copy, share, modify and improve their software.  Being a FOSS
 
  project under an OSI-approved and DFSG-free license is mandatory, but not
 
  the only criteria.  Given the many options available for fiscal
 
  sponsorship, we are selective and often refer projects to other fiscal
 
  sponsors that are a better fit.  Nevertheless, we encourage projects to
 
  that need a non-profit home to apply to many fiscal sponsors.
 
  
 

 
<p>Conservancy's Evaluation Committee considers applications on a rolling
 
  basis.  Conservancy generally has dozens of projects in various stages of
 
  the application process.  We do not move rapidly to accept new projects, as
 
  we have found that consideration of joining or forming a non-profit
 
  organization for your project is best done with careful consideration over
 
  a period of many months rather than rapidly.</p>
 

	
 
<p>Conservancy's application process is somewhat informal.  New applicants
 
  should write an initial inquiry email
 
  to <a href="mailto:apply@sfconservancy.org">&lt;apply@sfconservancy.org&gt;</a>
 
  with a very brief description of their project and a URL to their project's
 
  website.  We'll send back initial questions, and after those questions are
 
  answered, we'll send the full application materials.  Applications should
 
  be submitted in plain ASCII text via email.  Your application will be
 
  assigned a ticket number in our ticketing system, and please be sure to
 
  include the proper ticket number details in the Subject line of your
 
  emails to ensure they are routed to the right place.</p>
 

	
 
<p>Projects are reviewed by Conservancy's Evaluation Committee, which is
 
  chartered by Conservancy's <a href="/about/board/">Board of
 
  Directors</a>.</p>
 

	
 
<h1>Project Membership Application FAQs</h1>
 

	
 
<p>The following are various questions that we typically get from project
 
  leaders that wish to apply to Conservancy.</p>
 

	
 

	
 
<h2>I sent in my inquiry letter and/or application a long time ago.  Why haven't you replied?</h2>
 

	
 
<p>Conservancy receives an overwhelming level of interest and we have very few
 
  <a href="/about/staff/">staff positions</a> to
 
  meet the interest and demand
 
  for <a href="/members/services/">Conservancy's
 
  services</a> to its member projects.  Meanwhile, Conservancy always
 
  prioritizes needs of
 
  its <a href="/members/current/">existing member
 
  projects</a> over new inquiries and applications.  Therefore, it
 
  sometimes can take quite a while to finish the application process and
 
  be offered membership, but please note that such delays mean that should
 
  your project ultimately become a member project, your project will then
 
  be a beneficiary of this policy.  Also, generally speaking, we encourage
 
  care and consideration when joining a non-profit and we do not believe
 
  a rapid membership process is in the interest of projects.</p>
 

	
 
<h2>What are the key criteria our project must meet to join?</h2>
 

	
 
<p>In order to join, projects need to meet certain criteria.  A rough
 
  outline of those criteria are as follows:</p>
 

	
 
<ul><li>The project must be exclusively devoted to the development and
 
    documentation of FOSS.  The project's goals must be consistent with
 
    Conservancy's tax-exempt purposes, and other requirements imposed on
 
    Conservancy by the IRS' 501(c)(3) rules.  Namely, the goal of the project
 
    must to develop and document the software in a not-for-profit way to
 
    advance the public good, and must develop the software in public, and
 
    strategically advance software freedom for all users.</li>
 

	
 
    <li>The project must be licensed in a way fitting with software freedom
 
      principles.  Specifically, all software of the project should be
 
      licensed under a license that is listed both as as
 
      an <a href="http://www.opensource.org/licenses/alphabetical">Open
 
      Source license by the Open Source Initiative</a> and
 
      as <a href="https://www.debian.org/legal/licenses/">DFSG-Free
 
      license</a>.  All software documentation for the project should be
 
      licensed under a license on the preceding lists, or under Creative
 
      Commons' <a href="https://creativecommons.org/licenses/by-sa/3.0/">CC-By-SA</a>
 
      or <a href="https://creativecommons.org/licenses/by/3.0/">CC-By</a> or
 
        <a href="https://creativecommons.org/choose/zero/">CC-0</a>.</li>
 

	
 
   <li>The project should have an existing, vibrant, diverse community
 
      that develops and documents the software.  For example, projects
 
      that have been under development for less than a year or only a
 
      &ldquo;proof of concept&rdquo; implementation are generally not
 
      eligible.</li>
 
</ul>
 

	
 
<p>While any project meeting the criteria above can apply, meeting these
 
  criteria doesn't guarantee acceptance of your project.  Conservancy
 
  favors projects that are well-established and have some track record of
 
  substantial contributions from a community of volunteer developers.
 
  Furthermore, Conservancy does give higher priority to projects that
 
  have an established userbase and interest, but also tries to accept some
 
  smaller projects with strong potential.</p>
 

	
 
<h2>Is our project required to accept membership if offered?</h2>
 

	
 
<p>Not at all.  Many projects apply and subsequently decide not to join a
 
  non-profit, or decide to join a different non-profit entity.  Don't
 
  worry about &ldquo;wasting our time&rdquo; if your project's developers
 
  aren't completely sure yet if they want to join Conservancy.  If
 
  membership in Conservancy is currently a legitimate consideration for
 
  your project, we encourage you to apply.  We'd rather that you apply and
 
  turn down an offer for membership than fail to apply and have to wait
 
  until the next application round when you're sure.</p>
 

	
 
<h2>What benefits does our project get from joining?</h2>
 

	
 
<p>We maintain a <a href="/members/services">detailed list of services
 
    that Conservancy provides to member projects</a>.  If you have
 
    detailed questions about any of the benefits, please
 
    ask <a href="mailto:apply@sfconservancy.org">&lt;apply@sfconservancy.org&gt;</a>
 
    in your application ticket.  We find however that projects will find
 
    Conservancy a better fit if you don't view Conservancy as a service
 
    provider; we are not a service provider in the sense of your hosting
 
    provider or other vendor.  Conservancy projects become a part of
 
    Conservancy, and as such membership with Conservancy is an equal
 
    partnership between you and your project and should be treated as such.
 
    If that's not the kind of relationship you want from your fiscal
 
    sponsor, then other options are likely a better fit for your project.</p>
 

	
 
<h2>Conservancy seems to be called a &ldquo;fiscal sponsor&rdquo; to its
 
  member projects.  Does that mean you give our project money if we join?</h2>
 

	
 
<p>It's true that we would love to fund our member projects if it were
 
  possible, because we believe they deserve to be funded.  However, that's
 
  not typically what a fiscal sponsor does.  The term &ldquo;fiscal
 
  sponsor&ldquo; is often used in non-profit settings and has a standard
 
  meaning there.  But, to those not familiar with non-profit operations,
 
  it comes across as a bit of a misnomer.</p>
 

	
 
<p>In this context, a fiscal sponsor is a non-profit organization that,
 
  rather than fund a project directly, provides the required
 
  infrastructure and facilitates the project's ability to raise its own
 
  funds.  Conservancy therefore assists your project in raising funds, and
 
  allows your project to hold those funds and spend them on activities
 
  that simultaneously advance Conservancy's non-profit mission
 
  and the FLOSS development and documentation goals of the project.</p>
conservancy/content/projects/policies/publish-policy.py
Show inline comments
...
 
@@ -231,129 +231,128 @@ Try `apt install python3-markdown` or `python3 -m pip install --user Markdown`."
 
class GitOperation:
 
    def __init__(self, args):
 
        self.args = args
 
        self.git_path = args.git_output
 
        self.exitcode = None
 
        self.on_work_tree = self.git_path.can_run() and self.git_path.is_work_tree()
 

	
 
    def run(self):
 
        arg_state = getattr(self.args, self.NAME)
 
        if arg_state is None:
 
            arg_state = self.should_run()
 
        if not arg_state:
 
            return
 
        try:
 
            self.exitcode = self.run_git() or 0
 
        except subprocess.CalledProcessError as error:
 
            self.exitcode = error.returncode
 

	
 

	
 
class GitPull(GitOperation):
 
    NAME = 'pull'
 

	
 
    def should_run(self):
 
        return self.on_work_tree and not self.git_path.has_staged_changes()
 

	
 
    def run_git(self):
 
        self.git_path.operate(['fetch', '--no-tags'])
 
        self.git_path.operate(['merge', '--ff-only'])
 

	
 

	
 
class GitCommit(GitOperation):
 
    NAME = 'commit'
 
    VERB = 'committed'
 

	
 
    def __init__(self, args):
 
        super().__init__(args)
 
        try:
 
            self._should_run = ((not self.git_path.has_staged_changes())
 
                                and self.git_path.in_sync_with_upstream())
 
        except subprocess.CalledProcessError:
 
            self._should_run = False
 

	
 
    def should_run(self):
 
        return self.on_work_tree and self._should_run
 

	
 
    def run_git(self):
 
        self.git_path.operate([
 
            'add', str(self.args.output_file_path), str(self.args.output_link_path),
 
        ])
 
        commit_message = self.args.commit_message.format(
 
            filename=self.args.output_link_path.name,
 
            revision=self.args.revision,
 
        )
 
        self.git_path.operate(['commit', '-m', commit_message])
 

	
 

	
 
class GitPush(GitCommit):
 
    NAME = 'push'
 
    VERB = 'pushed'
 

	
 
    def run_git(self):
 
        self.git_path.operate(['push'])
 

	
 

	
 
def write_output(args):
 
    converter = markdown.Markdown(
 
        extensions=[
 
            mdx_tables.TableExtension(),
 
            mdx_sane_lists.SaneListExtension(),
 
            mdx_smarty.SmartyExtension(),
 
            mdx_toc.TocExtension(),
 
        ],
 
        output_format='html5',
 
    )
 
    header = TEMPLATE_HEADER
 
    with args.input_path.open(encoding=args.encoding) as src_file:
 
        for line in src_file:
 
            if line.startswith('# '):
 
                subtitle = line[2:].replace('Software Freedom Conservancy', '').strip()
 
                header = header.replace(
 
                    '{% block subtitle %}',
 
                    '{{% block subtitle %}}{} - '.format(subtitle),
 
                )
 
                break
 
        src_file.seek(0)
 
        body = converter.convert(src_file.read())
 
    with tempfile.NamedTemporaryFile(
 
            'w',
 
            encoding=args.encoding,
 
            dir=args.git_output.dir_path.as_posix(),
 
            suffix='.html',
 
            delete=False,
 
    ) as tmp_out:
 
        try:
 
            tmp_out.write(header)
 
            tmp_out.write(body)
 
            tmp_out.write(TEMPLATE_FOOTER)
 
            tmp_out.flush()
 
            os.rename(tmp_out.name, str(args.output_file_path))
 
        except BaseException:
 
            os.unlink(tmp_out.name)
 
            raise
 
    if args.output_link_path.is_symlink():
 
        args.output_link_path.unlink()
 
    args.output_link_path.symlink_to(args.output_file_path.name)
 

	
 
def main(arglist=None, stdout=sys.stdout, stderr=sys.stderr):
 
    args = parse_arguments(arglist)
 
    pull = GitPull(args)
 
    pull.run()
 
    if pull.exitcode:
 
        return pull.exitcode
 
    write_output(args)
 
    ops = [GitCommit(args), GitPush(args)]
 
    for op in ops:
 
        op.run()
 
        if op.exitcode != 0:
 
            exitcode = op.exitcode or 0
 
            break
 
    else:
 
        exitcode = 0
 
    print(args.input_path.name, "converted,",
 
          ", ".join(op.VERB if op.exitcode == 0 else "not " + op.VERB for op in ops),
 
          file=stdout)
 
    return exitcode
 

	
 
if __name__ == '__main__':
 
    exit(main())
 

	
conservancy/content/projects/services/index.html
Show inline comments
 
{% extends "base_projects.html" %}
 
{% block subtitle %}Member Project Services - {% endblock %}
 
{% block submenuselection %}Services{% endblock %}
 
{% block content %}
 

	
 
<h1>Member Project Services</h1>
 

	
 
<p>Conservancy assists FLOSS project leaders by handling all matters other
 
  than software development and documentation, so the developers can focus
 
  on what they do best: improving the software for the public good.  The
 
  following are the services and options that are available to FLOSS
 
  projects that have joined Conservancy as a member project.</p>
 

	
 
<h2>Tax-Deductible, Earmarked Donations</h2>
 

	
 
<p>Member projects can receive earmarked donations through Conservancy.
 
   Since Conservancy is a 501(c)(3) charity incorporated in New York,
 
   donors can often deduct the donation on their USA taxes.  Additionally,
 
   the donors can indicate that their donation should be used to advance a
 
   specific member project, and those funds are kept in a separate account
 
   for the member project by Conservancy.  This structure prevents
 
   developers from having to commingle project funds with their own
 
   personal accounts or having to set up their own project specific
 
   account.</p>
 

	
 
   <p>Since Conservancy is a tax-exempt organization, there are some
 
   limits that the law places on what member projects can do with their
 
   assets, but those limits are the same as if the project was an
 
   independent non-profit entity.  Usually, the project leadership
 
   instructs Conservancy's leadership on how the project's funds are spent.
 
   Conservancy spends these funds on the project's behalf on any expenses
 
   that constitute appropriate activity under Conservancy's 501(c)(3)
 
   not-for-profit mission.  Some typical uses of earmarked donations by
 
   Conservancy's member projects are:</p>
 

	
 
<ul>
 
<li>funding travel expenses for project developers to attend relevant
 
  conferences.</li> 
 
  conferences.</li>
 

	
 
<li>domain name fees, bandwidth costs, and computer equipment
 
  purchases.</li>
 

	
 
<li>purchasing media for distribution of project software at conferences
 
  and events.</li>
 

	
 
<li>paying key developers on a contractual basis to improve the project's
 
  software and its documentation.</li>
 

	
 
<li>sponsoring and organizing conferences for the project.</li>
 
 
 

 
<li>trademark registration and enforcement.</li>
 

	
 
<li>FLOSS license enforcement and compliance activity.</li>
 
</ul>
 

	
 
<h2>Asset Stewardship</h2>
 

	
 
<p>Conservancy can hold any assets for the project on its behalf.  This
 
  includes copyrights, trademarks, domain names, physical computer
 
  equipment or anything that should be officially held in the name of the
 
  project.  Member projects are not required that Conservancy hold all
 
  assets of a project. (For example, member projects are
 
  not <em>required</em> to assign copyrights to Conservancy.)
 
  However, Conservancy can accommodate the needs of projects that want
 
  their assets under the control of a not-for-profit entity and exercised
 
  only for the public good.</p>
 

	
 
<h2>Contract Negotiation and Execution</h2>
 

	
 
<p>Projects sometimes need to negotiate and execute a contract with a
 
  company.  For example, when a project wants to organize and run a
 
  conference, the venue usually has a complicated contract for rental of
 
  the space and services.  Conservancy assists projects in the negotiation
 
  of such contracts, and can sign them on behalf of the project.</p>
 

	
 
<h2>Conference Logistical Support</h2>
 

	
 
<p>Many Conservancy projects have an annual conference.  Conservancy
 
  provides logistical support for these conferences, particularly in the
 
  area of financial responsibility and liability.  Conservancy provides a
 
  small amount of logistical support for conference in other ways,
 
  resource-permitting.</p>
 

	
 
<h2>Basic Legal Advice and Services</h2>
 

	
 
<p>Since projects, upon joining, become organizationally part of
 
  Conservancy, Conservancy can provide basic legal services to its member
 
  projects through Conservancy's own General Counsel, outside counsel, and
 
  pro-bono attorneys.  For example, Conservancy assists its projects in
 
  handling issues related to trademark registration, trademark policy
 
  development and licensing, trademark enforcement, copyright licensing
 
  and enforcement, and non-profit governance questions and issues.</p>
 

	
 
<h2>FLOSS Copyright License Enforcement</h2>
 

	
 
<p>Complying with FLOSS licenses is easy, as they permit and encourage
 
  both non-commercial and commercial distribution and improvements.
 
  Nevertheless, violations of FLOSS licenses (in particular of
 
  the <a href="http://www.gnu.org/licenses/gpl.html">GPL</a>
 
  and <a href="http://www.gnu.org/licenses/lgpl.html">LGPL</a>) are all
 
  too common.  At request of the project's leaders, Conservancy can carry
 
  out license enforcement activity on behalf of the project's copyright
 
  holders.</p>
 

	
 
<h2>Fundraising Assistance</h2>
 

	
 
<p>Conservancy provides various tools and advice to member projects on
 
  methods of raising funds for their projects' earmarked accounts.</p>
 

	
 
<h2>Avoid Non-Profit Administrivia</h2>
 

	
 
<p>Member projects can continue to operate in the same way they did before
 
joining Conservancy without having to select a board of directors or
 
any other layer of corporate management, without having to maintain
 
corporate records and without having to do any of the other things
 
required of incorporated entities.  Conservancy handles all of that
 
burden on behalf of its projects.</p>
 

	
 

	
 
<h2>Leadership Mentoring, Advice and Guidance</h2>
 

	
 
<p>Many of Conservancy's <a href="/about/board">directors</a> are
 
  experienced FLOSS project leaders.  They offer themselves as a resource
 
  to member project leaders who need assistance or face challenges in
 
  their work leading their projects.</p>
 

	
 
<h2>Some Personal Liability Protection</h2>
 

	
 
<p>When a project joins Conservancy, it formally becomes part of the
 
  Conservancy. (The project is thus somewhat analogous to a division of a
 
  company or a department in a large agency.)  As such, project leaders
 
  benefit from some amount of protection from personal liability for their
 
  work on the project.</p>
 

	
 
<h2>Officiating Community Elections and Ballot Initiatives</h2>
 

	
 
<p>Conservancy will organize and run community leadership committee elections
 
  and/or ballot initiatives for its member project communities,
 
  using <a href="https://gitorious.org/conservancy/voting/">online voting
 
  software</a>.</p>
 

	
 
<hr/>
 

	
 
<p>Those familiar with non-profit terminology will recognize most of these
 
  services
 
  as <a href="https://en.wikipedia.org/wiki/Fiscal_sponsorship">fiscal
 
  sponsorship services</a>.  This term is not particularly well
 
  known in the FLOSS community, and many are confused by that term.
 
  However, if you are familiar with what a fiscal sponsor typically does
 
  in the non-profit sector, the term does fit many of services that
 
  Conservancy offers its member projects.</p>
 

	
 
<p>Project
 
leaders that believe their project might benefit from these services can
 
<a href="/members/apply/">apply to become a member project</a>.</p>
 
{% endblock %}
conservancy/events/admin.py
Show inline comments
 
from django.contrib import admin
 

	
 
from .models import Event, EventMedia, EventTag
 

	
 
admin.site.register(EventTag)
 

	
 
@admin.register(Event)
 
class EventAdmin(admin.ModelAdmin):
 
    list_display = ("title", "date", "date_tentative", "location")
 
    list_filter = ['date']
 
    date_hierarchy = 'date'
 
    search_fields = ["title", "description", "earth_location"]
 
    prepopulated_fields = {'slug' : ("title",) }
 

	
 

	
 
@admin.register(EventMedia)
 
class EventMediaAdmin(admin.ModelAdmin):
 
    list_display = ("event", "format", "novel")
 

	
 

	
 

	
conservancy/events/models.py
Show inline comments
 
from datetime import datetime, timedelta
 

	
 
from django.db import models
 

	
 
from ..staff.models import Person
 
from ..worldmap.models import EarthLocation
 

	
 

	
 
class EventTag(models.Model):
 
    """Tagging for events
 

	
 
    (currently unused)
 
    """
 

	
 
    label = models.CharField(max_length=100)
 

	
 
    date_created = models.DateField(auto_now_add=True)
 

	
 
    def __str__(self):
 
        return self.label
 

	
 
class PastEventManager(models.Manager):
 
    """Returns all past events"""
 

	
 
    def get_queryset(self):
 
        return super().get_queryset().filter(date__lt=datetime.today())
 

	
 
class FutureEventManager(models.Manager):
 
    """Returns all future events"""
 

	
 
    def get_queryset(self):
 
        return super().get_queryset().filter(date__gte=datetime.today())
 

	
 
class Event(models.Model):
 
    """Model for Conservancy staff member events (presentations, etc)"""
 

	
 
    title = models.CharField(max_length=400)
 
    date = models.DateField()
 
    date_tentative = models.BooleanField(default=False)
 
    datetime = models.CharField("Date and Time", max_length=300, blank=True)
 
    slug = models.SlugField(unique_for_year='date')
 
    description = models.TextField(blank=True)
 
    people = models.ManyToManyField(Person, blank=True)
 
    location = models.CharField(max_length=1000)
 
    earth_location = models.ForeignKey(
 
        EarthLocation, null=True, blank=True, help_text="Label will not be displayed",
 
        on_delete=models.CASCADE
 
    )
 
    tags = models.ManyToManyField(EventTag, blank=True)
 

	
 
    date_created = models.DateTimeField(auto_now_add=True)
 
    date_last_modified = models.DateTimeField(auto_now=True)
 

	
 
    class Meta:
 
        ordering = ("-date",)
 

	
 
    def __str__(self):
 
        return "{} ({})".format(self.title, self.date)
 

	
 
    def get_absolute_url(self):
 
        return "/events/{}/{}/".format(self.date.strftime("%Y"), self.slug)
 

	
 
    def day_after(self):
 
        return self.date + timedelta(days=1)
 

	
 
    # for aggregate feed
 
    pub_date = property(lambda self: self.date_created)
 

	
 
    objects = models.Manager()
 
    past = PastEventManager()
 
    future = FutureEventManager()
 

	
 
class EventMedia(models.Model):
 
    """Media from an event
 

	
 
    includes transcripts, audio, and video pieces
 
    """
 

	
 
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
 
    format = models.CharField(max_length=1,
 
                              choices=(('T', 'Transcript'),
 
                                       ('A', 'Audio'),
 
                                       ('V', 'Video')))
 
    local = models.CharField(max_length=300, blank=True,
 
                             help_text="Local filename of the resource.  File should be uploaded into the static directory that corresponds to the event.")
 
    # verify_exists removed https://docs.djangoproject.com/en/1.7/releases/1.4/
 
    remote = models.URLField(blank=True,
 
                             help_text="Remote URL of the resource.  Required if 'local' is not given.")
 
    novel = models.BooleanField(help_text="Is it a new piece of media or another form of an old one?  If it is new it will be included in the event-media RSS feed and shown on the front page for a bit.", default=False)
 

	
 
    date_created = models.DateTimeField(auto_now_add=True)
 
    date_last_modified = models.DateTimeField(auto_now=True)
 

	
 
    class Meta:
 
        verbose_name_plural = 'event media'
 

	
 
    def __str__(self):
 
        return "{} media: {}".format(self.event, self.format)
 

	
conservancy/feeds.py
Show inline comments
...
 
@@ -62,203 +62,203 @@ class OmnibusFeedType(Rss201rev2Feed):
 
        attrs['xmlns:atom'] = 'http://www.w3.org/2005/Atom'
 
        attrs['xmlns:media'] = 'http://search.yahoo.com/mrss/'
 
        attrs['xmlns:dc'] = "http://purl.org/dc/elements/1.1/"
 
        return attrs
 

	
 
    def add_root_elements(self, handler):
 
        super().add_root_elements(handler)
 

	
 
    def add_item_elements(self, handler, item):
 
        super().add_item_elements(handler, item)
 
        # Block things that don't have an enclosure from iTunes in
 
        # case someone uploads this feed there.
 
        handler.addQuickElement("itunes:block", 'Yes')
 

	
 
class OmnibusFeed(ConservancyFeedBase):
 
    get_absolute_url = '/feeds/omnibus/'
 
    feed_type = OmnibusFeedType
 
    link ="/news/"
 
    title = "The Software Freedom Conservancy"
 
    description = "An aggregated feed of all RSS content available from the Software Freedom Conservancy, including both news items and blogs."
 
    title_template = "feeds/omnibus_title.html"
 
    description_template = "feeds/omnibus_description.html"
 
    author_email = "info@sfconservancy.org"
 
    author_link = "https://sfconservancy.org/"
 
    author_name = "Software Freedom Conservancy"
 

	
 
    def item_title(self, item):
 
        return item.headline
 

	
 
    def item_description(self, item):
 
        return item.summary
 

	
 
    def item_enclosure_mime_type(self):
 
        return "audio/mpeg"
 

	
 
    def item_enclosure_url(self, item):
 
        if hasattr(item, 'mp3_path'):
 
            return "https://sfconservancy.org" + item.mp3_path
 
    def item_enclosure_length(self, item):
 
        if hasattr(item, 'mp3_path'):
 
            return item.mp3_length
 

	
 
    def item_author_name(self, item):
 
        if item.omnibus_type == "blog":
 
            return item.author.formal_name
 
        else:
 
            return "Software Freedom Conservancy"
 

	
 
    def item_author_link(self, obj):
 
        return "https://sfconservancy.org"
 

	
 
    def item_author_email(self, item):
 
        if item.omnibus_type == "news":
 
            return "info@sfconservancy.org"
 
        elif hasattr(item, 'author'):
 
            return "%s@sfconservancy.org" % item.author
 
        else:
 
            return "info@sfconservancy.org"
 

	
 
    def item_pubdate(self, item):
 
        if item.omnibus_type == "event":
 
            return item.date_created
 
        else:
 
            return item.pub_date
 

	
 
    def item_link(self, item):
 
        return item.get_absolute_url()
 

	
 
# http://groups.google.ca/group/django-users/browse_thread/thread/d22e8a8f378cf0e2
 

	
 
    def items(self):
 
        blogs = BlogEntry.objects.filter(pub_date__lte=datetime.now()).order_by('-pub_date')[:25]
 
        for bb in blogs:
 
            bb.omnibus_type = "blog"
 
            bb.omnibus_feed_description_template = "feeds/blog_description.html"
 
            bb.omnibus_feed_title_template = "feeds/blog_title.html"
 

	
 
        news = PressRelease.objects.filter(pub_date__lte=datetime.now(),
 
                                           sites__id__exact=settings.SITE_ID).order_by('-pub_date')[:25]
 
        for nn in news:
 
            nn.omnibus_type = "news"
 
            nn.omnibus_feed_description_template = "feeds/news_description.html"
 
            nn.omnibus_feed_title_template = "feeds/news_title.html"
 

	
 
        a  = [ ii for ii in itertools.chain(blogs, news)]
 
        a.sort(key=operator.attrgetter('pub_date'), reverse=True)
 
        return a
 

	
 

	
 
    def item_extra_kwargs(self, item):
 
        return super().item_extra_kwargs(item)
 

	
 
class BlogFeed(ConservancyFeedBase):
 
    link = "/blog/"
 
    get_absolute_url = '/feeds/blog/'
 

	
 
    def get_object(self, request):
 
        return request
 

	
 
    def title(self, obj):
 
        answer = "The Software Freedom Conservancy Blog"
 

	
 
        GET = obj.GET
 
        tags = []
 
        if 'author' in GET:
 
            tags = GET.getlist('author')
 
        if 'tag' in GET:
 
            tags += GET.getlist('tag')
 

	
 
        if len(tags) == 1:
 
            answer += " (" + tags[0] + ")"
 
        elif len(tags) > 1:
 
            firstTime = True
 
            done = {}
 
            for tag in tags:
 
                if tag in done:
 
                    continue
 
                if firstTime:
 
                    answer += " ("
 
                    firstTime = False
 
                else:
 
                    answer += ", "
 
                answer += tag
 
                done[tag] = tag
 
            answer += ")"
 
        else:
 
            answer += "."
 
        return answer
 
        
 

 
    def description(self, obj):
 
        answer = "Blogs at the Software Freedom Conservancy"
 

	
 
        GET = obj.GET
 
        tags = []
 
        if 'author' in GET:
 
            tags = GET.getlist('author')
 
        if 'tag' in GET:
 
            tags += GET.getlist('tag')
 

	
 
        done = {}
 
        if len(tags) == 1:
 
            answer += " tagged with " + tags[0]
 
        elif len(tags) > 1:
 
            firstTime = True
 
            for tag in tags:
 
                if tag in done:
 
                    continue
 
                if firstTime:
 
                    answer += " tagged with "
 
                    firstTime = False
 
                else:
 
                    answer += " or "
 
                answer += tag
 
                done[tag] = tag
 
        else:
 
            answer = "All blogs at the Software Freedom Conservancy"
 
        answer += "."
 

	
 
        return answer
 
        
 

 
    def item_title(self, item):
 
        return item.headline
 

	
 
    def item_description(self, item):
 
        return item.summary
 

	
 
    def item_author_name(self, item):
 
        return item.author.formal_name
 

	
 
    def item_author_email(self, item):
 
        return "%s@sfconservancy.org" % item.author
 

	
 
    def item_pubdate(self, item):
 
        return item.pub_date
 

	
 
    def items(self, obj):
 
        GET = obj.GET
 

	
 
        def OR_filter(field_name, subfield_name, objs):
 
            from django.db.models import Q
 
            return reduce(lambda x, y: x | y,
 
                          [Q(**{'{}__{}'.format(field_name, subfield_name): x})
 
                           for x in objs])
 

	
 
        queryset = BlogEntry.objects.filter(pub_date__lte=datetime.now())
 

	
 
        if 'author' in GET:
 
            authors = GET.getlist('author')
 
            queryset = queryset.filter(OR_filter('author', 'username', authors))
 

	
 
        if 'tag' in GET:
 
            tags = GET.getlist('tag')
 
            queryset = queryset.filter(OR_filter('tags', 'slug', tags))
 

	
 
        return queryset.order_by('-pub_date')[:10]
 

	
 

	
 
def view(request):
 
    """Listing of all available feeds
 
    """
 

	
 
    feeds = (PressReleaseFeed, BlogFeed, OmnibusFeed)
 
    return render(request, "feeds.html", {'feeds': feeds})
conservancy/news/admin.py
Show inline comments
 
from django.contrib import admin
 

	
 
from .models import ExternalArticle, ExternalArticleTag, PressRelease
 

	
 

	
 
@admin.register(PressRelease)
 
class PressReleaseAdmin(admin.ModelAdmin):
 
    list_display = ("headline", "pub_date")
 
    list_filter = ['pub_date']
 
    date_hierarchy = 'pub_date'
 
    search_fields = ['headline', 'summary', 'body']
 
    prepopulated_fields = { 'slug' : ("headline",), }
 

	
 
admin.site.register(ExternalArticleTag)
 

	
 
@admin.register(ExternalArticle)
 
class ExternalArticleAdmin(admin.ModelAdmin):
 
    list_display = ("title", "publication", "visible", "date")
 
    list_filter = ['date']
 
    date_hierarchy = 'date'
 
    search_fields = ["title", "info", "publication"]
 

	
 

	
 

	
 

	
conservancy/news/models.py
Show inline comments
 
from datetime import datetime, timedelta
 

	
 
from django.conf import settings
 
from django.contrib.sites.models import Site
 
from django.db import models
 

	
 
from .. import bsoup
 
from ..events.models import Event
 
from ..staff.models import Person
 

	
 

	
 
class PressRelease(models.Model, bsoup.SoupModelMixin):
 
    """News release model"""
 

	
 
    headline = models.CharField(max_length=300)
 
    subhead = models.CharField(max_length=300, blank=True)
 
    slug = models.SlugField(unique_for_date="pub_date",
 
                            help_text=("automatically built from headline"))
 
    summary = models.TextField(help_text="First paragraph (raw HTML)")
 
    body = models.TextField(help_text="Remainder of post (raw HTML)",
 
                            blank=True)
 
    pub_date = models.DateTimeField("date [to be] published")
 
    sites = models.ManyToManyField(Site)
 

	
 
    date_last_modified = models.DateTimeField(auto_now=True)
 

	
 
    class Meta:
 
        ordering = ("-pub_date",)
 
        get_latest_by = "pub_date"
 

	
 
    SOUP_ATTRS = ['summary', 'body']
 

	
 
    def __str__(self):
 
        return self.headline
 

	
 
    def get_absolute_url(self):
 
        return "/news/{}/{}/".format(
 
            self.pub_date.strftime("%Y/%b/%d").lower(),
 
            self.slug,
 
        )
 

	
 
    def is_recent(self):
 
        return self.pub_date > (datetime.now() - timedelta(days=5))
 
        # question: does datetime.now() do a syscall each time is it called?
 

	
 
    def is_in_past_month(self):
 
        # This function is deprecated.  Use the date_within template
 
        # filter instead (example in conservancy/templates/frontpage.html)
 
        return self.pub_date > (datetime.now() - timedelta(days=30))
 

	
 
    def save(self):
 
        if settings.DEBUG or True:
 
            super().save()
 
            return
 

	
 
        blog_name = 'Software Freedom Conservancy News'
 
        blog_url = 'https://www.sfconservancy.org/news/'
 
        post_url = ('https://www.sfconservancy.org'
 
                    + self.get_absolute_url())
 

	
 
        import xmlrpc.client
 

	
 
        # Ping Technorati
 
        j = xmlrpc.client.Server('http://rpc.technorati.com/rpc/ping')
 
        j.weblogUpdates.ping(blog_name, blog_url)
 

	
 
        # Ping Google Blog Search
 
        j = xmlrpc.client.Server('http://blogsearch.google.com/ping/RPC2')
 
        j.weblogUpdates.ping(blog_name, blog_url, post_url)
 

	
 
        # Call any superclass's method
 
        super().save()
 

	
 
class ExternalArticleTag(models.Model):
 
    """A way to tag external articles"""
 

	
 
    label = models.CharField(max_length=100)
 

	
 
    date_created = models.DateField(auto_now_add=True)
 

	
 
    def __str__(self):
 
        return self.label
 

	
 
class PublicExternalArticleManager(models.Manager):
 
    def get_queryset(self):
 
        return super().get_queryset().filter(visible=True)
 

	
 
class ExternalArticle(models.Model):
 
    """A system for displaying Conservancy news mentions on the site.
 

	
 
    (Currently unused)
 
    """
 

	
 
    title = models.CharField(max_length=400)
 
    info = models.CharField(help_text="subscribers only? audio? pdf warning?",
 
                            blank=True, max_length=300)
 
    publication = models.CharField("source of article", max_length=300)
 
    # verify_exists removed https://docs.djangoproject.com/en/1.7/releases/1.4/
 
    url = models.URLField(blank=True)
 
    date = models.DateField()
 
    visible = models.BooleanField(help_text="Whether to display on website", default=True)
 

	
 
    tags = models.ManyToManyField(ExternalArticleTag, blank=True)
 
    people = models.ManyToManyField(Person, blank=True)
 
    event = models.ForeignKey(Event, null=True, blank=True, on_delete=models.CASCADE)
 
    press_release = models.ForeignKey(PressRelease, null=True, blank=True, on_delete=models.CASCADE)
 

	
 
    date_created = models.DateField(auto_now_add=True)
 

	
 
    class Meta:
 
        ordering = ("-date_created",)
 
        get_latest_by = "date_created"
 

	
 
    def __str__(self):
 
        return "{} ({})".format(self.title, self.publication)
 

	
 
    objects = models.Manager()
 
    public = PublicExternalArticleManager()
 

	
conservancy/news/views.py
Show inline comments
 
from datetime import datetime
 

	
 
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
 
from django.shortcuts import render
 
from django.views.generic import ListView
 
from django.views.generic.dates import (
 
    DateDetailView,
 
    DayArchiveView,
 
    MonthArchiveView,
 
    YearArchiveView,
 
)
 

	
 
from .models import PressRelease
 

	
 

	
 
class NewsListView(ListView):
 
    extra_context = {}
 
    def get_context_data(self, **kwargs):
 
        context = super().get_context_data(**kwargs)
 
        # context['key'] = 'value'
 
        context.update(self.extra_context)
 
        return context
 
                                    
 

 
def listing(request, *args, **kwargs):
 
    news_queryset = PressRelease.objects.all()
 

	
 
#    if (not kwargs.has_key('allow_future')) or not kwargs['allow_future']:
 
    news_queryset = news_queryset.filter(
 
        **{'%s__lte' % kwargs['date_field']: datetime.now()}
 
    )
 

	
 
    date_list = news_queryset.dates(kwargs['date_field'], 'year')
 

	
 
    paginate_by = kwargs.get('paginate_by', 6)  # Show 6 news items per page, by default
 
    paginator = Paginator(news_queryset, paginate_by)
 

	
 
    page = request.GET.get('page')
 
    try:
 
        news = paginator.page(page)
 
    except PageNotAnInteger:
 
        # If page is not an integer, deliver first page.
 
        news = paginator.page(1)
 
    except EmptyPage:
 
        # If page is out of range (e.g. 9999), deliver last page of results.
 
        news = paginator.page(paginator.num_pages)
 

	
 
    return render(request, 'news/pressrelease_list.html', {"news": news, "date_list" : date_list})
 

	
 
class NewsYearArchiveView(YearArchiveView):
 
    # queryset = Article.objects.all()
 
    # date_field = "pub_date"
 
    make_object_list = True
 
    allow_future = True
 

	
 
# def archive_year(request, **kwargs):
 
#     callable = NewsYearArchiveView.as_view(**kwargs)
 
#     return callable(request)
 

	
 
class NewsMonthArchiveView(MonthArchiveView):
 
    allow_future = True
 

	
 
# def archive_month(request, **kwargs):
 
#     # return HttpResponse("archive_month")
 
#     callable = NewsMonthArchiveView.as_view(**kwargs)
 
#     return callable(request)
 

	
 
class NewsDayArchiveView(DayArchiveView):
 
    allow_future = True
 

	
 
# def archive_day(request, **kwargs):
 
#     # return HttpResponse("archive_day")
 
#     callable = NewsDayArchiveView.as_view(**kwargs)
 
#     return callable(request)
 

	
 
class NewsDateDetailView(DateDetailView):
 
    # extra_context = {}
 
    allow_future = True
 
    # slug_url_kwarg = 'slug'
 

	
 
    # def get_context_data(self, **kwargs):
 
    #     context = super(NewsDateDetailView, self).get_context_data(**kwargs)
 
    #     context.update(self.extra_context)
 
    #     return context
 

	
 
# def object_detail(request, **kwargs):
 
#     # extra_context = {}
 
#     # extra_context['slug'] = kwargs['slug']
 
#     # del kwargs['slug']
 
#     # kwargs['extra_context'] = extra_context
 
#     # return HttpResponse("object_detail: " + str(kwargs))
 
#     # slug = kwargs['slug']
 
#     # del kwargs['slug']
 
#     callable = NewsDateDetailView.as_view(**kwargs)
 
#     return callable(request)
 

	
conservancy/podjango/admin.py
Show inline comments
 
#  Copyright (C) 2008       Bradley M. Kuhn <bkuhn@ebb.org>
 
#  Copyright (C) 2006, 2007 Software Freedom Law Center, Inc.
 
#
 
# This software's license gives you freedom; you can copy, convey,
 
# propogate, redistribute and/or modify this program under the terms of
 
# the GNU Affero General Public License (AGPL) as published by the Free
 
# Software Foundation (FSF), either version 3 of the License, or (at your
 
# option) any later version of the AGPL published by the FSF.
 
#
 
# This program is distributed in the hope that it will be useful, but
 
# WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero
 
# General Public License for more details.
 
#
 
# You should have received a copy of the GNU Affero General Public License
 
# along with this program in a file in the toplevel directory called
 
# "AGPLv3".  If not, see <http://www.gnu.org/licenses/>.
 
#
 
from django.contrib import admin
 

	
 
from .models import Cast, CastTag, Podcast
 

	
 

	
 
@admin.register(Podcast)
 
class PodcastAdmin(admin.ModelAdmin):
 
    prepopulated_fields = {'slug': ('title',)}
 

	
 

	
 
@admin.register(CastTag)
 
class CastTagAdmin(admin.ModelAdmin):
 
    prepopulated_fields = {'slug': ('label',)}
 

	
 

	
 
@admin.register(Cast)
 
class CastAdmin(admin.ModelAdmin):
 
    list_display = ('pub_date', 'title')
 
    list_filter = ['pub_date', 'podcast']
 
    date_hierarchy = 'pub_date'
 
    search_fields = ['title', 'summary', 'body']
 
    prepopulated_fields = {'slug': ("title",)}
 
    filter_horizontal = ('tags',)
 

	
 

	
conservancy/staff/admin.py
Show inline comments
 
from django.contrib import admin
 

	
 
from .models import Person
 

	
 

	
 
@admin.register(Person)
 
class PersonAdmin(admin.ModelAdmin):
 
    list_display = ("username", "formal_name", "casual_name",
 
                    "currently_employed")
 
    list_filter = ["currently_employed"]
 

	
conservancy/static/css/tachyons.css
Show inline comments
...
 
@@ -61,257 +61,257 @@ pre { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ }
 
a { background-color: transparent; }
 
/**
 
 * 1. Remove the bottom border in Chrome 57-
 
 * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
 
 */
 
abbr[title] { border-bottom: none; /* 1 */ text-decoration: underline; /* 2 */ -webkit-text-decoration: underline dotted; text-decoration: underline dotted; /* 2 */ }
 
/**
 
 * Add the correct font weight in Chrome, Edge, and Safari.
 
 */
 
b, strong { font-weight: bolder; }
 
/**
 
 * 1. Correct the inheritance and scaling of font size in all browsers.
 
 * 2. Correct the odd `em` font sizing in all browsers.
 
 */
 
code, kbd, samp { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ }
 
/**
 
 * Add the correct font size in all browsers.
 
 */
 
small { font-size: 80%; }
 
/**
 
 * Prevent `sub` and `sup` elements from affecting the line height in
 
 * all browsers.
 
 */
 
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
 
sub { bottom: -0.25em; }
 
sup { top: -0.5em; }
 
/* Embedded content
 
   ========================================================================== */
 
/**
 
 * Remove the border on images inside links in IE 10.
 
 */
 
img { border-style: none; }
 
/* Forms
 
   ========================================================================== */
 
/**
 
 * 1. Change the font styles in all browsers.
 
 * 2. Remove the margin in Firefox and Safari.
 
 */
 
button, input, optgroup, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 1 */ line-height: 1.15; /* 1 */ margin: 0; /* 2 */ }
 
/**
 
 * Show the overflow in IE.
 
 * 1. Show the overflow in Edge.
 
 */
 
button, input {/* 1 */ overflow: visible; }
 
/**
 
 * Remove the inheritance of text transform in Edge, Firefox, and IE.
 
 * 1. Remove the inheritance of text transform in Firefox.
 
 */
 
button, select {/* 1 */ text-transform: none; }
 
/**
 
 * Correct the inability to style clickable types in iOS and Safari.
 
 */
 
button, [type="button"], [type="reset"], [type="submit"] { -webkit-appearance: button; }
 
/**
 
 * Remove the inner border and padding in Firefox.
 
 */
 
button::-moz-focus-inner, [type="button"]::-moz-focus-inner,
 
[type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { border-style: none; padding: 0; }
 
/**
 
 * Restore the focus styles unset by the previous rule.
 
 */
 
button:-moz-focusring, [type="button"]:-moz-focusring,
 
[type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring { outline: 1px dotted ButtonText; }
 
/**
 
 * Correct the padding in Firefox.
 
 */
 
fieldset { padding: .35em .75em .625em; }
 
/**
 
 * 1. Correct the text wrapping in Edge and IE.
 
 * 2. Correct the color inheritance from `fieldset` elements in IE.
 
 * 3. Remove the padding so developers are not caught out when they zero out
 
 *    `fieldset` elements in all browsers.
 
 */
 
legend { box-sizing: border-box; /* 1 */ color: inherit; /* 2 */ display: table; /* 1 */ max-width: 100%; /* 1 */ padding: 0; /* 3 */ white-space: normal; /* 1 */ }
 
/**
 
 * Add the correct vertical alignment in Chrome, Firefox, and Opera.
 
 */
 
progress { vertical-align: baseline; }
 
/**
 
 * Remove the default vertical scrollbar in IE 10+.
 
 */
 
textarea { overflow: auto; }
 
/**
 
 * 1. Add the correct box sizing in IE 10.
 
 * 2. Remove the padding in IE 10.
 
 */
 
[type="checkbox"], [type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ }
 
/**
 
 * Correct the cursor style of increment and decrement buttons in Chrome.
 
 */
 
[type="number"]::-webkit-inner-spin-button,
 
[type="number"]::-webkit-outer-spin-button { height: auto; }
 
/**
 
 * 1. Correct the odd appearance in Chrome and Safari.
 
 * 2. Correct the outline style in Safari.
 
 */
 
[type="search"] { -webkit-appearance: textfield; /* 1 */ outline-offset: -2px; /* 2 */ }
 
/**
 
 * Remove the inner padding in Chrome and Safari on macOS.
 
 */
 
[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
 
/**
 
 * 1. Correct the inability to style clickable types in iOS and Safari.
 
 * 2. Change font properties to `inherit` in Safari.
 
 */
 
::-webkit-file-upload-button { -webkit-appearance: button; /* 1 */ font: inherit; /* 2 */ }
 
/* Interactive
 
   ========================================================================== */
 
/*
 
 * Add the correct display in Edge, IE 10+, and Firefox.
 
 */
 
details { display: block; }
 
/*
 
 * Add the correct display in all browsers.
 
 */
 
summary { display: list-item; }
 
/* Misc
 
   ========================================================================== */
 
/**
 
 * Add the correct display in IE 10+.
 
 */
 
template { display: none; }
 
/**
 
 * Add the correct display in IE 10.
 
 */
 
[hidden] { display: none; }
 
/* Modules */
 
/*
 
 
 

 
  BOX SIZING
 

	
 
*/
 
html, body, div, article, aside, section, main, nav, footer, header, form,
 
fieldset, legend, pre, code, a, h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt,
 
dd, blockquote, figcaption, figure, textarea, table, td, th, tr,
 
input[type="email"], input[type="number"], input[type="password"],
 
input[type="tel"], input[type="text"], input[type="url"], .border-box { box-sizing: border-box; }
 
/*
 

	
 
   ASPECT RATIOS
 

	
 
*/
 
/* This is for fluid media that is embedded from third party sites like youtube, vimeo etc.
 
 * Wrap the outer element in aspect-ratio and then extend it with the desired ratio i.e
 
 * Make sure there are no height and width attributes on the embedded media.
 
 * Adapted from: https://github.com/suitcss/components-flex-embed
 
 *
 
 * Example:
 
 *
 
 * <div class="aspect-ratio aspect-ratio--16x9">
 
 *  <iframe class="aspect-ratio--object"></iframe>
 
 * </div>
 
 *
 
 * */
 
.aspect-ratio { height: 0; position: relative; }
 
.aspect-ratio--16x9 { padding-bottom: 56.25%; }
 
.aspect-ratio--9x16 { padding-bottom: 177.77%; }
 
.aspect-ratio--4x3 { padding-bottom: 75%; }
 
.aspect-ratio--3x4 { padding-bottom: 133.33%; }
 
.aspect-ratio--6x4 { padding-bottom: 66.6%; }
 
.aspect-ratio--4x6 { padding-bottom: 150%; }
 
.aspect-ratio--8x5 { padding-bottom: 62.5%; }
 
.aspect-ratio--5x8 { padding-bottom: 160%; }
 
.aspect-ratio--7x5 { padding-bottom: 71.42%; }
 
.aspect-ratio--5x7 { padding-bottom: 140%; }
 
.aspect-ratio--1x1 { padding-bottom: 100%; }
 
.aspect-ratio--object { position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%; z-index: 100; }
 
/*
 

	
 
   IMAGES
 
   Docs: http://tachyons.io/docs/elements/images/
 

	
 
*/
 
/* Responsive images! */
 
img { max-width: 100%; }
 
/*
 

	
 
   BACKGROUND SIZE
 
   Docs: http://tachyons.io/docs/themes/background-size/
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
/*
 
  Often used in combination with background image set as an inline style
 
  on an html element.
 
*/
 
.cover { background-size: cover !important; }
 
.contain { background-size: contain !important; }
 
/*
 

	
 
    BACKGROUND POSITION
 

	
 
    Base:
 
    bg = background
 

	
 
    Modifiers:
 
    -center = center center
 
    -top = top center
 
    -right = center right
 
    -bottom = bottom center
 
    -left = center left
 

	
 
    Media Query Extensions:
 
      -ns = not-small
 
      -m  = medium
 
      -l  = large
 

	
 
 */
 
.bg-center { background-repeat: no-repeat; background-position: center center; }
 
.bg-top { background-repeat: no-repeat; background-position: top center; }
 
.bg-right { background-repeat: no-repeat; background-position: center right; }
 
.bg-bottom { background-repeat: no-repeat; background-position: bottom center; }
 
.bg-left { background-repeat: no-repeat; background-position: center left; }
 
/*
 

	
 
   OUTLINES
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
.outline { outline: 1px solid; }
 
.outline-transparent { outline: 1px solid transparent; }
 
.outline-0 { outline: 0; }
 
/*
 

	
 
    BORDERS
 
    Docs: http://tachyons.io/docs/themes/borders/
 

	
 
    Base:
 
      b = border
 

	
 
    Modifiers:
 
      a = all
 
      t = top
 
      r = right
 
      b = bottom
 
      l = left
 
      n = none
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
.ba { border-style: solid; border-width: 1px; }
 
.bt { border-top-style: solid; border-top-width: 1px; }
 
.br { border-right-style: solid; border-right-width: 1px; }
 
.bb { border-bottom-style: solid; border-bottom-width: 1px; }
 
.bl { border-left-style: solid; border-left-width: 1px; }
...
 
@@ -660,257 +660,257 @@ img { max-width: 100%; }
 
.justify-center { justify-content: center; }
 
.justify-between { justify-content: space-between; }
 
.justify-around { justify-content: space-around; }
 
.content-start { align-content: flex-start; }
 
.content-end { align-content: flex-end; }
 
.content-center { align-content: center; }
 
.content-between { align-content: space-between; }
 
.content-around { align-content: space-around; }
 
.content-stretch { align-content: stretch; }
 
.order-0 { order: 0; }
 
.order-1 { order: 1; }
 
.order-2 { order: 2; }
 
.order-3 { order: 3; }
 
.order-4 { order: 4; }
 
.order-5 { order: 5; }
 
.order-6 { order: 6; }
 
.order-7 { order: 7; }
 
.order-8 { order: 8; }
 
.order-last { order: 99999; }
 
.flex-grow-0 { flex-grow: 0; }
 
.flex-grow-1 { flex-grow: 1; }
 
.flex-shrink-0 { flex-shrink: 0; }
 
.flex-shrink-1 { flex-shrink: 1; }
 
/*
 

	
 
   FLOATS
 
   http://tachyons.io/docs/layout/floats/
 

	
 
   1. Floated elements are automatically rendered as block level elements.
 
      Setting floats to display inline will fix the double margin bug in
 
      ie6. You know... just in case.
 

	
 
   2. Don't forget to clearfix your floats with .cf
 

	
 
   Base:
 
     f = float
 

	
 
   Modifiers:
 
     l = left
 
     r = right
 
     n = none
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
.fl { float: left; _display: inline; }
 
.fr { float: right; _display: inline; }
 
.fn { float: none; }
 
/*
 

	
 
   FONT FAMILY GROUPS
 
   Docs: http://tachyons.io/docs/typography/font-family/
 

	
 
*/
 
.sans-serif { font-family: -apple-system, BlinkMacSystemFont, 'avenir next', avenir, 'helvetica neue', helvetica, ubuntu, roboto, noto, 'segoe ui', arial, sans-serif; }
 
.serif { font-family: georgia, times, serif; }
 
.system-sans-serif { font-family: sans-serif; }
 
.system-serif { font-family: serif; }
 
/* Monospaced Typefaces (for code) */
 
/* From http://cssfontstack.com */
 
code, .code { font-family: Consolas, monaco, monospace; }
 
.courier { font-family: 'Courier Next', courier, monospace; }
 
/* Sans-Serif Typefaces */
 
.helvetica { font-family: 'helvetica neue', helvetica, sans-serif; }
 
.avenir { font-family: 'avenir next', avenir, sans-serif; }
 
/* Serif Typefaces */
 
.athelas { font-family: athelas, georgia, serif; }
 
.georgia { font-family: georgia, serif; }
 
.times { font-family: times, serif; }
 
.bodoni { font-family: "Bodoni MT", serif; }
 
.calisto { font-family: "Calisto MT", serif; }
 
.garamond { font-family: garamond, serif; }
 
.baskerville { font-family: baskerville, serif; }
 
/*
 

	
 
   FONT STYLE
 
   Docs: http://tachyons.io/docs/typography/font-style/
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
.i { font-style: italic; }
 
.fs-normal { font-style: normal; }
 
/*
 

	
 
   FONT WEIGHT
 
   Docs: http://tachyons.io/docs/typography/font-weight/
 

	
 
   Base
 
     fw = font-weight
 

	
 
   Modifiers:
 
     1 = literal value 100
 
     2 = literal value 200
 
     3 = literal value 300
 
     4 = literal value 400
 
     5 = literal value 500
 
     6 = literal value 600
 
     7 = literal value 700
 
     8 = literal value 800
 
     9 = literal value 900
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
.normal { font-weight: normal; }
 
.b { font-weight: bold; }
 
.fw1 { font-weight: 100; }
 
.fw2 { font-weight: 200; }
 
.fw3 { font-weight: 300; }
 
.fw4 { font-weight: 400; }
 
.fw5 { font-weight: 500; }
 
.fw6 { font-weight: 600; }
 
.fw7 { font-weight: 700; }
 
.fw8 { font-weight: 800; }
 
.fw9 { font-weight: 900; }
 
/*
 

	
 
   FORMS
 
   
 

 
*/
 
.input-reset { -webkit-appearance: none; -moz-appearance: none; }
 
.button-reset::-moz-focus-inner, .input-reset::-moz-focus-inner { border: 0; padding: 0; }
 
/*
 

	
 
   HEIGHTS
 
   Docs: http://tachyons.io/docs/layout/heights/
 

	
 
   Base:
 
     h = height
 
     min-h = min-height
 
     min-vh = min-height vertical screen height
 
     vh = vertical screen height
 

	
 
   Modifiers
 
     1 = 1st step in height scale
 
     2 = 2nd step in height scale
 
     3 = 3rd step in height scale
 
     4 = 4th step in height scale
 
     5 = 5th step in height scale
 

	
 
     -25   = literal value 25%
 
     -50   = literal value 50%
 
     -75   = literal value 75%
 
     -100  = literal value 100%
 

	
 
     -auto = string value of auto
 
     -inherit = string value of inherit
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
/* Height Scale */
 
.h1 { height: 1rem; }
 
.h2 { height: 2rem; }
 
.h3 { height: 4rem; }
 
.h4 { height: 8rem; }
 
.h5 { height: 16rem; }
 
/* Height Percentages - Based off of height of parent */
 
.h-25 { height: 25%; }
 
.h-50 { height: 50%; }
 
.h-75 { height: 75%; }
 
.h-100 { height: 100%; }
 
.min-h-100 { min-height: 100%; }
 
/* Screen Height Percentage */
 
.vh-25 { height: 25vh; }
 
.vh-50 { height: 50vh; }
 
.vh-75 { height: 75vh; }
 
.vh-100 { height: 100vh; }
 
.min-vh-100 { min-height: 100vh; }
 
/* String Properties */
 
.h-auto { height: auto; }
 
.h-inherit { height: inherit; }
 
/*
 

	
 
   LETTER SPACING
 
   Docs: http://tachyons.io/docs/typography/tracking/
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
.tracked { letter-spacing: .1em; }
 
.tracked-tight { letter-spacing: -.05em; }
 
.tracked-mega { letter-spacing: .25em; }
 
/*
 

	
 
   LINE HEIGHT / LEADING
 
   Docs: http://tachyons.io/docs/typography/line-height
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
.lh-solid { line-height: 1; }
 
.lh-title { line-height: 1.25; }
 
.lh-copy { line-height: 1.5; }
 
/*
 

	
 
   LINKS
 
   Docs: http://tachyons.io/docs/elements/links/
 

	
 
*/
 
.link { text-decoration: none; transition: color .15s ease-in; }
 
.link:link, .link:visited { transition: color .15s ease-in; }
 
.link:hover { transition: color .15s ease-in; }
 
.link:active { transition: color .15s ease-in; }
 
.link:focus { transition: color .15s ease-in; outline: 1px dotted currentColor; }
 
/*
 

	
 
   LISTS
 
   http://tachyons.io/docs/elements/lists/
 

	
 
*/
 
.list { list-style-type: none; }
 
/*
 

	
 
   MAX WIDTHS
 
   Docs: http://tachyons.io/docs/layout/max-widths/
 

	
 
   Base:
 
     mw = max-width
 

	
 
   Modifiers
 
     1 = 1st step in width scale
 
     2 = 2nd step in width scale
 
     3 = 3rd step in width scale
 
     4 = 4th step in width scale
 
     5 = 5th step in width scale
 
     6 = 6st step in width scale
 
     7 = 7nd step in width scale
 
     8 = 8rd step in width scale
 
     9 = 9th step in width scale
 

	
 
     -100 = literal value 100%
 

	
 
     -none  = string value none
 

	
 

	
 
   Media Query Extensions:
 
     -ns = not-small
...
 
@@ -945,382 +945,382 @@ code, .code { font-family: Consolas, monaco, monospace; }
 
     2 = 2nd step in width scale
 
     3 = 3rd step in width scale
 
     4 = 4th step in width scale
 
     5 = 5th step in width scale
 

	
 
     -10  = literal value 10%
 
     -20  = literal value 20%
 
     -25  = literal value 25%
 
     -30  = literal value 30%
 
     -33  = literal value 33%
 
     -34  = literal value 34%
 
     -40  = literal value 40%
 
     -50  = literal value 50%
 
     -60  = literal value 60%
 
     -70  = literal value 70%
 
     -75  = literal value 75%
 
     -80  = literal value 80%
 
     -90  = literal value 90%
 
     -100 = literal value 100%
 

	
 
     -third      = 100% / 3 (Not supported in opera mini or IE8)
 
     -two-thirds = 100% / 1.5 (Not supported in opera mini or IE8)
 
     -auto       = string value auto
 

	
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
/* Width Scale */
 
.w1 { width: 1rem; }
 
.w2 { width: 2rem; }
 
.w3 { width: 4rem; }
 
.w4 { width: 8rem; }
 
.w5 { width: 16rem; }
 
.w-10 { width: 10%; }
 
.w-20 { width: 20%; }
 
.w-25 { width: 25%; }
 
.w-30 { width: 30%; }
 
.w-33 { width: 33%; }
 
.w-34 { width: 34%; }
 
.w-40 { width: 40%; }
 
.w-50 { width: 50%; }
 
.w-60 { width: 60%; }
 
.w-70 { width: 70%; }
 
.w-75 { width: 75%; }
 
.w-80 { width: 80%; }
 
.w-90 { width: 90%; }
 
.w-100 { width: 100%; }
 
.w-third { width: 33.33333%; }
 
.w-two-thirds { width: 66.66667%; }
 
.w-auto { width: auto; }
 
/*
 

	
 
    OVERFLOW
 

	
 
    Media Query Extensions:
 
      -ns = not-small
 
      -m  = medium
 
      -l  = large
 

	
 
 */
 
.overflow-visible { overflow: visible; }
 
.overflow-hidden { overflow: hidden; }
 
.overflow-scroll { overflow: scroll; }
 
.overflow-auto { overflow: auto; }
 
.overflow-x-visible { overflow-x: visible; }
 
.overflow-x-hidden { overflow-x: hidden; }
 
.overflow-x-scroll { overflow-x: scroll; }
 
.overflow-x-auto { overflow-x: auto; }
 
.overflow-y-visible { overflow-y: visible; }
 
.overflow-y-hidden { overflow-y: hidden; }
 
.overflow-y-scroll { overflow-y: scroll; }
 
.overflow-y-auto { overflow-y: auto; }
 
/*
 

	
 
   POSITIONING
 
   Docs: http://tachyons.io/docs/layout/position/
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
.static { position: static; }
 
.relative { position: relative; }
 
.absolute { position: absolute; }
 
.fixed { position: fixed; }
 
/*
 

	
 
    OPACITY
 
    Docs: http://tachyons.io/docs/themes/opacity/
 

	
 
*/
 
.o-100 { opacity: 1; }
 
.o-90 { opacity: .9; }
 
.o-80 { opacity: .8; }
 
.o-70 { opacity: .7; }
 
.o-60 { opacity: .6; }
 
.o-50 { opacity: .5; }
 
.o-40 { opacity: .4; }
 
.o-30 { opacity: .3; }
 
.o-20 { opacity: .2; }
 
.o-10 { opacity: .1; }
 
.o-05 { opacity: .05; }
 
.o-025 { opacity: .025; }
 
.o-0 { opacity: 0; }
 
/*
 

	
 
   ROTATIONS
 

	
 
*/
 
.rotate-45 { -webkit-transform: rotate( 45deg ); transform: rotate( 45deg ); }
 
.rotate-90 { -webkit-transform: rotate( 90deg ); transform: rotate( 90deg ); }
 
.rotate-135 { -webkit-transform: rotate( 135deg ); transform: rotate( 135deg ); }
 
.rotate-180 { -webkit-transform: rotate( 180deg ); transform: rotate( 180deg ); }
 
.rotate-225 { -webkit-transform: rotate( 225deg ); transform: rotate( 225deg ); }
 
.rotate-270 { -webkit-transform: rotate( 270deg ); transform: rotate( 270deg ); }
 
.rotate-315 { -webkit-transform: rotate( 315deg ); transform: rotate( 315deg ); }
 
/*
 

	
 
   SKINS
 
   Docs: http://tachyons.io/docs/themes/skins/
 

	
 
   Classes for setting foreground and background colors on elements.
 
   If you haven't declared a border color, but set border on an element, it will 
 
   be set to the current text color. 
 
   If you haven't declared a border color, but set border on an element, it will
 
   be set to the current text color.
 

	
 
*/
 
/* Text colors */
 
.black-90 { color: rgba( 0, 0, 0, .9 ); }
 
.black-80 { color: rgba( 0, 0, 0, .8 ); }
 
.black-70 { color: rgba( 0, 0, 0, .7 ); }
 
.black-60 { color: rgba( 0, 0, 0, .6 ); }
 
.black-50 { color: rgba( 0, 0, 0, .5 ); }
 
.black-40 { color: rgba( 0, 0, 0, .4 ); }
 
.black-30 { color: rgba( 0, 0, 0, .3 ); }
 
.black-20 { color: rgba( 0, 0, 0, .2 ); }
 
.black-10 { color: rgba( 0, 0, 0, .1 ); }
 
.black-05 { color: rgba( 0, 0, 0, .05 ); }
 
.white-90 { color: rgba( 255, 255, 255, .9 ); }
 
.white-80 { color: rgba( 255, 255, 255, .8 ); }
 
.white-70 { color: rgba( 255, 255, 255, .7 ); }
 
.white-60 { color: rgba( 255, 255, 255, .6 ); }
 
.white-50 { color: rgba( 255, 255, 255, .5 ); }
 
.white-40 { color: rgba( 255, 255, 255, .4 ); }
 
.white-30 { color: rgba( 255, 255, 255, .3 ); }
 
.white-20 { color: rgba( 255, 255, 255, .2 ); }
 
.white-10 { color: rgba( 255, 255, 255, .1 ); }
 
.black { color: #000; }
 
.near-black { color: #111; }
 
.dark-gray { color: #333; }
 
.mid-gray { color: #555; }
 
.gray { color: #777; }
 
.silver { color: #999; }
 
.light-silver { color: #aaa; }
 
.moon-gray { color: #ccc; }
 
.light-gray { color: #eee; }
 
.near-white { color: #f4f4f4; }
 
.white { color: #fff; }
 
.dark-red { color: #e7040f; }
 
.red { color: #ff4136; }
 
.light-red { color: #ff725c; }
 
.orange { color: #ff6300; }
 
.gold { color: #ffb700; }
 
.yellow { color: #ffd700; }
 
.light-yellow { color: #fbf1a9; }
 
.purple { color: #5e2ca5; }
 
.light-purple { color: #a463f2; }
 
.dark-pink { color: #d5008f; }
 
.hot-pink { color: #ff41b4; }
 
.pink { color: #ff80cc; }
 
.light-pink { color: #ffa3d7; }
 
.dark-green { color: #137752; }
 
.green { color: #19a974; }
 
.light-green { color: #9eebcf; }
 
.navy { color: #001b44; }
 
.dark-blue { color: #00449e; }
 
.blue { color: #357edd; }
 
.light-blue { color: #96ccff; }
 
.lightest-blue { color: #cdecff; }
 
.washed-blue { color: #f6fffe; }
 
.washed-green { color: #e8fdf5; }
 
.washed-yellow { color: #fffceb; }
 
.washed-red { color: #ffdfdf; }
 
.color-inherit { color: inherit; }
 
/* Background colors */
 
.bg-black-90 { background-color: rgba( 0, 0, 0, .9 ); }
 
.bg-black-80 { background-color: rgba( 0, 0, 0, .8 ); }
 
.bg-black-70 { background-color: rgba( 0, 0, 0, .7 ); }
 
.bg-black-60 { background-color: rgba( 0, 0, 0, .6 ); }
 
.bg-black-50 { background-color: rgba( 0, 0, 0, .5 ); }
 
.bg-black-40 { background-color: rgba( 0, 0, 0, .4 ); }
 
.bg-black-30 { background-color: rgba( 0, 0, 0, .3 ); }
 
.bg-black-20 { background-color: rgba( 0, 0, 0, .2 ); }
 
.bg-black-10 { background-color: rgba( 0, 0, 0, .1 ); }
 
.bg-black-05 { background-color: rgba( 0, 0, 0, .05 ); }
 
.bg-white-90 { background-color: rgba( 255, 255, 255, .9 ); }
 
.bg-white-80 { background-color: rgba( 255, 255, 255, .8 ); }
 
.bg-white-70 { background-color: rgba( 255, 255, 255, .7 ); }
 
.bg-white-60 { background-color: rgba( 255, 255, 255, .6 ); }
 
.bg-white-50 { background-color: rgba( 255, 255, 255, .5 ); }
 
.bg-white-40 { background-color: rgba( 255, 255, 255, .4 ); }
 
.bg-white-30 { background-color: rgba( 255, 255, 255, .3 ); }
 
.bg-white-20 { background-color: rgba( 255, 255, 255, .2 ); }
 
.bg-white-10 { background-color: rgba( 255, 255, 255, .1 ); }
 
.bg-black { background-color: #000; }
 
.bg-near-black { background-color: #111; }
 
.bg-dark-gray { background-color: #333; }
 
.bg-mid-gray { background-color: #555; }
 
.bg-gray { background-color: #777; }
 
.bg-silver { background-color: #999; }
 
.bg-light-silver { background-color: #aaa; }
 
.bg-moon-gray { background-color: #ccc; }
 
.bg-light-gray { background-color: #eee; }
 
.bg-near-white { background-color: #f4f4f4; }
 
.bg-white { background-color: #fff; }
 
.bg-transparent { background-color: transparent; }
 
.bg-dark-red { background-color: #e7040f; }
 
.bg-red { background-color: #ff4136; }
 
.bg-light-red { background-color: #ff725c; }
 
.bg-orange { background-color: #ff6300; }
 
.bg-gold { background-color: #ffb700; }
 
.bg-yellow { background-color: #ffd700; }
 
.bg-light-yellow { background-color: #fbf1a9; }
 
.bg-purple { background-color: #5e2ca5; }
 
.bg-light-purple { background-color: #a463f2; }
 
.bg-dark-pink { background-color: #d5008f; }
 
.bg-hot-pink { background-color: #ff41b4; }
 
.bg-pink { background-color: #ff80cc; }
 
.bg-light-pink { background-color: #ffa3d7; }
 
.bg-dark-green { background-color: #137752; }
 
.bg-green { background-color: #19a974; }
 
.bg-light-green { background-color: #9eebcf; }
 
.bg-navy { background-color: #001b44; }
 
.bg-dark-blue { background-color: #00449e; }
 
.bg-blue { background-color: #357edd; }
 
.bg-light-blue { background-color: #96ccff; }
 
.bg-lightest-blue { background-color: #cdecff; }
 
.bg-washed-blue { background-color: #f6fffe; }
 
.bg-washed-green { background-color: #e8fdf5; }
 
.bg-washed-yellow { background-color: #fffceb; }
 
.bg-washed-red { background-color: #ffdfdf; }
 
.bg-inherit { background-color: inherit; }
 
/* 
 
  
 
/*
 

	
 
   SKINS:PSEUDO
 

	
 
   Customize the color of an element when
 
   it is focused or hovered over.
 
 
 

 
 */
 
.hover-black:hover { color: #000; }
 
.hover-black:focus { color: #000; }
 
.hover-near-black:hover { color: #111; }
 
.hover-near-black:focus { color: #111; }
 
.hover-dark-gray:hover { color: #333; }
 
.hover-dark-gray:focus { color: #333; }
 
.hover-mid-gray:hover { color: #555; }
 
.hover-mid-gray:focus { color: #555; }
 
.hover-gray:hover { color: #777; }
 
.hover-gray:focus { color: #777; }
 
.hover-silver:hover { color: #999; }
 
.hover-silver:focus { color: #999; }
 
.hover-light-silver:hover { color: #aaa; }
 
.hover-light-silver:focus { color: #aaa; }
 
.hover-moon-gray:hover { color: #ccc; }
 
.hover-moon-gray:focus { color: #ccc; }
 
.hover-light-gray:hover { color: #eee; }
 
.hover-light-gray:focus { color: #eee; }
 
.hover-near-white:hover { color: #f4f4f4; }
 
.hover-near-white:focus { color: #f4f4f4; }
 
.hover-white:hover { color: #fff; }
 
.hover-white:focus { color: #fff; }
 
.hover-black-90:hover { color: rgba( 0, 0, 0, .9 ); }
 
.hover-black-90:focus { color: rgba( 0, 0, 0, .9 ); }
 
.hover-black-80:hover { color: rgba( 0, 0, 0, .8 ); }
 
.hover-black-80:focus { color: rgba( 0, 0, 0, .8 ); }
 
.hover-black-70:hover { color: rgba( 0, 0, 0, .7 ); }
 
.hover-black-70:focus { color: rgba( 0, 0, 0, .7 ); }
 
.hover-black-60:hover { color: rgba( 0, 0, 0, .6 ); }
 
.hover-black-60:focus { color: rgba( 0, 0, 0, .6 ); }
 
.hover-black-50:hover { color: rgba( 0, 0, 0, .5 ); }
 
.hover-black-50:focus { color: rgba( 0, 0, 0, .5 ); }
 
.hover-black-40:hover { color: rgba( 0, 0, 0, .4 ); }
 
.hover-black-40:focus { color: rgba( 0, 0, 0, .4 ); }
 
.hover-black-30:hover { color: rgba( 0, 0, 0, .3 ); }
 
.hover-black-30:focus { color: rgba( 0, 0, 0, .3 ); }
 
.hover-black-20:hover { color: rgba( 0, 0, 0, .2 ); }
 
.hover-black-20:focus { color: rgba( 0, 0, 0, .2 ); }
 
.hover-black-10:hover { color: rgba( 0, 0, 0, .1 ); }
 
.hover-black-10:focus { color: rgba( 0, 0, 0, .1 ); }
 
.hover-white-90:hover { color: rgba( 255, 255, 255, .9 ); }
 
.hover-white-90:focus { color: rgba( 255, 255, 255, .9 ); }
 
.hover-white-80:hover { color: rgba( 255, 255, 255, .8 ); }
 
.hover-white-80:focus { color: rgba( 255, 255, 255, .8 ); }
 
.hover-white-70:hover { color: rgba( 255, 255, 255, .7 ); }
 
.hover-white-70:focus { color: rgba( 255, 255, 255, .7 ); }
 
.hover-white-60:hover { color: rgba( 255, 255, 255, .6 ); }
 
.hover-white-60:focus { color: rgba( 255, 255, 255, .6 ); }
 
.hover-white-50:hover { color: rgba( 255, 255, 255, .5 ); }
 
.hover-white-50:focus { color: rgba( 255, 255, 255, .5 ); }
 
.hover-white-40:hover { color: rgba( 255, 255, 255, .4 ); }
 
.hover-white-40:focus { color: rgba( 255, 255, 255, .4 ); }
 
.hover-white-30:hover { color: rgba( 255, 255, 255, .3 ); }
 
.hover-white-30:focus { color: rgba( 255, 255, 255, .3 ); }
 
.hover-white-20:hover { color: rgba( 255, 255, 255, .2 ); }
 
.hover-white-20:focus { color: rgba( 255, 255, 255, .2 ); }
 
.hover-white-10:hover { color: rgba( 255, 255, 255, .1 ); }
 
.hover-white-10:focus { color: rgba( 255, 255, 255, .1 ); }
 
.hover-inherit:hover, .hover-inherit:focus { color: inherit; }
 
.hover-bg-black:hover { background-color: #000; }
 
.hover-bg-black:focus { background-color: #000; }
 
.hover-bg-near-black:hover { background-color: #111; }
 
.hover-bg-near-black:focus { background-color: #111; }
 
.hover-bg-dark-gray:hover { background-color: #333; }
 
.hover-bg-dark-gray:focus { background-color: #333; }
 
.hover-bg-mid-gray:hover { background-color: #555; }
 
.hover-bg-mid-gray:focus { background-color: #555; }
 
.hover-bg-gray:hover { background-color: #777; }
 
.hover-bg-gray:focus { background-color: #777; }
 
.hover-bg-silver:hover { background-color: #999; }
 
.hover-bg-silver:focus { background-color: #999; }
 
.hover-bg-light-silver:hover { background-color: #aaa; }
 
.hover-bg-light-silver:focus { background-color: #aaa; }
 
.hover-bg-moon-gray:hover { background-color: #ccc; }
 
.hover-bg-moon-gray:focus { background-color: #ccc; }
 
.hover-bg-light-gray:hover { background-color: #eee; }
 
.hover-bg-light-gray:focus { background-color: #eee; }
 
.hover-bg-near-white:hover { background-color: #f4f4f4; }
 
.hover-bg-near-white:focus { background-color: #f4f4f4; }
 
.hover-bg-white:hover { background-color: #fff; }
 
.hover-bg-white:focus { background-color: #fff; }
 
.hover-bg-transparent:hover { background-color: transparent; }
 
.hover-bg-transparent:focus { background-color: transparent; }
 
.hover-bg-black-90:hover { background-color: rgba( 0, 0, 0, .9 ); }
 
.hover-bg-black-90:focus { background-color: rgba( 0, 0, 0, .9 ); }
 
.hover-bg-black-80:hover { background-color: rgba( 0, 0, 0, .8 ); }
 
.hover-bg-black-80:focus { background-color: rgba( 0, 0, 0, .8 ); }
 
.hover-bg-black-70:hover { background-color: rgba( 0, 0, 0, .7 ); }
 
.hover-bg-black-70:focus { background-color: rgba( 0, 0, 0, .7 ); }
 
.hover-bg-black-60:hover { background-color: rgba( 0, 0, 0, .6 ); }
 
.hover-bg-black-60:focus { background-color: rgba( 0, 0, 0, .6 ); }
 
.hover-bg-black-50:hover { background-color: rgba( 0, 0, 0, .5 ); }
 
.hover-bg-black-50:focus { background-color: rgba( 0, 0, 0, .5 ); }
 
.hover-bg-black-40:hover { background-color: rgba( 0, 0, 0, .4 ); }
 
.hover-bg-black-40:focus { background-color: rgba( 0, 0, 0, .4 ); }
 
.hover-bg-black-30:hover { background-color: rgba( 0, 0, 0, .3 ); }
 
.hover-bg-black-30:focus { background-color: rgba( 0, 0, 0, .3 ); }
 
.hover-bg-black-20:hover { background-color: rgba( 0, 0, 0, .2 ); }
 
.hover-bg-black-20:focus { background-color: rgba( 0, 0, 0, .2 ); }
 
.hover-bg-black-10:hover { background-color: rgba( 0, 0, 0, .1 ); }
 
.hover-bg-black-10:focus { background-color: rgba( 0, 0, 0, .1 ); }
 
.hover-bg-white-90:hover { background-color: rgba( 255, 255, 255, .9 ); }
 
.hover-bg-white-90:focus { background-color: rgba( 255, 255, 255, .9 ); }
 
.hover-bg-white-80:hover { background-color: rgba( 255, 255, 255, .8 ); }
 
.hover-bg-white-80:focus { background-color: rgba( 255, 255, 255, .8 ); }
 
.hover-bg-white-70:hover { background-color: rgba( 255, 255, 255, .7 ); }
 
.hover-bg-white-70:focus { background-color: rgba( 255, 255, 255, .7 ); }
 
.hover-bg-white-60:hover { background-color: rgba( 255, 255, 255, .6 ); }
 
.hover-bg-white-60:focus { background-color: rgba( 255, 255, 255, .6 ); }
 
.hover-bg-white-50:hover { background-color: rgba( 255, 255, 255, .5 ); }
 
.hover-bg-white-50:focus { background-color: rgba( 255, 255, 255, .5 ); }
 
.hover-bg-white-40:hover { background-color: rgba( 255, 255, 255, .4 ); }
 
.hover-bg-white-40:focus { background-color: rgba( 255, 255, 255, .4 ); }
 
.hover-bg-white-30:hover { background-color: rgba( 255, 255, 255, .3 ); }
 
.hover-bg-white-30:focus { background-color: rgba( 255, 255, 255, .3 ); }
 
.hover-bg-white-20:hover { background-color: rgba( 255, 255, 255, .2 ); }
 
.hover-bg-white-20:focus { background-color: rgba( 255, 255, 255, .2 ); }
 
.hover-bg-white-10:hover { background-color: rgba( 255, 255, 255, .1 ); }
 
.hover-bg-white-10:focus { background-color: rgba( 255, 255, 255, .1 ); }
 
.hover-dark-red:hover { color: #e7040f; }
 
.hover-dark-red:focus { color: #e7040f; }
 
.hover-red:hover { color: #ff4136; }
 
.hover-red:focus { color: #ff4136; }
 
.hover-light-red:hover { color: #ff725c; }
 
.hover-light-red:focus { color: #ff725c; }
 
.hover-orange:hover { color: #ff6300; }
 
.hover-orange:focus { color: #ff6300; }
...
 
@@ -1751,266 +1751,266 @@ code, .code { font-family: Consolas, monaco, monospace; }
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
/* Measure is limited to ~66 characters */
 
.measure { max-width: 30em; }
 
/* Measure is limited to ~80 characters */
 
.measure-wide { max-width: 34em; }
 
/* Measure is limited to ~45 characters */
 
.measure-narrow { max-width: 20em; }
 
/* Book paragraph style - paragraphs are indented with no vertical spacing. */
 
.indent { text-indent: 1em; margin-top: 0; margin-bottom: 0; }
 
.small-caps { font-variant: small-caps; }
 
/* Combine this class with a width to truncate text (or just leave as is to truncate at width of containing element. */
 
.truncate { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
 
/*
 

	
 
   UTILITIES
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
/* Equivalent to .overflow-y-scroll */
 
.overflow-container { overflow-y: scroll; }
 
.center { margin-right: auto; margin-left: auto; }
 
.mr-auto { margin-right: auto; }
 
.ml-auto { margin-left: auto; }
 
/*
 

	
 
   VISIBILITY
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
/*
 
    Text that is hidden but accessible
 
    Ref: http://snook.ca/archives/html_and_css/hiding-content-for-accessibility
 
*/
 
.clip { position: fixed !important; _position: absolute !important; clip: rect( 1px 1px 1px 1px ); /* IE6, IE7 */ clip: rect( 1px, 1px, 1px, 1px ); }
 
/*
 

	
 
   WHITE SPACE
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
.ws-normal { white-space: normal; }
 
.nowrap { white-space: nowrap; }
 
.pre { white-space: pre; }
 
/*
 

	
 
   VERTICAL ALIGN
 

	
 
   Media Query Extensions:
 
     -ns = not-small
 
     -m  = medium
 
     -l  = large
 

	
 
*/
 
.v-base { vertical-align: baseline; }
 
.v-mid { vertical-align: middle; }
 
.v-top { vertical-align: top; }
 
.v-btm { vertical-align: bottom; }
 
/*
 

	
 
  HOVER EFFECTS
 
  Docs: http://tachyons.io/docs/themes/hovers/
 

	
 
    - Dim
 
    - Glow
 
    - Hide Child
 
    - Underline text
 
    - Grow
 
    - Pointer
 
    - Shadow
 

	
 
*/
 
/*
 

	
 
  Dim element on hover by adding the dim class.
 

	
 
*/
 
.dim { opacity: 1; transition: opacity .15s ease-in; }
 
.dim:hover, .dim:focus { opacity: .5; transition: opacity .15s ease-in; }
 
.dim:active { opacity: .8; transition: opacity .15s ease-out; }
 
/*
 

	
 
  Animate opacity to 100% on hover by adding the glow class.
 

	
 
*/
 
.glow { transition: opacity .15s ease-in; }
 
.glow:hover, .glow:focus { opacity: 1; transition: opacity .15s ease-in; }
 
/*
 

	
 
  Hide child & reveal on hover:
 

	
 
  Put the hide-child class on a parent element and any nested element with the
 
  child class will be hidden and displayed on hover or focus.
 

	
 
  <div class="hide-child">
 
    <div class="child"> Hidden until hover or focus </div>
 
    <div class="child"> Hidden until hover or focus </div>
 
    <div class="child"> Hidden until hover or focus </div>
 
    <div class="child"> Hidden until hover or focus </div>
 
  </div>
 
*/
 
.hide-child .child { opacity: 0; transition: opacity .15s ease-in; }
 
.hide-child:hover  .child, .hide-child:focus  .child, .hide-child:active .child { opacity: 1; transition: opacity .15s ease-in; }
 
.underline-hover:hover, .underline-hover:focus { text-decoration: underline; }
 
/* Can combine this with overflow-hidden to make background images grow on hover
 
 * even if you are using background-size: cover */
 
.grow { -moz-osx-font-smoothing: grayscale; -webkit-backface-visibility: hidden; backface-visibility: hidden; -webkit-transform: translateZ( 0 ); transform: translateZ( 0 ); transition: -webkit-transform .25s ease-out; transition: transform .25s ease-out; transition: transform .25s ease-out, -webkit-transform .25s ease-out; }
 
.grow:hover, .grow:focus { -webkit-transform: scale( 1.05 ); transform: scale( 1.05 ); }
 
.grow:active { -webkit-transform: scale( .90 ); transform: scale( .90 ); }
 
.grow-large { -moz-osx-font-smoothing: grayscale; -webkit-backface-visibility: hidden; backface-visibility: hidden; -webkit-transform: translateZ( 0 ); transform: translateZ( 0 ); transition: -webkit-transform .25s ease-in-out; transition: transform .25s ease-in-out; transition: transform .25s ease-in-out, -webkit-transform .25s ease-in-out; }
 
.grow-large:hover, .grow-large:focus { -webkit-transform: scale( 1.2 ); transform: scale( 1.2 ); }
 
.grow-large:active { -webkit-transform: scale( .95 ); transform: scale( .95 ); }
 
/* Add pointer on hover */
 
.pointer:hover { cursor: pointer; }
 
/* 
 
/*
 
   Add shadow on hover.
 

	
 
   Performant box-shadow animation pattern from 
 
   http://tobiasahlin.com/blog/how-to-animate-box-shadow/ 
 
   Performant box-shadow animation pattern from
 
   http://tobiasahlin.com/blog/how-to-animate-box-shadow/
 
*/
 
.shadow-hover { cursor: pointer; position: relative; transition: all .5s cubic-bezier( .165, .84, .44, 1 ); }
 
.shadow-hover::after { content: ''; box-shadow: 0 0 16px 2px rgba( 0, 0, 0, .2 ); border-radius: inherit; opacity: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: -1; transition: opacity .5s cubic-bezier( .165, .84, .44, 1 ); }
 
.shadow-hover:hover::after, .shadow-hover:focus::after { opacity: 1; }
 
/* Combine with classes in skins and skins-pseudo for 
 
/* Combine with classes in skins and skins-pseudo for
 
 * many different transition possibilities. */
 
.bg-animate, .bg-animate:hover, .bg-animate:focus { transition: background-color .15s ease-in-out; }
 
/*
 

	
 
  Z-INDEX
 

	
 
  Base
 
    z = z-index
 

	
 
  Modifiers
 
    -0 = literal value 0
 
    -1 = literal value 1
 
    -2 = literal value 2
 
    -3 = literal value 3
 
    -4 = literal value 4
 
    -5 = literal value 5
 
    -999 = literal value 999
 
    -9999 = literal value 9999
 

	
 
    -max = largest accepted z-index value as integer
 

	
 
    -inherit = string value inherit
 
    -initial = string value initial
 
    -unset = string value unset
 

	
 
  MDN: https://developer.mozilla.org/en/docs/Web/CSS/z-index
 
  Spec: http://www.w3.org/TR/CSS2/zindex.html
 
  Articles:
 
    https://philipwalton.com/articles/what-no-one-told-you-about-z-index/
 

	
 
  Tips on extending:
 
  There might be a time worth using negative z-index values.
 
  Or if you are using tachyons with another project, you might need to
 
  adjust these values to suit your needs.
 

	
 
*/
 
.z-0 { z-index: 0; }
 
.z-1 { z-index: 1; }
 
.z-2 { z-index: 2; }
 
.z-3 { z-index: 3; }
 
.z-4 { z-index: 4; }
 
.z-5 { z-index: 5; }
 
.z-999 { z-index: 999; }
 
.z-9999 { z-index: 9999; }
 
.z-max { z-index: 2147483647; }
 
.z-inherit { z-index: inherit; }
 
.z-initial { z-index: initial; }
 
.z-unset { z-index: unset; }
 
/*
 

	
 
    NESTED
 
    Tachyons module for styling nested elements
 
    that are generated by a cms.
 

	
 
*/
 
.nested-copy-line-height p, .nested-copy-line-height ul,
 
.nested-copy-line-height ol { line-height: 1.5; }
 
.nested-headline-line-height h1, .nested-headline-line-height h2,
 
.nested-headline-line-height h3, .nested-headline-line-height h4,
 
.nested-headline-line-height h5, .nested-headline-line-height h6 { line-height: 1.25; }
 
.nested-list-reset ul, .nested-list-reset ol { padding-left: 0; margin-left: 0; list-style-type: none; }
 
.nested-copy-indent p+p { text-indent: 1em; margin-top: 0; margin-bottom: 0; }
 
.nested-copy-separator p+p { margin-top: 1.5em; }
 
.nested-img img { width: 100%; max-width: 100%; display: block; }
 
.nested-links a { color: #357edd; transition: color .15s ease-in; }
 
.nested-links a:hover { color: #96ccff; transition: color .15s ease-in; }
 
.nested-links a:focus { color: #96ccff; transition: color .15s ease-in; }
 
/*
 

	
 
  STYLES
 

	
 
  Add custom styles here.
 

	
 
*/
 
/* Variables */
 
/* Importing here will allow you to override any variables in the modules */
 
/*
 

	
 
   Tachyons
 
   COLOR VARIABLES
 

	
 
   Grayscale
 
   - Solids
 
   - Transparencies
 
   Colors
 

	
 
*/
 
/*
 

	
 
  CUSTOM MEDIA QUERIES
 

	
 
  Media query values can be changed to fit your own content.
 
  There are no magic bullets when it comes to media query width values.
 
  They should be declared in em units - and they should be set to meet
 
  the needs of your content. You can also add additional media queries,
 
  or remove some of the existing ones.
 

	
 
  These media queries can be referenced like so:
 

	
 
  @media (--breakpoint-not-small) {
 
    .medium-and-larger-specific-style {
 
      background-color: red;
 
    }
 
  }
 

	
 
  @media (--breakpoint-medium) {
 
    .medium-screen-specific-style {
 
      background-color: red;
 
    }
 
  }
 

	
 
  @media (--breakpoint-large) {
 
    .large-and-larger-screen-specific-style {
 
      background-color: red;
 
    }
 
  }
 

	
 
*/
 
/* Media Queries */
 
/* Debugging */
 
/*
 

	
 
  DEBUG CHILDREN
 
  Docs: http://tachyons.io/docs/debug/
 

	
 
  Just add the debug class to any element to see outlines on its
 
  children.
 

	

Changeset was too big and was cut off... Show full diff anyway

0 comments (0 inline, 0 general)