Giter Club home page Giter Club logo

grantmakers.github.io's Introduction

Grantmakers.io - A Community Project

The Grantmakers.io project is spread across two repos:

  1. Foundation Search (this repo)
  2. Foundation Profiles

Goal

Demonstrate how open source technologies + hosted microservices can be leveraged to minimize the cost of hosting and sharing philanthropic data.

Grantmakers.io was built at zero cost and has zero ongoing costs.

Search

The search functionality is fully hosted by Algolia. See /assets/js/search-profiles.js.

Data

All data is pulled directly from machine-readable IRS Form 990PF. These files are hosted publicly by Amazon Web Services and controlled by the IRS.

To build your own database of tax filings direct from the AWS source dataset, I've open sourced the Node + MongoDB scripts used to build Grantmakers.io. If you prefer other platforms (e.g. Python), check out the Nonprofit Open Data Collective or a quick search on Github should yield a few results.

Researchers

If you're struggling with the AWS filings, get in touch. I have MongoDB-friendly BSON files I'm happy to share with the academic, research, and journalism communities. Unzipped, these files are ~10GB in size and contain the AWS index data, filing data, and normalized data. Of course, you'll need to be a little familiar with MongoDB to use the files (see below).

Setting up MongoDB using BSON files

First, set up your MongoDB instance. You have two options:

  1. Install MongoDB on your local machine. MacOS instructions here.
  2. Use a hosted cloud service. Check out MongoDB Atlas (students and faculty might be eligible for free credits).

Next, import the BSON file using the mongorestore command:
mongorestore --gzip --db=yourdbname path/to/BSON/files/

Feature Requests

If you have a question, feature request, find a bug, or just want to say hi, please open an issue on GitHub.

Roadmap

Grantmakers.io is developed in the open and uses Github Issues at its core. To view the prioritized list across all repos, simply download the Zenhub browser extension.

Tools

Cross-browser compatibility provided by BrowserStack
browserstack

Credits

License

Copyright 2016 Chad Kruse

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

grantmakers.github.io's People

Contributors

chadokruse avatar dependabot[bot] avatar grantmakersbot avatar haroenv avatar jlepis avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

grantmakers.github.io's Issues

Profiles: Indexing, SEO, and Pagespeed

Google indexing appears to have stalled out at 16k of the 69k profiles.

  • Submitted to Bing and Yandex (Yandex to improve visibility on DuckDuckGo)
  • Run through Pagespeed to improve initial load time
  • Convert title to h1 tag
  • Add SEO friendly links to profiles (e.g. /profiles/bill-and-melinda-gates-foundation) :: Jekyll Redirect From
  • Add structured data

Algolia - Integrate search into profiles

  • Research most used filters on large foundation online grants databases
  • v0 Design w/ example data
  • Algolia brainstorm + sign-off on branding
    • Add UTM links
    • Switch placeholder partnership logo for crisper version

Open bugs and must-haves:

  • Add a no results template to autocomplete
  • Ensure grants search does not autofocus

Add mechanism to refine/select organization_name(s) on mobile grants-search

Blocked until figure out how to add v3 currentRefinement widget using separate buttons (not combined)

Use case:
User searches for another grantee or subject area (e.g. "City Year" or "climate change")
Wants to quickly see who has donated

Hypothesis:
On mobile, folks don't really want to be doing power searches. They want to simply browse who is funding whom. Perhaps, either:
a) Show a button/link that shows the facet count, then expands into a list (most helpful is the organization list, as visitors could then click through to the profile).
b) Allow them to send themselves the url w/ search parameters (alt: just use platform-native share sheets)

Long term:
Download / share list

If using InstantSearch connector:
Good example

Infrastructure - GitHub Pages now supports HTTPS

Already using Cloudflare to encrypt user <=> Cloudflare connection, but Github Pages now offers an encrypted connection from GP origin.

https://blog.github.com/2018-05-01-github-pages-custom-domains-https/

  • Update A records - remove old two and enter new four (docs)
  • Cloudflare > Crypto > Set SSL - Select Full SSL (not strict)
  • Remove existing custom domain in Github repo settings - be sure to click "Save" (docs)
  • Re-add custom domain in settings to trigger the HTTPS setup process on Github's end
  • Ensure CNAME automatically updated
  • Check Enforce HTTPS (when available)
  • In profiles repo, check Enforce HTTPS

Note: Had to turn off HTTP proxy at CloudFlare to trigger SSL cert provisioning at Github (otherwise never gets past initial "domain not properly configured" stage)

Github Pages IP Addresses (for A records)

185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153

Tests

User Feedback - Grant submission instructions reference form that cannot be found

User believes organization is a good fit.

The foundation's application process is detailed in latest 990-PF. Instructions reference a form, but user is unable to find the form as foundation does not have a website. Foundation does list a mailing address, presumably to request the form via mail?

Specific user request:
"It would be a great help if you were able to include a link to the form on your site."

Reference:
https://www.grantmakers.io/profiles/v0/396076956-gardner-foundation/

