{"id":25778758,"url":"https://github.com/stone/timelapser","last_synced_at":"2026-06-05T20:31:49.184Z","repository":{"id":278904129,"uuid":"937112573","full_name":"stone/timelapser","owner":"stone","description":"Tool to make timelapses from a series of images grabbed over http/https","archived":false,"fork":false,"pushed_at":"2025-02-22T12:39:53.000Z","size":24,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-22T13:22:37.839Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stone.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-22T11:15:39.000Z","updated_at":"2025-02-22T12:35:30.000Z","dependencies_parsed_at":"2025-02-22T13:22:46.191Z","dependency_job_id":"0dd39f6d-8789-464d-976c-3045ff886d6b","html_url":"https://github.com/stone/timelapser","commit_stats":null,"previous_names":["stone/timelapser"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stone%2Ftimelapser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stone%2Ftimelapser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stone%2Ftimelapser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stone%2Ftimelapser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stone","download_url":"https://codeload.github.com/stone/timelapser/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240990623,"owners_count":19889912,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-27T06:37:58.275Z","updated_at":"2025-02-27T06:37:58.899Z","avatar_url":"https://github.com/stone.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Timelapser\n\nCreate timelapses from HTTP-based camera snapshots. This tool periodically\nfetches images from HTTP cameras and compiles them into timelapse videos.\n\n## Quick Start\n\n1. Create a directory for your configuration and data:\n```bash\nmkdir -p timelapser\n```\n\n2. Create your configuration file at `config.yaml`:\n\n3. Create a `docker-compose.yml` file:\n```yaml\nservices:\n  timelapser:\n    image: ghcr.io/stone/timelapser:latest\n    container_name: timelapser\n    restart: unless-stopped\n    security_opt:\n      - no-new-privileges:true\n    environment:\n      - TZ=Europe/Stockholm\n    command: -config /app/config.yaml\n    volumes:\n      - ./timelapser:/timelapser:rw\n      - ./config.yaml:/app/config.yaml:ro\n    # Optional: set resource limits\n    mem_limit: 512m\n    cpus: 0.5\n    user: \"1000:1000\"\n```\n\n4. Start the service:\n```bash\ndocker compose up -d\n```\n\n## Configuration\n\n### Volume Mounts\n- `timelapser`: Directory where captured images and generated timelapses are stored\n- `/app/config.yaml`: Configuration file (mounted read-only)\n\n### Environment Variables\n- `TZ`: Timezone (default: Europe/Stockholm)\n\n\n# Configuration\n\n```yaml\ncameras:\n  - name: \"Riksgransen\"         # Name of the camera, if using spaces in name it will be converted: Hello world -\u003e helloWorld\n    snapshotUrl: \"https://..\"   # URL\n    auth:                       # If snapshotUrl need authentication\n      type: \"basic\"             # Can be basic or bearer\n      username: \"user\"          # Username (basic auth)\n      password: \"pass\"          # Password (basic auth)\n    interval: \"*/10 * * * *\"    # Snapshot interval cron expression\n    timelapseInterval: \"* 24,12 * * * *\" # Timelapse generaton cron expression interval\n    delete: true                # Delete snapshot images after timelapse generation\n    frameDuration: 0.041667     # Frame duration for each snapshot\n    ffmpeg_template: \"ffmpeg ... -i {{.ListPath}} ... -y {{.OutputPath}}\" # ffmpeg command used for timelapse generation.\n\n# Where to write snapshots and timelapses\noutputDir: \"/timelapser\"\n# Defaults used if not set per camera\ninterval: \"*/5 * * * *\"\ntimelapseInterval: \"* 24,12 * * * *\"\nframeDuration: 0.041667\nffmpeg_template: \"ffmpeg -f concat -safe 0 -i {{.ListPath}} -vf fps=24,format=yuv420p -c:v libx264 -preset medium -crf 23 -movflags +faststart -y {{.OutputPath}}\"\n```\n\n## Snapshot intervals and frame durations\n\nA good default is  0.04167\n\nFor a day (24 hours):\n- Snapshot interval: 1 minute\n- Duration per frame: 0.04167 (1/24 second)\n- Total frames: 1440\n- Final video length: ~60 seconds\n\nFor a week:\n- Snapshot interval: 5 minutes\n- Duration per frame: 0.04167\n- Total frames: 2016\n- Final video length: ~84 seconds\n\nFor a month:\n- Snapshot interval: 15 minutes\n- Duration per frame: 0.04167\n- Total frames: 2880\n- Final video length: ~120 seconds\n\nFor 6 months:\n- Snapshot interval: 1 hour\n- Duration per frame: 0.04167\n- Total frames: 4320\n- Final video length: ~180 seconds\n\nFor a year:\n- Snapshot interval: 2 hours\n- Duration per frame: 0.04167\n- Total frames: 4380\n- Final video length: ~183 seconds\n\nGives smooth playback at standard 24fps. If you want to adjust the final video\nlength, you can modify either the capture interval or the frame duration.\n\n0.08333 (1/12 second)\n- Creates a slightly slower, more contemplative feel\n\n0.0333 (1/30 second)\n- Slightly faster, more dynamic feel\n\n0.0208 (1/48 second)\n- Creates very smooth motion\n\nFor capture intervals, some alternative useful values:\n- 30 seconds: Good for fast-changing scenes like sunset/sunrise\n- 2 minutes: Nice for cloud movements\n- 10 minutes: Works well for construction sites\n- 3 hours: Good for seasonal changes\n- 4 hours: Nice for garden/plant growth\n- 12 hours: Captures day/night cycles effectively\n\n\n## How to integrate timelapser with Home Assistant\n\nIntegration with Home Assistant is easy by using the the Home Assistant Local\nMedia feautre.\n\n0 8 * * * mv /media/timelapse/*.mp4 /usr/share/hassio/media\n\nAfter this the timelapses are available every day at 8 AM UTC to be viewed using\nthe Local Media browser, or even better using the Gallery card like this:\n\n```yaml\ntype: 'custom:gallery-card'\nentities:\n  - path: 'media-source://media_source/media/'\n    recursive: true\nmenu_alignment: Hidden\nfile_name_format: '*.mp4'\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstone%2Ftimelapser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstone%2Ftimelapser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstone%2Ftimelapser/lists"}