# Offline use and refreshing data

**Goal:** control when zfin talks to the network -- force a full
refresh, work entirely offline, or rely on normal cache freshness.

zfin caches every fetch under `~/.cache/zfin` (override with
`ZFIN_CACHE_DIR`) and reuses it until it goes stale. The global
`--refresh-data` flag overrides that policy for a single run.

## The three policies

`--refresh-data` must appear **before** the subcommand:

```bash
zfin --refresh-data=auto   portfolio     # default
zfin --refresh-data=force  perf VTI
zfin --refresh-data=never  analysis
```

| Value            | Behavior                                                                                                      |
|------------------|---------------------------------------------------------------------------------------------------------------|
| `auto` (default) | Respect each data type's cache TTL; fetch only what's stale.                                                  |
| `force`          | Re-fetch every symbol regardless of freshness. Use after a market close, or when you suspect bad cached data. |
| `never`          | Serve cache contents only; make no network calls. True offline mode.                                          |

## Working offline

`--refresh-data=never` is the way to run on a plane or to get
deterministic output from already-cached data. Anything not in the
cache simply isn't shown:

```bash
ZFIN_HOME=examples/pre-retirement-both zfin --refresh-data=never analysis
```

Note that **quotes are never cached** (they're meant to be live), so
in `never` mode the [`quote`](../reference/cli/quote.md) command has
nothing to serve and reports the symbol as unavailable. Price-history
commands like [`perf`](../reference/cli/perf.md) and
[`portfolio`](../reference/cli/portfolio.md) work fine offline once
their candles are cached.

## How freshness works

In `auto` mode, each data type has its own time-to-live:

| Data               | TTL                                            |
|--------------------|------------------------------------------------|
| Daily candles      | ~24 hours                                      |
| Dividends / splits | 14 days                                        |
| Options            | 1 hour                                         |
| Earnings           | 30 days (refreshed early once a result is due) |
| ETF profiles       | ~30 days                                       |
| Quotes             | never cached                                   |

So a second `portfolio` run the same day is instant and network-free
without any flag. For the full rationale, see
[Caching and data freshness](../explanation/caching.md).

## Inspecting and clearing the cache

```bash
zfin cache stats      # what's cached, sizes, and ages
zfin cache clear      # delete all cached data
```

`cache clear` is safe -- everything re-fetches on the next run (subject
to provider rate limits). Reach for it only when you suspect corrupt
cached data; normal staleness is handled by `auto`. See
[`zfin cache`](../reference/cli/cache.md).

## See also

- [Caching and data freshness](../explanation/caching.md) -- the why.
- [Data providers and API keys](../reference/providers.md) -- rate limits that shape `force` runs.
- [Environment variables](../reference/config/environment.md) -- `ZFIN_CACHE_DIR`, `ZFIN_SERVER`.

---

[Previous: Customize the TUI](customize-the-tui.md) | [Documentation home](../README.md)