Consider shortening names

The IRS-provided Index object concatenates names if two lines exist.

Example
https://www.grantmakers.io/profiles/010215216/

Consider pulling names from Filings instead of Index.

Applies to search results and profile header names.

Source code
https://github.com/smartergiving/irs-990-fetch/blob/master/normalize.js#L6

e.g. Filing:

"BusinessName" : {
                    "BusinessNameLine1Txt" : "CHINA LIBRARY ASSOCIATION",
                    "BusinessNameLine2Txt" : "ALBERT CHURCH BROWN MEMORIAL LIBRAR"
                },

Index:

"OrganizationName" : "CHINA LIBRARY ASSOCIATION ALBERT CHURCH BROWN MEMORIAL LIBRAR",

Make raw data more accessible to open source community

Currently have link to MongoDB algolia.bson file on README and anyone can download full profile data by forking Github repo. Anything else requires a visitor to request the data via email, providing an extra barrier to folks who just want to tinker.

Provide direct downloads of all useful data, particularly in MongoDB bson format (or alternative), to allow for more hackers, researchers, journalists, and academics to more quickly run specialized queries.

Add 'isActive' flag - replaces 'hasRecentGrants'

The hasRecentGrants flag was always a proxy for if a foundation is still active or not.

We will remove that flag and create a new isActive flag based on a more definitive source (e.g. Pub 78 or the EO BMF).

Hit and miss with pdf format for taxes

PDF format for taxes is a hit-and-miss sometimes especially for 2016 tax returns for Foundations.
However it works well for 2015 tax returns in pdf format.
Here is one example of hit-and-miss pdf (2016) for Ina Kay Foundation, Inc.
nopdfformat

Create update scripts

Current scripts assume a user is starting from scratch and downloading the IRS Form 990 dataset for the first time. Given the size of the files and the frequency of updates by the IRS, it's time to create scripts that focus on updating existing MongoDB collections.

The IRS provides both a unique identifier (DLN) and a timestamp (LastUpdated) in the index files.

  • Create update scripts - currently located in the smartergiving/irs-990-fetch repo
  • Improve Algolia upload sequence (see below)
  • Update profile pages on Github Pages

Algolia

Repo
https://github.com/smartergiving/irs-990-fetch/blob/master/gcf_http/syncWithAlgolia/index.js

Discussion
https://discourse.algolia.com/t/indexing-large-file-mongo-collection-using-api-node/2719

Data
Full dataset can be downloaded here
Warning - 1GB+ file size

Nice-to-have
Allowing it to work as a Google Cloud Function (2GB memory limit and 9 minute execution limit)


Sample Index object from AWS

{
        "EIN" : "208164731",
        "TaxPeriod" : "201506",
        "DLN" : "93491316013475",
        "FormType" : "990PF",
        "URL" : "https://s3.amazonaws.com/irs-form-990/201523169349101347_public.xml",
        "OrganizationName" : "PLATTE VALLEY LEGACY FOUNDATION INC",
        "SubmittedOn" : "2016-02-05",
        "ObjectId" : "201523169349101347",
        "LastUpdated" : "2016-03-21T17:23:53"
}

Search for the Foundations that would accept unsolicited request for funds

One major challenge searching through many grants via Grantmakers Search is that some Foundations who will only accept preselected charitable organization, and do not accept unsolicited request for funds. The Foundations would indicate such practice on 990, Part XV, Item #2.

We want to search for the Foundations that would accept unsolicited request for funds via Grantmakers Search.
chadkruse_partxv-of-990

Algolia - nice-to-haves

  • Mobile - add facets
  • Mobile - fixed navbar for grant search header
  • Mobile - lazy loading instead of pagination
  • Switch back to static list of grants if a) Algolia is over quota, b) throws an error, or c) initial search has no results
    • Hide Algolia search bar
    • Hide Algolia wrapper (stats/hits/facets)
    • Disable fixed header

- [ ] Consider adding grantee_name facet - useful for users searching for project fit (e.g. org X has been supported by foundation y for past five years...what projects over the years have been supported?)

Hyperlinks broken if name includes hyphen

If OrganizationName contains a hyphen, profile url contains the hyphen (e.g. foo---var), but links to those profiles exclude the hyphen (e.g. foo-bar).

Bad links exist in sitemap and Algolia search results

2,545 foundation names contain hyphens

Examples:
https://www.grantmakers.io/profiles/v0/133877532-leonard-friedland-charitable-foundation-co-cherry-bekaert-llp/

https://www.grantmakers.io/profiles/v0/133195928-pollock-foundation-co-oscar-pollock---ingalls-and-snyder/

Add 'requester pays' options for data downloads

  • Create new bucket and turn requester pays option to 'on' (docs)
  • Add additional step to deploy scripts to also send data to requester pays bucket
  • Detailed README with instructions (including limitations of dataset)

Size of files (gzipped):
1.5GB Normalized filings (2011-current)
0.2GB Grants (2011-current)

