| Title: | Garage-Conversion and ADU Building Permit Timeline Data for Four U.S. Cities |
|---|---|
| Description: | Provides reproducible access to prepared public building-permit records measuring how long residential garage-to-accessory-dwelling-unit (ADU) and garage-to-habitable-room conversion permits waited between application and issuance in Los Angeles, San Diego, San Francisco, and Seattle. Includes one row per unique application with the measured wait, application-year cohort completion rates, and small-cell-suppressed timeline aggregates, prepared from each city's official open-data portal with a committed, dependency-free build script. |
| Authors: | Assaf Ichaki [aut, cre] |
| Maintainer: | Assaf Ichaki <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 0.1.1 |
| Built: | 2026-08-24 13:41:30 UTC |
| Source: | https://github.com/asafichaki/permittimelines |
R access to prepared public building-permit records measuring how long residential garage-to-ADU and garage-to-habitable-room conversion permits waited between application and issuance in Los Angeles, San Diego, San Francisco, and Seattle.
Loads, for each city and application year, how many cleaned applications were submitted, how many had an issued permit at retrieval time, and the resolved share. Cohorts are always formed on the application year, never the issue year: a large share of permits issued in any given year were filed earlier, so issue-year grouping oversamples slow permits.
permit_cohorts(city = NULL)permit_cohorts(city = NULL)
city |
Optional city slug filter, as in |
A data frame with one row per city and application year from 2015 onward
with at least 30 cleaned applications; earlier or thinner city-years are
present in permit_records but carry no cohort row.
publishable is TRUE once a cohort has at least 30 applications
and at least 75 percent of them resolved; younger cohorts are censored
toward fast permits and must not be aggregated.
cohorts <- permit_cohorts("los-angeles") cohorts[, c("year", "submitted", "issued", "resolved")]cohorts <- permit_cohorts("los-angeles") cohorts[, c("year", "submitted", "issued", "resolved")]
Returns the authoritative city open-data sources, the prepared interactive dataset page, repository, license, version, retrieval date, the method constants used to build the bundled files, the interpretation caveats that must accompany any published use, and citation information.
permit_metadata()permit_metadata()
A named list containing the four city sources, the prepared interactive dataset, repository, license, version, retrieval date, method constants, interpretation caveats, and recommended citation.
permit_metadata()$caveatspermit_metadata()$caveats
Loads one row per unique residential garage-conversion permit application in
Los Angeles, San Diego, San Francisco, and Seattle. Applications whose permit
had been issued when the records were retrieved carry the measured wait in
days; applications with an empty issued_date had no issued permit at
retrieval time, which may mean a stalled review or an abandoned project. The
source records do not distinguish the two, and none of them are marked
denied.
permit_records(city = NULL)permit_records(city = NULL)
city |
Optional city slug to filter on: one of |
A data frame with one row per unique application. project is
"adu" or "habitable-room". in_mature_cohort flags the
issued rows inside the city's aggregate window (see
permit_timelines).
records <- permit_records() table(records$city, records$project)records <- permit_records() table(records$city, records$project)
Loads percentile waits and within-N-days shares for each city, computed over
the city's mature cohort window (its last four publishable application-year
cohorts, listed in mature_years). Cells with fewer than 30 records are
suppressed: suppressed is TRUE and every statistic is
NA. Percentile columns are lower-tail order statistics of the sorted
waits (quantile type 1, no interpolation), matching the published interactive
explorer; for even-sized groups the median is the upper of the two central
observations.
Aggregates are reported separately per review track, project type, and permit type group. Never pool review tracks into one median: both tracks of a city can get faster while the pooled median rises, purely from a mix shift.
permit_timelines(city = NULL)permit_timelines(city = NULL)
city |
Optional city slug filter, as in |
A data frame with one row per aggregate cell. dimension names the
grouping ("overall", "review_track", "project",
"permit_type_group", "project_and_permit_type") and
group the cell inside it.
timelines <- permit_timelines("los-angeles") subset(timelines, dimension == "review_track" & !suppressed)timelines <- permit_timelines("los-angeles") subset(timelines, dimension == "review_track" & !suppressed)