Adding local data
Whether you are using Wrangler or the Cloudflare Vite plugin ↗, your workflow for accessing data during local development remains the same. However, you can only populate local resources with data via the Wrangler CLI.
When you run either wrangler dev or vite ↗, Miniflare automatically creates local versions of your resources (like KV, D1, or R2). This means you don’t need to manually set up separate local instances for each service. However, newly created local resources won’t contain any data — you'll need to use Wrangler commands with the --local flag to populate them. Changes made to local resources won’t affect production data.
When you first start developing, your local resources will be empty. You'll need to populate them with data using the Wrangler CLI.
npx wrangler kv key put <KEY> <VALUE> --binding=<BINDING> --localyarn wrangler kv key put <KEY> <VALUE> --binding=<BINDING> --localpnpm wrangler kv key put <KEY> <VALUE> --binding=<BINDING> --localnpx wrangler kv bulk put <FILENAME.json> --binding=<BINDING> --localyarn wrangler kv bulk put <FILENAME.json> --binding=<BINDING> --localpnpm wrangler kv bulk put <FILENAME.json> --binding=<BINDING> --localnpx wrangler r2 object put <BUCKET>/<KEY> --file=<PATH_TO_FILE> --localyarn wrangler r2 object put <BUCKET>/<KEY> --file=<PATH_TO_FILE> --localpnpm wrangler r2 object put <BUCKET>/<KEY> --file=<PATH_TO_FILE> --localYou may also include other metadata.
npx wrangler d1 execute <DATABASE_NAME> --command="<SQL_QUERY>" --localyarn wrangler d1 execute <DATABASE_NAME> --command="<SQL_QUERY>" --localpnpm wrangler d1 execute <DATABASE_NAME> --command="<SQL_QUERY>" --localnpx wrangler d1 execute <DATABASE_NAME> --file=./schema.sql --localyarn wrangler d1 execute <DATABASE_NAME> --file=./schema.sql --localpnpm wrangler d1 execute <DATABASE_NAME> --file=./schema.sql --localFor Durable Objects, unlike KV, D1, and R2, there are no CLI commands to populate them with local data. To add data to Durable Objects during local development, you must write application code that creates Durable Object instances and calls methods on them that store state. This typically involves creating development endpoints or test routes that initialize your Durable Objects with the desired data.
By default, both Wrangler and the Vite plugin store local binding data in the same location: the .wrangler/state folder in your project directory. This folder stores data in subdirectories for all local bindings: KV namespaces, R2 buckets, D1 databases, Durable Objects, etc.
You can delete the .wrangler/state folder at any time to reset your local environment, and Miniflare will recreate it the next time you run your dev command. You can also delete specific sub-folders within .wrangler/state for more targeted clean-up.
If you prefer to specify a different directory for local storage, you can do so through the Wranlger CLI or in the Vite plugin's configuration.
Use the --persist-to flag with wrangler dev. You need to specify this flag every time you run the dev command:
npx wrangler dev --persist-to <DIRECTORY>yarn wrangler dev --persist-to <DIRECTORY>pnpm wrangler dev --persist-to <DIRECTORY>Using --local with --persist-to
--local with --persist-toIf you run wrangler dev --persist-to <DIRECTORY> to specify a custom location for local data, you must also include the same --persist-to <DIRECTORY> when running other Wrangler commands that modify local data (and be sure to include the --local flag).
For example, to create a KV key named test with a value of 12345 in a local KV namespace, run:
npx wrangler kv key put test 12345 --binding MY_KV_NAMESPACE --local --persist-to worker-localyarn wrangler kv key put test 12345 --binding MY_KV_NAMESPACE --local --persist-to worker-localpnpm wrangler kv key put test 12345 --binding MY_KV_NAMESPACE --local --persist-to worker-localThis command:
- Sets the KV key
testto12345in the bindingMY_KV_NAMESPACE(defined in your Wrangler configuration file). - Uses
--persist-to worker-localto ensure the data is created in the worker-local directory instead of the default.wrangler/state. - Adds the
--localflag, indicating you want to modify local data.
If --persist-to is not specified, Wrangler defaults to using .wrangler/state for local data.
To customize where the Vite plugin stores local data, configure the persistState option in your Vite config file:
import { defineConfig } from "vite";import { cloudflare } from "@cloudflare/vite-plugin";
export default defineConfig({ plugins: [ cloudflare({ persistState: "./my-custom-directory", }), ],});If you want Wrangler and the Vite plugin to share the same state, configure them to use the same persistence path.
Was this helpful?
- Resources
- API
- New to Cloudflare?
- Products
- Sponsorships
- Open Source
- Support
- Help Center
- System Status
- Compliance
- GDPR
- Company
- cloudflare.com
- Our team
- Careers
- 2025 Cloudflare, Inc.
- Privacy Policy
- Terms of Use
- Report Security Issues
- Trademark