
Here Now
Manage Here.now cloud drives from the terminal—upload, sync folders, share read/write tokens, and prune files without building a custom admin UI.
Overview
Here Now is an agent skill for the Operate phase that runs the Here.now drive.sh CLI to create drives, sync files, share scoped tokens, and manage remote storage from the shell.
Install
npx skills add https://github.com/heredotnow/skill --skill here-nowWhat is this skill?
- Bash drive.sh CLI with create, ls, cat, put, import, export, and rm (optional recursive confirm)
- Share drives with read/write perms, TTL, prefix scope, and token list/revoke
- Auth via HERENOW_API_KEY, HERENOW_DRIVE_TOKEN, or ~/.herenow/credentials
- 500 MB per-file upload cap and optional non-default API base URL
- Bundled or system jq plus curl for JSON API workflows
- 500 MB max file size per upload
- Commands: create, ls, put, import, export, share, tokens, revoke, delete
Adoption & trust: 8.4k installs on skills.sh; 31 GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need to upload, list, share, or bulk-sync files on Here.now without writing one-off curl scripts or logging into a web console every time.
Who is it for?
Solo builders automating artifact storage, shared asset folders, or tokenized read-only links on Here.now during ship and operate.
Skip if: Teams that only need local git LFS or S3 SDK code inside the app—the skill is CLI operations, not in-app Dart/Flutter storage APIs.
When should I use this skill?
You need to create or manage Here.now drives, move files between local disk and cloud prefixes, or issue scoped share tokens from the agent session.
What do I get? / Deliverables
Your agent executes documented drive.sh commands with correct auth and confirmation flags so remote folders and access tokens stay consistent with your local repo or release process.
- Uploaded or exported file trees on Here.now
- Share URLs or token records with chosen perms and TTL
- Updated drive listing or emptied prefix after confirmed rm
Recommended Skills
Journey fit
Canonical shelf is Operate because the skill wraps production drive lifecycle (share tokens, revoke access, delete drives) after you are already shipping artifacts. Infra fits remote object storage, credential files, and API-backed file operations that keep solo builders’ assets hosted and permissioned.
How it compares
Use as a scripted Here.now operator instead of hand-written curl against undocumented endpoints.
Common Questions / FAQ
Who is here-now for?
Indie developers and agent users who already use Here.now drives and want terminal-first create, sync, share, and cleanup from their AI coding session.
When should I use here-now?
Use it in Operate when rotating share tokens or deleting drives; in Ship when importing build outputs; in Build when seeding integration test fixtures to a shared drive prefix.
Is here-now safe to install?
Review the Security Audits panel on this Prism page before installing; the skill runs shell commands with network access and can read API keys from your home directory.
SKILL.md
READMESKILL.md - Here Now
#!/usr/bin/env bash set -euo pipefail BASE_URL="https://here.now" CREDENTIALS_FILE="$HOME/.herenow/credentials" API_KEY="${HERENOW_API_KEY:-}" DRIVE_TOKEN="${HERENOW_DRIVE_TOKEN:-}" ALLOW_NON_HERENOW_BASE_URL=0 MAX_FILE_BYTES=$((500 * 1024 * 1024)) usage() { cat <<'USAGE' Usage: drive.sh [global options] <command> [args] Global options: --api-key <key> Account API key (or $HERENOW_API_KEY / ~/.herenow/credentials) --token <drv_live_...> Drive token (or $HERENOW_DRIVE_TOKEN) --base-url <url> API base (default: https://here.now) --allow-nonherenow-base-url Commands: create [name] [--default] default ls ls <drive> [prefix] cat <drive> <path> put <drive> <path> --from <local-file> import <drive> <prefix> --from <local-folder> [--dry-run] export <drive> <prefix> --to <local-folder> [--dry-run] rm <drive> <path> [--recursive --confirm <path>] share <drive> --perms read|write [--prefix notes/] [--ttl 30d] [--label text] [--manage-tokens] tokens <drive> revoke <drive> <tokenId> delete <drive> --confirm "<drive name>" USAGE exit 1 } die() { echo "error: $1" >&2; exit 1; } SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SKILL_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" BUNDLED_JQ="${SKILL_DIR}/bin/jq" if [[ -x "$BUNDLED_JQ" ]]; then JQ_BIN="$BUNDLED_JQ" elif command -v jq >/dev/null 2>&1; then JQ_BIN="$(command -v jq)" else die "requires jq" fi for cmd in curl file; do command -v "$cmd" >/dev/null 2>&1 || die "requires $cmd" done while [[ $# -gt 0 ]]; do case "$1" in --api-key) API_KEY="$2"; shift 2 ;; --token) DRIVE_TOKEN="$2"; shift 2 ;; --base-url) BASE_URL="$2"; shift 2 ;; --allow-nonherenow-base-url) ALLOW_NON_HERENOW_BASE_URL=1; shift ;; --help|-h) usage ;; --*) die "unknown global option: $1" ;; *) break ;; esac done CMD="${1:-}" [[ -n "$CMD" ]] || usage shift || true if [[ -z "$API_KEY" && -z "$DRIVE_TOKEN" && -f "$CREDENTIALS_FILE" ]]; then API_KEY=$(tr -d '[:space:]' < "$CREDENTIALS_FILE") fi BASE_URL="${BASE_URL%/}" if [[ "$BASE_URL" != "https://here.now" && "$ALLOW_NON_HERENOW_BASE_URL" -ne 1 ]]; then if [[ -n "$API_KEY" || -n "$DRIVE_TOKEN" ]]; then die "refusing to send credentials to non-default base URL; pass --allow-nonherenow-base-url to override" fi fi auth_header=() if [[ -n "$DRIVE_TOKEN" ]]; then auth_header=(-H "authorization: Bearer $DRIVE_TOKEN") elif [[ -n "$API_KEY" ]]; then auth_header=(-H "authorization: Bearer $API_KEY") else die "missing credentials; set HERENOW_API_KEY, HERENOW_DRIVE_TOKEN, or ~/.herenow/credentials" fi compute_sha256() { local f="$1" if command -v sha256sum >/dev/null 2>&1; then sha256sum "$f" | cut -d' ' -f1 else shasum -a 256 "$f" | cut -d' ' -f1 fi } guess_content_type() { local f="$1" case "${f##*.}" in html|htm) echo "text/html; charset=utf-8" ;; css) echo "text/css; charset=utf-8" ;; js|mjs) echo "text/javascript; charset=utf-8" ;; json) echo "application/json; charset=utf-8" ;; md|txt) echo "text/plain; charset=utf-8" ;; svg) echo "image/svg+xml" ;; png) echo "image/png" ;; jpg|jpeg) echo "image/jpeg" ;; gif) echo "image/gif" ;; webp) echo "image/webp" ;; pdf) echo "application/pdf" ;; *) file --brief --mime-type "$f" 2>/dev/null || echo "application/octet-stream" ;; esac } api_json() { local method="$1"; shift local url="$1"; shift local body="${1:-}" local tmp tmp=$(mktemp) local code if [[ -n "$body" ]]; then code=$(curl -sS -o "$tmp" -w "%{http_code}" -X "$method" "$url" "${auth_header[@]}" -H "content-type: application/json" -d "$body") else code=$(curl -sS -o "$tmp" -w "%{http_code}" -X "$method" "$url" "${auth_header[@]}") fi if [[ "$code" -lt 200 || "$code" -ge 300 ]]; then local err err=$("$JQ_BIN" -r '.error // empty' "$tmp" 2>/dev/null || true) [[ -n "$err" ]] || err="$(cat "$tmp")" rm -f "$tmp" die "HTTP $code: $err" fi cat