Mapping Instability

Individual placement histories, mapped case-by-case

This map traces placement paths through Florida foster care — each dot is a placement, sized by how long they stayed. The maps are generated from the real placement history of 346,398 children in Florida's foster care system — a few cases go back as far as 1982, with the full population covered from 2002 through 2025.

Step 1

Pick a case

See an example, browse by group, filter, or enter any AFCARS ID directly
or or or
Loading groups…
Want to narrow one of these down further — by age, gender, county, and more? Pick it from the Group dropdown in Filter instead.
Placement Type and County are both % of days actually spent in a placement — doesn't count "Out of System" gap time, unlike the Time Breakdown chart on a case page, which does.
Placement Ending is % of this child's non-administrative placements (a placement count), not days — same field and truncated text as the Placement Endings chart shown on each case page.
Step 2

About the child

Demographics, removal history, and maltreatment codes for this case
Case
Step 3

See the placement path

Press play to watch placements unfold in order, or step through them yourself
Case
Speed
Press play to animate the placement path.
Round ticks mark each placement; a diamond ◆ marks the first placement of a new removal episode. The ruler below marks roughly when the child turned each age.
Out of the Placement System
Dot size scales with length of stay. Hover a dot for provider, placing agency, length, end reason, and zip. Scroll/drag to zoom and pan.
Step 4

Explore the patterns

Click a row to highlight matching placements on the map above
Case
Time Breakdown
Share of time spent in each placement type
Click a row to highlight that category's dots on the map above. Click it again to clear the highlight.
These percentages are of this case's whole timeline, including "Out of System" gaps — so they'll read lower than the Filter's Placement Type percentage for the same category, which only counts days actually spent in a placement.
Placement Endings
Number of placements by how they ended
Click a row to highlight placements that ended that way on the map above. Click it again to clear the highlight.
How this was made — what each stat means
De-identified data
This map uses de-identified public-records data. The case identifier is an internal FSFN/AFCARS record ID, not the child's name — see "Caregiver name anonymization" below for how provider names are handled.
Case ID
The internal FSFN/AFCARS record ID for this child — not their name. Each option in the Case dropdown was picked at random from a different placement-count bracket (1, 10–24, 30–44, 45–59, 60–74, 75–89, 90–104, 105–119, and 120+ total placement rows), so the set spans very simple to highly complex cases rather than being a typical child.
Gender / Race & Ethnicity
From the FSFN demographics table. Race/ethnicity collapses the raw race flags and Hispanic-origin flag into one category, using this priority order: Hispanic → Multiracial → White, non-Hispanic → Black, non-Hispanic → Asian → American Indian → Unknown.
Placements Mapped / Providers
Placements Mapped counts placement rows that have a plottable location (see "Excluded From Map" below). Providers counts unique provider_id values across this child's whole placement history.
Age Range
Date of birth (FSFN demographics) subtracted from the earliest placement_begin_date and, separately, from wherever the last placement ends — shown as a span (e.g. "15–18 years") rather than one number, since a long case can cover several ages. Only shown as a clean year-to-year range once both ends are at least 2 years old; a case that starts younger pairs the same "N weeks/months/years" buckets used elsewhere on this page instead (e.g. "3 months – 15 years").
Time Covered
The full calendar span from the first placement's start to the last placement's end — this includes out-of-system gaps (reunification, trial home visits, etc.), not just the days actually spent in a placement.
Distance Moved (est.)
Straight-line ("as the crow flies") distance between each consecutive mapped placement's zip code, added up across the whole case — not driving distance, and a zip code's geocoded center is itself already an approximation of the actual address. This is meant to give a general sense of scale, not a precise mileage figure. A move immediately before or after a "Not mapped" placement isn't counted, since there's no coordinate to measure from on that end.
How This Ends
The discharge_reason recorded for this child's most recent removal episode, grouped into a plain-language outcome (Reunified, Adopted, Guardianship/permanent relative placement, Aged out, Child died, Runaway, Case dismissed by court, or Case transferred to another agency). Reads "Still in care" if the most recent placement has no end date yet, or "Married"/"Entered military service" if the last placement's own end reason was one of those — Florida's discharge_reason field has no option for either, so those two outcomes can only be read from the placement-level field instead.
Maltreatment Codes
Every Y/N flag column on the placement-history table (physical abuse, neglect, domestic violence, and so on) that's marked "Y," grouped by removal episode — these flags are recorded per removal, not per placement, so a code only applies to the placements that share that removal_date.
Time Breakdown chart
Share of total placement-days spent in each placement category, plus one "Out of System — X" row per reason for the calendar gaps between mapped placements — the same gaps the map animation pauses on. If an administrative placeholder record (e.g. "Statewide Visitation Provider") actually covers the gap, X is that provider's name, spelled out from its all-caps form; otherwise X is inferred from the preceding placement's end reason (Reunification, Guardianship, Runaway, Aged Out, and so on). Those rows are informational only (there's no dot to highlight); click any other row to highlight that category's dots on the map.
Placement Endings chart
Count of placements (all rows, including "Not mapped" ones) grouped by placement_end_reason. Click a row to highlight the placements that ended that way on the map; this and the Time Breakdown filter are mutually exclusive — picking one clears the other.
Map, dots, and animation
Each dot is one placement, sized by length of stay, with color marking its category. Runaway episodes and placements with no usable zip code don't get their own dot or sequence number, but they aren't invisible — they still show up as an "Out of System" gap in the sequence, animation, and Time Breakdown chart, and are kept in the table below, marked "Not mapped." The Play/Reverse animation grows each dot over its own length of stay, fades completed dots to a trail, and pauses on an "Out of System" banner during those gaps. Playback has no maximum-length cap on purpose — a multi-year placement really does take minutes to play out at slower speeds, so the pacing reflects how long that stretch of time actually was. The scrubber jumps directly to any step if you don't want to wait it out.
Caregiver name anonymization
Any provider name recorded in "Last, First" format is treated as a personal name and abbreviated to initials (e.g. "Jones, Patricia" → "Pat. Jon."). Provider names without a comma (group homes, shelters, and other institutional providers) are shown as recorded.