๐ whoami ๐ฒ
(2010..Time.now) dev: ThoughtWorks -> Braintree -> Breadcrumb (Groupon) -> ThoughtWorks ->
Square -> Sempre Health -> Parachute Health
Healthtech
๐ช Parachute Health ๐ช better ordering for Durable Medical Equipment (we are hiring)
A lead of the Ruby for Good CASA project 2019 - ๐๏ธ
I have been a developer since 2010.
I started my career at ThoughtWorks, and
I've worked in a variety of industries including airlines and payment processing.
And now I work in healthtech.
I work in healthtech because I have figured out what I want to do with the rest of my life,
which by the way is terrifying,
I plan to spend my forseeable future taking my revenge on the USA healthcare system
by trying to improve it.
My open-source-supportive employer is Parachute Health.
WE help patients get their prescribed Durable Medical Equipment like wheelchairs and CPAPs.
I have been A lead of the CASA project since it started in 2019.
Fast Definitions
โ๏ธ CASA is a nonprofit which trains volunteers to help foster youth
โจ
๐โค๏ธ Ruby for Good๏ธ is a nonprofit which builds software for other nonprofits
(mostly in ruby)
โจ
The Ruby for Good CASA project โจ๐ is software written by Ruby for Good to help
CASA
Some fast definitions- CASA is a nonprofit which trains volunteers to help foster youth
Ruby for Good๏ธ is a nonprofit which builds software for other nonprofits
The Ruby for Good CASA project is software written by Ruby for Good to help CASA
This talk is about
โจ
https://github.com/rubyforgood/casa
โจ
creating
an ecosystem
for writing OSS
SaaS OSS
serving volunteers
who serve foster youth
This talk is about creating an ecosystem for writing open source software, specifically software as a
service open source software, to serve volunteers- who serve foster youth.
raise your hand if
you have ever thought about the USA foster care system
(raise your hand if) you have ever thought about the USA foster care system? - Thank you, you can put
your hands down.
Many people know somebody, have worked somewhere, have volunteered somewhere, have read something about
the foster care system. When I started on this project, I was not very familiar with it. What you need
to know today
(USA specific) foster system
Details differ per state. There are over four hundred thousand youth in the foster care system on any
given day.
These youth are ages zero thru eighteen (or twenty-one, depending on circumstances) who are not under
their original parental guardianship. A youth exits foster care through reunification OR adoption OR
emancipation. You can learn more from the links here.
~50 years ago
"Every child placed in foster care must have court oversight to ensure that both the
childโs and the parentsโ legal rights are protected until the child reaches a safe, permanent home"
"The first CASA Program was founded in 1977 by Judge David Soukup, a Juvenile Court judge in Seattle,
Washington who felt that he was making critical decisions
about childrenโs lives without adequate information. He began recruiting volunteers from the community
to work one-on-one with children in foster care. The volunteer advocate, or โCASA,โ is appointed by a
juvenile court judge to a child in foster care. The CASA then gets to know their assigned child, gathers
information from everyone in the childโs life (including the childโs biological parents, foster parents,
medical and mental health professionals, social workers, therapists, teachers, and attorneys) and
prepares a written report giving the judge in the childโs court case detailed information about the
situation and the childโs needs."
Fifty years ago in the seventies there was a judge who felt that he didn't know enough about the
situations of foster youth to make informed decisions about their care. Decisions like
who the legal guardian of the youth will be and what the rules around visitation
are. To fix this, he created the organization that grew into CASA.
The CASA organization
nationalcasagal.org
93k+ volunteers, 900+ independent regions, 49 states + DC (no North Dakota)
30hr+ training + continuing education
๐ง๐ฝโโ๏ธ Sworn in by judge for ~2yr minimum
1๏ธโฃ Assigned to one youth
Gather information
๐ Court Report / ~6mo
wiki/Court_Appointed_Special_Advocates
Today, CASA is a national organization with many local chapters, corresponding to the organization of
the courts where the volunteers serve. Over ninety thousand volunteers in almost all states, each go
through
over thirty hours of training plus ongoing continuing education. They are sworn in by a judge and commit
to serve for several years. Each volunteer is assigned to one youth- sometimes two when there are
siblings- and follow up on the youth's care by talking to everyone involved.
Some volunteers are law students, some are retired, and they are very good at what they do, but doing
the paperwork is sometimes hard.
The court report is due every six ish months depending on court schedule, and has a specific format.
CASA Funding ๐ต ๐
"CASA [of Southwest Missouri] relies on a diverse revenue base, foundations and the United Way,
individual and corporate contributions, public grants"
casaswmo.org/who-we-are/frequent-questions
"The DFA awards two types of CASA grants (...) To be eligible to
receive a CASA Grant, an applicant must-"
courts.state.md.us/.../casaspecialconditions.pdf
"In California, most CASA programs are non-profit organizations and receive funding from a variety of
other sources."
courts.ca.gov/documents/CASA.pdf
Different CASA regions are funded in different ways. In general they find and manage their own funding.
Existing processes
CASA volunteer talks to people
biological parents, foster parents, medical and mental health
professionals, social workers, therapists, teachers, attorneys
Take notes
Don't forget any involved parties! ๐ค
๐ Court Report .docx / 6 months
โ๐ผ Supervisor of volunteers helps!
๐ Mileage reimbursement
๐ Ongoing training
๐ฐ Grant proposal evidence
How do they do what they do, currently?
A CASA volunteer communicates with the youth, parents, health professionals, teachers, and many others.
They take notes and help with reminders and accountability.
There are several supervisors per CASA organization.
They help the volunteer
craft the court report and keep up with the youth's situation.
Volunteers are unpaid but
can sometimes get mileage reimbursements.
The volunteer attends ongoing training on a regular basis.
The volunteer's notes, if they have been submitted to the CASA organization through the supervisor, are
useful contributing documentation when CASA organizations are providing evidence for their usefulness,
like when applying for grants.
Prior art ๐จ
SimplyOptima
CasaManager
Salesforce.org (nonprofit)
Paper forms hand-delivered to CASA regional office
Personal email
SMS text message
Fax
There are other software tools that CASA organizations tend to use. We are not competing with them.
Our work complements and coexists with these solutions. Our uniqueness is we are maximally simple for
the volunteer, free, and we work closely with the CASA organizations to implement changes they want.
Volunteer retention
โจ volunteer - supervisor communication 1๏ธโฃ
๐ Volunteer - Supervisor Communication 2๏ธโฃ
๐ VOLUNTEER - SUPERVISOR COMMUNICATION 3๏ธโฃ
Volunteer retention is very important.
The biggest predictor of volunteer retention is their relationship with their supervisor.
Our goal is to supplement, enhance, and ease that relationship, NOT replace it or distance it.
๐โค๏ธ Ruby for Good
A nonprofit writing software (primarily in ruby) for many nonprofits
Human Essentials, Terrastories, Circulate Tool Library for Chicago and beyond, Shelter Assist,
Mutual Aid, Abalone, and others!
Project list rubyforgood.org/our-work/impact
A friendly place to start doing OSS + learn by doing
2 yearly conferences (east/west USA)
Slack rubyforgood.herokuapp.com
What is Ruby for Good? Who are WE? How do WE help?
There have been many Ruby for Good projects- some of the currently active ones include:
Human Essentials, Terrastories, Circulate Tool Library for Chicago and beyond, Shelter Assist, Mutual
Aid, Abalone, and others!
You can see more historical projects at this Impact link.
Ruby for Good want to grow the tech community broader than it otherwise would be,
by helping people in, especially people from groups who are typically unrepresented in the tech
community, and regardless of skill level! Again, regardless of skill level!
We host two yearly events, where people can show up, contribute to one or many projects, hang out and be
social with other contributors, pair program, and feel inspired.
๐โค๏ธ Ruby for Good -> CASA
A former Prince George County (MD) CASA volunteer joined Ruby for Good
2019 - I signed up for a conference!
Team lead? Sure! โ
("Details TBD")
Assigned to CASA ๐
Planning, UI mockups, DB schema...
2020 surprise ๐ฑ remote ๐ฑ conference ๐โค๏ธ
How did Ruby for Good and CASA meet up? A former CASA volunteer joined Ruby for Good and said-
hey, I know some people who could use some software...
I came in, in 2019 when I signed up for the conference. I checked the box that said are you willing to
be a Tech Lead- I felt confident. I was assigned to CASA.
We did a lot of planning, stakeholder discussions, UI mockups, database schema design...
Then 2020 came and we had a surprise remote Ruby for Good conference!
It went very well actually thanks to the flexibility of the attendees, and some spreadsheets,
and lots of Zoom breakout rooms for pair programming.
So what did we build?
So what did we build?
So what did we build? Here is our login page.
The photo from CASA marketing- we chose one with only a youth, as a reminder of what we're here for.
The webapp is fully responsive for mobile, so that volunteers can easily use it from whatever device
they have with them, in whatever place they are. We have an Android app which is a thin shell over our
responsive webview.
This is the most important page in the app, where a volunteer enters a case contact.
A case contact is when the volunteer talks to someone about the youth's case.
These categories and contact types are fully customizable for each CASA organization and for each case-
for example, a youth might not have a sibling, so a supervisor would de-select Sibling from the contact
type list for this case, so that the volunteer can look at their contact checklist without distractions.
Contact made means- did they pick up the phone, did they answer the door.
Here is the second half of the most important page, and the most important field on the most important
page, which is notes. Notes in production average 400 - 1000 words. The vast majority of all case
contacts have notes.
When a case contact has been created, you come back to the case details page.
Every button here was a github issue- there are dozens of pull requests showing on this page.
The butterfly emoji is a visual representation of a transition aged youth- i.e. teenaged.
The Court Mandates are front and center- those come from the judge.
Up top, there's a button to generate the court report document.
There is also a button linking to the Emancipation Checklist-
emancipation is where you age out of the foster care system, containing things like- does the youth have
a drivers license? Do they have a place to stay?
A supervisor can send an email reminder to a volunteer through the website. or an in-app notification
Here is where an admin can export a CSV of mileage reimbursement requests,
or use our flexible data exporter to get any data out of the system.
Import is one of the technically trickier parts of the system. It's used for importing all the
supervisors, volunteers, and cases when a new CASA joins the system, and when a new batch of CASA
volunteers complete training, are sworn in, and are assigned to youth cases. They can also be added one
at a time but this is more efficient for streamlining onboarding.
We have a great UI pattern. If you need a user to upload a file in a partiular format, give
them a downloadable file in taht same format for them to follow and fill in. Also very cool, when an
error occurs with a line of an uploaded file here- like a duplicate or invalid data- then the user gets
a downloaded file with line by line errors that they can edit and re-upload.
After importing a volunteer, they can be edited, assigned to a case, assigned to a supervisor.
Our users love our UI because it is simple, and user friendly, and has nothing that they don't
need.
Why do volunteers volunteer?
meta
Why do (our) contributors volunteer?
Job credibility ๐ฉ๐ฝโ๐ป
Open Source Software ๐จ๐ฝโ๐ป
Meet the kind of people ๐๐ป who put time into helping other people ๐๐ป
(Why do volunteers volunteer?) Why do contributors contribute?
This is on my mind a lot.
Our contributors each have their own reasons. Some themes I see are- they want to learn, they want to
learn by doing. They want to contribute to something, and they want to learn how to contribute to
something. They want to "DO" open source software, because everyone should DO open source software- the
zeitgeist says so, the zeitgeist requires it. All developers know that you should do open source work.
And- our contributors want to meet the kind of people who want to help people.
Theory of maintenance
(my) maintaining is 80% making it easy for OTHER people to do work ๐ช ๐
Be a safety net โก๏ธโ๏ธ
So why do maintainers maintain? And how? For me, most of what I do is making it easy for other people to
do work. I love other people doing work.
I like coding, I do it for work and I do it for fun. When I want extra fun I do it for CASA, but that's
not the
core value I provide. The core value that I provide is encouragement and being a safety net.
I say- "It's ok if the PR is bad, if it's really bad I won't merge it. We'll improve it together. You
should open that PR. Ask in slack if you have questions- there's always someone around.
Yes that looks like a bug, you should make an issue for it.
SAAS
๐ You are holding someoneโs data; keep it safe! ๐ฐ
โ๏ธ๐จ๐ non technical stakeholders
๐ customer support + uptime
What you're not holding, you can't drop
Our non-technical stakeholders and users speak a different language. Having an expert translator is very
useful. This role is often called a PM or analyst.
our priorities
Data safety ๐
Empower CASA volunteers ๐
Improve CASA organizational efficiency ๐
Help contributors grow skills ๐ฑ
Donโt give the foster youthโs data to people who shouldnโt have it
User friendly to our users, the volunteers, supervisors overviews, and admins to do their job
Healthy open source software first stop (need work to do!).
Be a place where software developers can make their first open source pull request and feel happy about
it. We have to keep a pipeline of work that needs doing in order to serve this need.
What works?
โ
โ
โ
โ
โ
โ
โ
(for us)
Human impact && stakeholder interactions
Cadence and breaks
Ruby for Good Conferences
๐๐ฑ๐ญ๐
Calendar
Slack
GitHub
Deployment
Code
Fast PR merge
Community
๐ป๐ฑ
What works? I have a LIST!
This is inspiration, not a guide.
โ
Human impact
Clear & simple causal chain to human impact
Some contributors have a personal connection
Stakeholder contact increases connection
The path between this work and helping someone is a short causal chain and that helps attracts and
retain contributors.
Some contributors are already specifically interested in improving this particular ecosystem.
Others become more invested as they meet our stakeholders and hear about the daily work of our users.
โ
Stakeholder interactions
Regular short check-ins for ideation
Notes doc 2019-present ๐
CASAs talk to each other ๐
Weekly progress email
Always CC casa@rubyforgood.org
Smart typeform bug reporter ๐ก๐
YouTube playlists
of product walk-throughs โถ๏ธ
We talk to our stakeholders regularly to hear about bugs, questions, and desired features.
We usually take notes in slack and drop the highlights into a a shared public doc-
I've been editing and reading the same document since 2019, which is an unusual feeling.
The stakeholders also enjoy sharing best practices with each other and listening to them helps us
understand what they do.
Whenever we send email to stakeholders we try to cc the main casa@rubyforgood account so that nothing
gets trapped in an individual person's inbox and any one contributor is not the only one who knows
something
Another useful technique is a smart bug reporting form made by a previous PM that guides the user to
make a clear bug report and then auto-posts to a private slack channel (because users can type anything
into a form...)
โ
Cadence and breaks
Weekly stakeholder sync
Weekly office hours (same day)
Weekly deploy
Slow/lean times between big events
Having a regular cadence for important tasks makes them easy to remember for everyone.
We skip one now and then for special events.
We have weekly office hours on the same day as the stakeholder sync, which is convenient for
transcribing notes into coherent units of work.
Office hours are casual and social- we usually debug something, and discuss upcoming work and events,
and co-work.
We deploy weekly on friday evenings because frequent deploys are safer than infrequent big deploys, and
if something goes wrong we have more contributors available to take a look at it than during the work
week.
We have chill times between big events which is great- rest periods help with sustainability.
โ
Ruby for Good Conferences
2x / year (east / west coast USA)
New friends!
Speedrun onboarding
Project level deep direction setting
Speaking of big events, Ruby for Good's East coast event happened last week near DC.
At events like these, new joiners pick a project and make great contributions while enjoying
pair programming (optional but popular) and non-coding social events also.
These development sprints help us make enormous progress and set us up for success.
Most contributors choose one project to work on, but some try to get one PR into every project
which is fun too.
โ
Company "offsite" visitors
๐โฑ
"Power Week" with powerhrg.com
Various Ruby for Gooders' entire work teams
Non-developer work is a precious commodity in OSS
Contact casa@rubyforgood.org if you/r team are interested
๐ช๐
We are also happy to be a destination for companies who want to give back to their community,
and several companies have scheduled a day or a week to have their teams work on external code
as a team activity.
Power Home Remodeling is interesting in that they build a lot of software and they have a lot of
developers, enough to lend every r4g project to get a full team for a week.
If you're interested, email us.
โ
Calendar
To track special events like these and our regular events, we keep a public calendar,
owned by the shared account to prevent access issues as contributors come and go.
And it helps us to reserve time on our stakeholder's schedules to send then calendar invites with zoom
link
โ
Slack
Part of Ruby for Good slack
Active public channel
Channel reminders
Leads private channel
Bot channel (PRs, issues, errors, deploys)
We are part of the ruby for good slack which is great for cross-pollination between projects.
They provide moderation and invite management so we don't have to.
We have an active public channel with channel reminders for our meetings.
We also have a private channel for maintainers and that is also where our bug reporter form outputs.
We have a bot channel for PRs, issues, bugsnag errors, and heroku deploys. It's noisy and a good
heartbeat and historical record.
โ
Continuous Integration
Our continuous integration runs all our tests on every pull request and on the main branch on every new
PR merge. It is split into PARALLEL named build sections- it's convenient to be able to see which small
part failed for fast feedback on a red build. Our CI runs on Github Actions
โ
GitHub
Continuous integration split into named build sections
Dependabot ๐
Project management ๐
Workflows (auto-comment, auto-unassign) via github actions
Wiki
PR templates
Issue templates
PR merging strategy โก๏ธโ
๐ฑ (TBC)
Dependabot opens PRs to keep your dependencies up to date, which is much better than ignoring them until
you need to upgrade and something strange broke long ago.
We use github Projects for work management in a vaguely kanban style, and newly created issues auto-add
themselves to the board. It's simple but you can automate it, and it's nice to not need an extra login
for contributors to look at to claim an issue.
Workflows ticket management to comment on and then unassign claimed but inactive issues reduces
repetitive emotional labor. Workflows also auto-tag our new issues
We use github wiki for project-level information on processes and historical record
PR templates and issue templates are great to gently guide contributors to give you essential
information.
โ
GitHub permissions
๐ Protect your main branch!
๐ณ Branches - maintainer-merger convenience
๐ด Forks - more educational
No one should be able to force-push to your main branch. If you really need to, remove the permission
blockage, do the needful, and then put your protective gear back on.
I prefer contributors to branch rather than forking when possible because that makes it easy for a
maintainer to push to a branch to
clean up PR issues pre-merge. In order to enable branching over forking, we give excessive permissions
to contributors who made made a fwe PRs or come to office hours.
However, forking teaches contributors how to contribute in general. Git is one of the hard parts of
getting
started in OSS
Issue Templates
You can tell by the emoji that I have been here!
Building a template is an art
This is built of the best pieces of many excellent artifacts.
We want the minimum that will make for better user contributions.
We want to guide new contributors without discouraging them
โ
Deployment
PR merge -> auto-deploys to QA ๐บ
Manual deploy to staging
Manual deploy to prod ๐
Deploy checklist โ๏ธ
Check on DB backups ๐
Check on email health
Heroku teams + pipelines
Heroku scheduler (cron) ๐
Papertrail (logs) ๐
Bugsnag ๐
When a PR is merged, it automatically deploys to the QA environment.
Then there is a button in heroku to press to manually deploy to staging, and from there to prod.
Deploying to staging shortly before prod gives us a chance to see migrations and data migrations run
together realistically rather than piecemeal. Because code that deployed together successfully does not
always deploy successfully together.
We have a deploy checklist, which includes checking on db backups and email bounce rates.
We have a few cronjobs to do things like send a monday morning email to each supervisor telling them
everything their volunteers have done that week
โ
Code
Test LOTS
Limit javascript
Readme!
Dependencies: stick to standards, stay basic and picky e.g. devise, pundit, draper,
bootstrap, factorybot, letter_opener, sablon
StandardRB linting
Realistic seed data
Docker or not ๐
Thin android app for better user experience
We have code. We have lots of tests, because our only defence against ourselves is tests.
A PR without sufficient testing may be merged, but we'll ask the contributor for a follow-up PR with
improvements, or file a chore to add more tests.
To reduce conceptual complexity, we try to minimize our javascript and rely on server-side rendering.
Our readme is very important to help new contributors understand the value and setup flow of the
project.
Minimum configuration, maximum predictability, test everything, value refactoring.
We have a docker development environment, which runs in CI but not everyone uses locally
โ
Fast PR merge!!!
Retention & growth ๐ฑ ๐ โจ
Lead approves, lead merges ๐จ
Merging deploys, but not to production
Deployment pipeline as safety net โฝ๏ธ ๐ฅ
Test LOTS ๐ฏ
Fast merging increases contributor stickiness. We need contributor stickiness!
People stick around because they feel their work is valued.
cultural expectation: maintainer approves and merges. Requests changes in follow-up PR or create chore.
Reduces chances of merge conflicts. We started doing it during conferences, and
continued because we like the way it feels. Not all r4g projects do that, just us.
This is extra safe because merging does not equal deploying.
Learning to write new tests is a skill that many new contributors value and want to practice.
Test-only tickets are popular.
this is slide 44
โ
Community
Ruby for Good negotiates for compute resources for *all* projects
Cross-project help squad
Second-order backup for AFK maintainers
r4g is my safety net like I am the contributor's safety net
A big community of technically capable people who can respond to urgent
needs even if they donโt otherwise contribute often (and a way to reach them)
I have a lot of faith in this system because we've used it several times
TODO tune it, repetitive
Keep doing
โ
๐
Be people at each other
Chill sometimes โ๏ธ
Group events! ๐ณ
Use powerful tools ๐
Deploy often and carefully ๐ช
Wary code choices ๐ฎ
Accept PRs joyfully ๐
Community
โจ ๐ โค๏ธ
This is custom advice. It may not apply to your situation.
Hard things
โ ๐ฐ ๐ญ ๐ฑ โ
(for us)
Need more issues
System edges
Historical records
Testing is hard
Feedback
โ
This is custom advice. It may not apply to your situation.
โ More issues, please!
Small bites ๐ช
2-10 / week
ALL / 3 days (during conferences)
This is a great problem?
Writing issues takes effort
Unlike many other open source projects, the majority of our issues are created by maintainers based on
discussions with stakeholders. Which takes work. We go through a few issues a week during regular weeks,
and we run out of 150+ issue backlogs during big events.
This is a great problem to have, but it is still a problem that we have.
We have a strong contributor appetite for small bites and intro issues.
Write issues for the people who you want to solve the issues- not yourself. When I make an issue for
myself, it says "fix the button on the edit page" but which edit page? Which button? What does fix mean?
โ System edges - Import
(table-based data)
Volunteers, cases, supervisors, and the linkages between them
Override existing data by unique key? ๐จ
De-duplicate duplicate rows? ๐คฆ๐ป
Partial error - row 1 succeeds, row 2 fails ๐ โก๏ธ ๐ โฉ๏ธ
Row dependencies- row 3 references row 2 and 1. Keep it? โญโฎ
Display per-row errors ๐
What do we import? Volunteers, cases, supervisors, and the linkages between them.
Bugs happen around the edges- for us, data imports are a continual struggle even with lots of tests.
Import is easy to do, hard to get right.
โ System edges - Export
Word documents are hard
User supplied court report template format with header logo (one per CASA organization, + a
default)
User-created data (case contacts)
Slice and dice date-based data
Yay sablon (rubygem)
Stakeholders need Word. Not many contributors have it. Nice formatting in something you can't see is
hard.
โ Memory
Search Slack history
Search old github issues
Meeting notes doc 2019-present
Wiki
Architectural Decision Records
Verbal history
It's never enough
I don't think we can fix this
All projects have this issue and we do too
โ What is a good test?
Good testing is a skill not as easy to specify in acceptance criteria as visible functionality
How do you teach good testing?
fill in later? do more of? flakiness, cypress. minimum js because few contributors, turns into a cycle-
no js contrib because little js. avoiding frameworks, leaning hard on erb as much as possible.
โ Missing-contributor feedback
The people who leave don't say why. Measure what happens . Hear the concerns of the people who
stay
Some people show up one time and leave and we never hear from them again. We will never know what
happened.
Some other people leave the project in the best way- they get a new job, in part from connections and
encouragement and knowledge
Number and lifespan of contributors - ~100 committers in the last year, ~8.5k commits
Never say "if that makes sense."
Working on
๐ ๐ช ๐
๐
Backlog
System edges ๐
Future Archaeology
Testing
Contributor feedback
โ
We have lots of fun and interesting work to do. If this work sounds like good work to you, come and
bring your friends and coworkers
๐ก Encouraged contributors... ๐ก
๐ก ...become strong contributors ๐ก
Many of our contributors come in because a friend tells them that we are the kind of project that will
let them work!
Contributors bring Energy. They can Grow knowledge. They can spend their apparently extra time & energy
onboarding even more contributors for you + pitching you to their friends
How do you encourage someone? Say the words "You can do it! You got this! That idea sounds good, please
do it."
๐ A note on purpose
What is your project's purpose?
Improve the world! โจ
What are your contributors' purposes?
OSS skills, job credibility, learn ๐ฉ๐ฝโ๐ป
What are your users' purposes?
Serving CASA youth ๐ช
What is your purpose as a maintainer?
Smooth the path ๐ฃ
What are you here for? What is someone else here for?
Tips ๐ก
When you want users to upload a spreadsheet, provide a downloadable sample spreadsheet
Use github workflows to automate polite stale issue un-assignment to replace maintainer emotional
labor
PRs that each deployed cleanly may not deploy cleanly together
Word documents save edit history- check for sensitive info before attaching one to a github
issue
spreadsheet
github workflows to automate polite stale issue un-assignment to replace maintainer emotional labor
PRs that each deployed cleanly may not deploy cleanly together
Word doc edit history
to recap...
Multi-level safety nets ๐ฅ
โฝ๏ธโจ
Serve stakeholders ๐ and grow contributors ๐ฑ
Strong cadence ๐
Sustainable โป๏ธ maintainership requires rest ๐ค and a community ๐ (for me)
Our safety nets are: multiple maintainers, a deployment pipeline, lots of tests, a backing organization
like
ruby for good, cross-talk with other projects. Safety nets allows people to move faster.
Clear priorities reduce total effort. Talk about why you do things like have a deployment pipeline, or
why you have specifically Word docs. Arbitrary decisions and requirements are a transparency problem.
Cadence and breaks are key (for me). Your mileage may vary. Multiple maintainers are great to have.
I hope you have liked this case study.
Send halp
More CASA regional organizations - we're at ~4/900+ We're free and friendly!
PM, QA, design!!! ๐ ๐ ๐จ
PRs, especially testing & refactoring ๐ฆ
๐ฒ @goldlindastein
โจ
@rubyforgood ๐
linda@rubyforgood.org โจ casa@rubyforgood.org
Join us on slack!
rubyforgood.herokuapp.com
What I want most is more CASAs on the platform! We are free and friendly and we want to be useful.
If you know someone who is involved in the foster care system we would love an introduction! Please
email us.
We value contributors who like stakeholder management, user interviews, PM, QA, and especially
designers!
Using the UI, finding bugs, asking questions, and opening github issues is wonderful.
And of course we welcome pull requests for new features, bugfixes, testing, and refactoring!
# seed realistic case numbers
@case_number_sequence = 1000
CASE_TYPES = ["CINA", "TPR", ""]
def generate_case_number # format different per region! PG CASA
# CINA-YY-XXXX Child In Need of Assistance
# TPR-YY-XXXX Termination of Parental Rights
years = ((DateTime.now.year - 20)..DateTime.now.year).to_a
yy = years.sample(random: rng).to_s[2..3]
@case_number_sequence += 1
"#{CASE_TYPES.sample(random: rng)}-#{yy}-#{@case_number_sequence}"
end
Case numbers are meaningful. When we show data to our Subject Matter Experts, SMEs, it's important that
the data be realistic because many SMEs are hyper-sensitive to invalid or unrealistic data. For example,
occasionally one of our users points out that in our test data, a case with a number starting in 00
should have emancipated by now, and a case with a YY field of 20 cannot reasonably be a transition aged
youth because they are 1 year old, not a teenager.
Fictive Kin
Fictive Kin โ children are placed with an individual, unrelated by birth or marriage, who has personal
or emotional ties with the children or their family prior to the placement (e.g. family friends, school
staff, babysitters, etc.). Someone who is known to, and trusted by, the child(ren).
The Kinship Care and Fictive Kin Reform Act ... allows the Department to place the child with a relative
or individual not related by birth,
adoption, or marriage, but who maintains an emotionally significant relationship with the child.
https://en.wikipedia.org/wiki/Fictive_kinship
https://www.childwelfare.gov/topics/outofhome/kinship
https://www.alec.org/model-policy/the-kinship-care-and-fictive-kin-reform-act/
https://www.cdss.ca.gov/inforesources/foster-care/kinship-care
### What github issue is this PR for, if any?
Resolves #2XXX
### What changed, and why?
### How will this affect user permissions?
- Volunteer permissions:
- Supervisor permissions:
- Admin permissions:
### How is this tested? (please write tests!) ๐๐ช
### Screenshots please :)
### Feelings gif (optional)
What gif best describes your feeling working on this issue? https://giphy.com/
How to embed:
`![alt text](https://media.giphy.com/media/1nP7ThJFes5pgXKUNf/giphy.gif)`
A balance between too much and too little - too much work vs too little information
What github issue is this PR for, if any? Resolves #2XXX
What changed, and why?
How will this affect user permissions?
How is this tested? (please write tests!) ๐๐ช
Screenshots please :)
Feelings gif (optional)
Working with Word docs
Not all developers have Word
Google Drive does not render the same
LibreOffice does not render the same
Deleted content is still present- watch out for invisible sensitive data
Not all developers have Word
Google Drive does not render the same
LibreOffice does not render the same
Deleted content is still present- watch out for invisible sensitive data
gem "after_party" # post-deployment tasks
gem "amazing_print" # easier console reading
gem "azure-storage-blob", require: false
gem "bootsnap", ">= 1.4.2", require: false # Reduces boot times through caching; required in config/boot.rb
gem "bugsnag" # tracking errors in prod
gem "devise" # for authentication
gem "devise_invitable"
gem "draper" # adds decorators for cleaner presentation logic
gem "faker" # creates realistic seed data, valuable for staging and demos
gem "filterrific" # filtering and sorting of models
gem "image_processing", "~> 1.12" # Set of higher-level helper methods for image processing.
gem "jbuilder", "~> 2.11" # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem "lograge" # log less so heroku papertrail quits rate limiting our logs
gem "noticed" # Notifications
We use after_party to run data migrations to backfill data- runs automatically after deploy.
We use amazing_print to have better rails console logging
We use azure to store some files like logos and more in the future
We use devise for authentication + invites
We use draper for decorators- for use in views, like a serializer but for serverside rending
We use faker to genreate test data
We use filterrific for UI filtering in tables
We use noticed for our in-app notifications
gem "paper_trail" # tracking changes
gem "paranoia", "~> 2.2" # For soft-deleting purpose
gem "pg", ">= 0.18", "< 2.0" # Use postgresql as the database for Active Record
gem "puma", "~> 5.4" # Use Puma as the app server
gem "pundit" # for authorization management - based on user.role field
gem "rack-attack" # for blocking & throttling abusive requests
gem "request_store"
gem "sablon" # Word document templating tool for Case Court Reports
gem "skylight" # automated performance testing https://www.skylight.io/
gem "webpacker", "~> 5.4" # Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
We use paper_trail to track object changes for later audit trails
We use paranoia to prevent deletion of sensitive objects
We use pundit for authorization (what user is allowed to take what action)
We use rack to detect and prevent repeated calls from unexpected IP ranges
We use sablon for generating Word docs
We use skylight for performance tracking
Our maintainer selection
Informal
๐ Do work ->
๐ Get invited ->
๐ช Get permissions ->
๐ Do more work ->
๐
[Optional] fade away
๐ก ...maybe we should change this?
Our pipeline and safety net- looks a lot like Jenkins if you squint.