Storage cost negligible (only $0.05 / mo...$0.026 / GB)
Network costs and egress fees are the concern (fee schedule)


Alternative:

  1. Use G-Suite storage (API docs)
    Q: What are the consequences if a developer constantly hammers the endpoint(s) programmatically?

  2. Use a cloud function to disallow programmatic access. Would allow good actors access, but prevent runaway costs from programmatic hammering of endpoint.

CurrentRefinement buttons overflow off page on mobile

The problem:
v2 of the currentRefinements widget allowed for a button per each refinement selection. v3 buttons have one button per facet category (e.g. multiple selections per facet appear on a single button). The result is the button will overflow off the page. This is particularly prevalent on mobile.

Unless Algolia adds the templates option back to the currentRefinements widget, will require lots of additional connector code.

Adding to #someday for now as very few visitors use multiple facets on mobile.

The alternative is to simply hide currentRefinements on mobile (and perhaps add a filter count to direct user back to refinements slide-out)

Index page has repeating entries

Hey! This is an interesting and useful project. I noticed there's some potential bugs with the index page. There are repeating entries for some place entities. Puerto Rico and British Columbia both show up twice, for example:

Screen Shot 2019-06-09 at 1 11 13 AM

I'm guessing these entries show up twice because either it's case sensitive (e.g. BRITISH COLUMBIA vs. British Columbia) or abbreviations are used in some but not in others (e.g. Puerto Rico vs. PR).

There's also some odd entries that are obviously not U.S. states, e.g. Foreign, Beijing, England, Ontario, etc. I would suggest ordering the U.S. states first, then list the odd entries, since I think most users would look for U.S. states first.

Profiles - Google crawl error if org name changes

If an organizations changes their name from one tax year to the next, the url of the profile changes on Grantmakers.

Google eventually catches up, but the longer-term fix may be using the org name from the filing instead of the index. The index includes the second line of the business name (e.g. "co John Public").

  • Standardize on single name-style (e.g. Index or Filing or ??)
  • Create redirects if name has changed (307 redirects)
    • Quickly explore possible alternatives to Jekyll redirects (e.g. Netlify's _redirects feature)
    • Update scripts and re-run profiles
  • Considering removing CO and ATTN (5,520 profiles)

Examples

New Name
https://www.grantmakers.io/profiles/v0/912154616-ronald-and-ann-williams-charitable-foundation-co-richard-newton/

Old Name
https://www.grantmakers.io/profiles/v0/912154616-ronald-and-ann-williams-charitable-foundation/

New Name
https://www.grantmakers.io/profiles/v0/510137200-san-jose-symphony-foundation/

Old Name
https://www.grantmakers.io/profiles/v0/510137200-san-jose-symphony-foundation-co-marc-rebboah-treasurer/

New Name
https://www.grantmakers.io/profiles/v0/800727539-turner-farm-foundation-inc-co-robert-g-edmiston-trustee/

Old Name
https://www.grantmakers.io/profiles/v0/800727539-turner-farm-foundation-inc-robert-g-edmiston-trustee/

Remove FeedbackLite

Button currently shows 'invalid campaign code', likely due to them changing the ability to use custom buttons (?).

Materialize - bugs

  • FAB modal requires scroll on mobile (small only)
  • FeatureDiscovery title bleeds over on some mobile devices (iPhone 6/6s/7, Galaxy S5, and smaller)

Strategy for handling grant lists filed as attachment (e.g. See Attached)

child of grantmakers/profiles#23

Improve search for scholarship seekers

Grantmakers.io was currently built entirely with the nonprofit fundraising professional in mind. Turns out many scholarship seekers are also using the site.

This could be as simple as adding the "grants purpose" field to search refinements combined with a brief tutorial that is scholarship specific.

TODOs

  • Market research: I'm surprised this need isn't already being fulfilled via other mechanisms
  • Define v0

Change definition of "Has Recent Grants"

Has Recent Grants is true if the organization's most recent electronically filed 990PF has any grants.

Need to consider organizations that used to file electronically, but no longer do (e.g. should grants from tax year 2015 really be considered as "recent"?).

Particularly important as more foundations move to DAFs (e.g. EIN 452523468)

See normalize.js

Navbar does not reliably affix on mobile browsers

  1. Input bleeds over on right edge
  2. Navbar scrolls away if no text entered
  3. Works as expected if input has text

UPDATE:
HTML5 autofocus attribute not supported by iOS...need new navbar approach on webkit mobile

Migrate off Waffle.io

Waffle.io service is shutting down May 16, 2019

Need to move to Github Pages (migration link) or alternative like Zenhub.

Decision: Moving to Zenhub

  • Add goals (Issues)
  • Add initiatives (Milestones)
  • Consider adding Type: enhancement, Type: bug, Type: infrastructure to Issues
  • How to integrate User Story / Job Story? (inspiration)
  • Per above, consider adding a Github Issues template for Epics
  • Add remaining Trello cards (board)
  • Add new Epic that covers Add Charitable Activities...Enhance Search?
  • Add Orchard label?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.