evanca/firebase-storage
Use when setting up Storage, uploading/downloading files, managing metadata, handling errors, or applying security rules.
npx skills add https://github.com/evanca/flutter-ai-rules --skill firebase-storage
This skill defines how to correctly use Firebase Cloud Storage in Flutter applications.
Use this skill when:
flutter pub add firebase_storage
import 'package:firebase_storage/firebase_storage.dart';
final storage = FirebaseStorage.instance;
// Or specify a bucket explicitly:
// final storage = FirebaseStorage.instanceFor(bucket: "gs://BUCKET_NAME");
flutterfire configure to update your Firebase config with the default Storage bucket name.> Security note: By default, a Cloud Storage bucket requires Firebase Authentication for any action. Configuring public access may also make App Engine files publicly accessible — restrict access again when you set up Authentication.
Create a reference:
final storageRef = FirebaseStorage.instance.ref();
final fileRef = storageRef.child("uploads/file.jpg");
Upload:
final uploadTask = fileRef.putFile(file);
final snapshot = await uploadTask;
final downloadUrl = await snapshot.ref.getDownloadURL();
Download (in-memory):
final data = await fileRef.getData();
Download URL:
final downloadUrl = await fileRef.getDownloadURL();
Delete:
await fileRef.delete();
Get metadata:
final metadata = await fileRef.getMetadata();
print('Content type: ${metadata.contentType}');
print('Size: ${metadata.size}');
Update metadata:
final newMetadata = SettableMetadata(
contentType: "image/jpeg",
customMetadata: {'uploaded_by': 'user123'},
);
await fileRef.updateMetadata(newMetadata);
Use custom metadata to store additional key/value pairs with your files.
Use try-catch with FirebaseException. Key error codes:
| Code | Meaning |
|---|---|
| storage/object-not-found | File doesn't exist at the reference |
| storage/bucket-not-found | No bucket configured for Cloud Storage |
| storage/project-not-found | No project configured for Cloud Storage |
| storage/quota-exceeded | Storage quota exceeded |
| storage/unauthenticated | User needs to authenticate |
| storage/unauthorized | User lacks permission |
| storage/retry-limit-exceeded | Operation timeout exceeded |
quota-exceeded on the Spark plan, upgrade to Blaze.Monitor upload progress:
final uploadTask = fileRef.putFile(file);
uploadTask.snapshotEvents.listen((TaskSnapshot snapshot) {
print('Progress: ${(snapshot.bytesTransferred / snapshot.totalBytes) * 100}%');
});
uploadTask.cancel().uploadTask.pause() and uploadTask.resume().Take evanca/firebase-storage from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.