
exif-photo-blog
Photo blog, reporting 🤓 EXIF camera details (aperture, shutter speed, ISO) for each image.
Stars: 1446

EXIF Photo Blog is a full-stack photo blog application built with Next.js, Vercel, and Postgres. It features built-in authentication, photo upload with EXIF extraction, photo organization by tag, infinite scroll, light/dark mode, automatic OG image generation, a CMD-K menu with photo search, experimental support for AI-generated descriptions, and support for Fujifilm simulations. The application is easy to deploy to Vercel with just a few clicks and can be customized with a variety of environment variables.
README:
https://github.com/sambecker/exif-photo-blog/assets/169298/4253ea54-558a-4358-8834-89943cfbafb4
- Built-in auth
- Photo upload with EXIF extraction
- Organize photos by tag
- Infinite scroll
- Light/dark mode
- Automatic OG image generation
- CMD-K menu with photo search
- AI-generated text descriptions
- RSS/JSON feeds
- Support for Fujifilm recipes and film simulations
- Click Deploy
- Add required storage (Vercel Postgres + Vercel Blob) as part of template installation
- Configure environment variable for production domain in project settings
-
NEXT_PUBLIC_DOMAIN
(e.g., photos.domain.com—used in absolute urls and seen in navigation if no explicit nav title is set)
-
-
Generate auth secret and add to environment variables:
AUTH_SECRET
- Add admin user to environment variables:
ADMIN_EMAIL
ADMIN_PASSWORD
- Trigger redeploy
- Visit project on Vercel, navigate to "Deployments" tab, click ••• button next to most recent deployment, and select "Redeploy"
- Visit
/admin
- Sign in with credentials supplied in Step 2
- Click "Upload Photos"
- Add optional title
- Click "Create"
If you don't plan to change the code, or don't mind making your updates public, consider forking this repo to easily receive future updates. If you've already set up your project on Vercel see these migration instructions.
- Clone code
- Run
pnpm i
to install dependencies - If necessary, install Vercel CLI and authenticate by running
vercel login
- Run
vercel link
to connect CLI to your project - Run
vercel dev
to start dev server with Vercel-managed environment variables
See FAQ for limitations of local development
Usage of this feature will result in fees from OpenAI. When enabling AI text generation, follow all recommended mitigations in order to avoid unexpected charges and attacks. Make sure your OpenAI secret key environment variable is not prefixed with NEXT_PUBLIC.
- Setup OpenAI
- If you don't already have one, create an OpenAI account and fund it (see this thread if you're having issues)
- Generate an API key and store in environment variable
OPENAI_SECRET_KEY
(make sure to enable Responses API write access if customizing permissions) - Setup usage limits to avoid unexpected charges (recommended)
- Add rate limiting (recommended)
- As an additional precaution, create an Upstash Redis store from the storage tab of the Vercel dashboard and link it to your project (if you are required to add an environment variable prefix, use
EXIF
) in order to enable rate limiting—no further configuration necessary
- As an additional precaution, create an Upstash Redis store from the storage tab of the Vercel dashboard and link it to your project (if you are required to add an environment variable prefix, use
- Configure auto-generated fields (optional)
- Set which text fields auto-generate when uploading a photo by storing a comma-separated list, e.g.,
AI_TEXT_AUTO_GENERATED_FIELDS = title,semantic
- Accepted values:
all
-
title
(default) caption
-
tags
(default) -
semantic
(default) none
- Set which text fields auto-generate when uploading a photo by storing a comma-separated list, e.g.,
Set OPENAI_BASE_URL
in order to use an alternate OpenAI-compatible provider
- Open project on Vercel
- Click "Analytics" tab
- Follow "Enable Web Analytics" instructions (
@vercel/analytics
already included)
- Open project on Vercel
- Click "Speed Insights" tab
- Follow "Enable Speed Insights" instructions (
@vercel/speed-insights
already included)
Application behavior can be changed by configuring the following environment variables:
-
NEXT_PUBLIC_META_TITLE
(seen in search results and browser tab) -
NEXT_PUBLIC_META_DESCRIPTION
(seen in search results) -
NEXT_PUBLIC_NAV_TITLE
(seen in top-right navigation, defaults to domain when not configured) -
NEXT_PUBLIC_NAV_CAPTION
(seen in top-right navigation, beneath title) -
NEXT_PUBLIC_PAGE_ABOUT
(seen in grid sidebar—accepts rich formatting tags:<b>
,<strong>
,<i>
,<em>
,<u>
,<br>
) -
NEXT_PUBLIC_DOMAIN_SHARE
(seen in share modals where a shorter url may be desirable)
⚠️ Enabling may result in increased project usage. Static optimization troubleshooting hints in FAQ.
-
NEXT_PUBLIC_STATICALLY_OPTIMIZE_PHOTOS = 1
enables static optimization for photo pages (p/[photoId]
), i.e., renders pages at build time -
NEXT_PUBLIC_STATICALLY_OPTIMIZE_PHOTO_OG_IMAGES = 1
enables static optimization for OG images, i.e., renders images at build time -
NEXT_PUBLIC_STATICALLY_OPTIMIZE_PHOTO_CATEGORIES = 1
enables static optimization for photo categories (tag/[tag]
,shot-on/[make]/[model]
, etc.), i.e., renders pages at build time -
NEXT_PUBLIC_STATICALLY_OPTIMIZE_PHOTO_CATEGORY_OG_IMAGES = 1
enables static optimization for photo category (tag/[tag]
,shot-on/[make]/[model]
, etc.) OG images, i.e., renders images at build time -
NEXT_PUBLIC_PRESERVE_ORIGINAL_UPLOADS = 1
prevents photo uploads being compressed before storing -
NEXT_PUBLIC_IMAGE_QUALITY = 1-100
controls the quality of large photos -
NEXT_PUBLIC_BLUR_DISABLED = 1
prevents image blur data being stored and displayed (potentially useful for limiting Postgres usage)
-
NEXT_PUBLIC_CATEGORY_VISIBILITY
- Comma-separated value controlling which photo sets appear in grid sidebar and CMD-K menu, and in what order. For example, you could move cameras above tags, and hide film simulations, by updating to
cameras,tags,lenses,recipes
. - Accepted values:
-
recents
(default) years
-
tags
(default) -
cameras
(default) -
lenses
(default) -
recipes
(default) -
films
(default) focal-lengths
-
- Comma-separated value controlling which photo sets appear in grid sidebar and CMD-K menu, and in what order. For example, you could move cameras above tags, and hide film simulations, by updating to
-
NEXT_PUBLIC_HIDE_CATEGORY_IMAGE_HOVERS = 1
prevents images displaying when hovering over category links: -
NEXT_PUBLIC_EXHAUSTIVE_SIDEBAR_CATEGORIES = 1
always shows expanded sidebar content -
NEXT_PUBLIC_HIDE_TAGS_WITH_ONE_PHOTO = 1
to only show tags with 2 or more photos
-
NEXT_PUBLIC_DEFAULT_SORT
- Sets default sort on grid/full homepages
- Accepted values:
-
taken-at
(default) taken-at-oldest-first
uploaded-at
uploaded-at-oldest-first
-
-
NEXT_PUBLIC_NAV_SORT_CONTROL
- Controls sort UI on grid/full homepages
- Accepted values:
none
-
toggle
(default) menu
- Color-based sorting (experimental)
-
NEXT_PUBLIC_SORT_BY_COLOR = 1
enables color-based sorting (forces nav sort control to "menu," flags photos missing color data in admin dashboard)—color identification benefits greatly from AI being enabled -
NEXT_PUBLIC_COLOR_SORT_STARTING_HUE
controls which colors start first (accepts a hue of 0 to 360, default: 80) -
NEXT_PUBLIC_COLOR_SORT_CHROMA_CUTOFF
controls which colors are considered sufficiently vibrant (accepts a chroma of 0 to 0.37, default: 0.05):
-
-
NEXT_PUBLIC_PRIORITY_BASED_SORTING = 1
takes priority field into account when sorting photos (⚠️ enabling may have performance consequences)
-
NEXT_PUBLIC_HIDE_KEYBOARD_SHORTCUT_TOOLTIPS = 1
hides keyboard shortcut hints in areas like the main nav, and previous/next photo links -
NEXT_PUBLIC_HIDE_EXIF_DATA = 1
hides EXIF data in photo details and OG images (potentially useful for portfolios, which don't focus on photography) -
NEXT_PUBLIC_HIDE_ZOOM_CONTROLS = 1
hides fullscreen photo zoom controls -
NEXT_PUBLIC_HIDE_TAKEN_AT_TIME = 1
hides taken at time from photo meta -
NEXT_PUBLIC_HIDE_REPO_LINK = 1
removes footer link to repo
-
NEXT_PUBLIC_GRID_HOMEPAGE = 1
shows grid layout on homepage -
NEXT_PUBLIC_GRID_ASPECT_RATIO = 1.5
sets aspect ratio for grid tiles (defaults to1
—setting to0
removes the constraint) -
NEXT_PUBLIC_SHOW_LARGE_THUMBNAILS = 1
ensures large thumbnails on photo grid views (if not configured, density is based on aspect ratio)
-
NEXT_PUBLIC_DEFAULT_THEME = light | dark
sets preferred initial theme (defaults tosystem
when not configured) -
NEXT_PUBLIC_MATTE_PHOTOS = 1
constrains the size of each photo, and displays a surrounding border, potentially useful for photos with tall aspect ratios (colors can be customized viaNEXT_PUBLIC_MATTE_COLOR
+NEXT_PUBLIC_MATTE_COLOR_DARK
)
-
NEXT_PUBLIC_GEO_PRIVACY = 1
disables collection/display of location-based data (⚠️ re-compresses uploaded images in order to remove GPS information) -
NEXT_PUBLIC_ALLOW_PUBLIC_DOWNLOADS = 1
enables public photo downloads for all visitors (⚠️ may result in increased bandwidth usage) -
NEXT_PUBLIC_SOCIAL_NETWORKS
- Comma-separated list of social networks to show in share modal
- Accepted values:
-
x
(default) threads
facebook
linkedin
all
none
-
-
NEXT_PUBLIC_SITE_FEEDS = 1
enables feeds at/feed.json
and/rss.xml
-
NEXT_PUBLIC_OG_TEXT_ALIGNMENT = BOTTOM
keeps OG image text bottom aligned (default is top)
Only one storage adapter—Vercel Blob, Cloudflare R2, AWS S3, or MinIO—can be used at a time. Ideally, this is configured before photos are uploaded (see Issue #34 for migration considerations). If you have multiple adapters, you can set one as preferred by storing aws-s3
, cloudflare-r2
, minio
, or vercel-blob
in NEXT_PUBLIC_STORAGE_PREFERENCE
. See FAQ regarding unsupported providers.
- Setup bucket
- Create R2 bucket with default settings
- Setup CORS under bucket settings:
[{ "AllowedHeaders": ["*"], "AllowedMethods": [ "GET", "PUT" ], "AllowedOrigins": [ "http://localhost:3000", "https://{VERCEL_PROJECT_NAME}*.vercel.app", "{PRODUCTION_DOMAIN}" ] }]
- Enable public hosting by doing one of the following:
- Select "Connect Custom Domain" and choose a Cloudflare domain
- OR
- Select "Allow Access" from R2.dev subdomain
- Store public configuration:
-
NEXT_PUBLIC_CLOUDFLARE_R2_BUCKET
: bucket name -
NEXT_PUBLIC_CLOUDFLARE_R2_ACCOUNT_ID
: account id (found on R2 overview page) -
NEXT_PUBLIC_CLOUDFLARE_R2_PUBLIC_DOMAIN
: either "your-custom-domain.com" or "pub-jf90908...s0d9f8s0s9df.r2.dev"
-
- Setup private credentials
- Create API token by selecting "Manage R2 API Tokens," and clicking "Create API Token"
- Select "Object Read & Write," choose "Apply to specific buckets only," and select the bucket created in Step 1
- Store credentials (
⚠️ Ensure access keys are not prefixed withNEXT_PUBLIC
):CLOUDFLARE_R2_ACCESS_KEY
CLOUDFLARE_R2_SECRET_ACCESS_KEY
- Setup bucket
- Create S3 bucket with "ACLs enabled," and "Block all public access" turned off
- Setup CORS under bucket permissions:
[{ "AllowedHeaders": ["*"], "AllowedMethods": [ "GET", "PUT" ], "AllowedOrigins": [ "http://localhost:*", "https://{VERCEL_PROJECT_NAME}*.vercel.app", "{PRODUCTION_DOMAIN}" ], "ExposeHeaders": [] }]
- Store public configuration
-
NEXT_PUBLIC_AWS_S3_BUCKET
: bucket name -
NEXT_PUBLIC_AWS_S3_REGION
: bucket region, e.g., "us-east-1"
-
- Setup private credentials
-
Create IAM policy using JSON editor:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:PutObjectACL", "s3:GetObject", "s3:ListBucket", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::{BUCKET_NAME}", "arn:aws:s3:::{BUCKET_NAME}/*" ] } ] }
-
Create IAM user by choosing "Attach policies directly," and selecting the policy created above. Create "Access key" under "Security credentials," choose "Application running outside AWS," and store credentials (
⚠️ Ensure access keys are not prefixed withNEXT_PUBLIC
):AWS_S3_ACCESS_KEY
AWS_S3_SECRET_ACCESS_KEY
-
Create IAM policy using JSON editor:
MinIO is a self-hosted S3-compatible object storage server.
First, install and deploy the MinIO server, then create a bucket with public read access.
-
Install MinIO: Follow official documentation to install and deploy MinIO.
-
Create bucket:
mc mb myminio/{BUCKET_NAME}
-
Set public read policy: Create file named
bucket-policy.json
with the following content to allow read-only access:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::{BUCKET_NAME}/*" ] } ] }
Next, apply this policy to your bucket:
mc policy set myminio/photos bucket-policy.json
-
Store public configuration: Set the following public environment variables for your application:
-
NEXT_PUBLIC_MINIO_BUCKET
: Bucket name -
NEXT_PUBLIC_MINIO_DOMAIN
: MinIO server endpoint, e.g., "minio.yourdomain.com" -
NEXT_PUBLIC_MINIO_PORT
: (optional) -
NEXT_PUBLIC_MINIO_DISABLE_SSL
: Set to1
to disable SSL (defaults to HTTPS)
-
Create a dedicated user and a policy that grants permission to manage objects within your BUCKET_NAME
.
-
Define user policy: Create file named
user-policy.json
. This policy will allow the user to list the bucket contents and to get, put, and delete objects within it.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:DeleteObject", "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::{BUCKET_NAME}/*", "arn:aws:s3:::{BUCKET_NAME}" ] } ] }
-
Create policy: Add named policy to MinIO.
mc admin policy add myminio photos-manager-policy user-policy.json
-
Create user: Create new user with access key and secret key.
mc admin user add myminio {MINIO_ACCESS_KEY} {MINIO_SECRET_ACCESS_KEY}
-
Attach policy to user: Assign
photos-manager-policy
to the user.mc admin policy set myminio photos-manager-policy user=MINIO_ACCESS_KEY
-
Store private credentials: Set the following private environment variables for your application.
⚠️ Ensure these access keys are not prefixed withNEXT_PUBLIC
.-
MINIO_ACCESS_KEY
: Your MINIO_ACCESS_KEY -
MINIO_SECRET_ACCESS_KEY
: Your MINIO_SECRET_ACCESS_KEY
-
Vercel Postgres can be switched to another Postgres-compatible, pooling provider by updating POSTGRES_URL
. Some providers only work when SSL is disabled, which can configured by setting DISABLE_POSTGRES_SSL = 1
.
- Ensure connection string is set to "Transaction Mode" via port
6543
- Disable SSL by setting
DISABLE_POSTGRES_SSL = 1
Partial internationalization (for non-admin, user-facing text) provided for a handful of languages. Configure locale by setting environment variable NEXT_PUBLIC_LOCALE
.
bd-bn
en-gb
en-us
id-id
pt-br
pt-pt
tr-tr
zh-cn
To add support for a new language, open a PR following instructions in /src/i18n/index.ts, using en-us.ts as reference.
Thank you ❤️ translators: @sconetto (pt-br
, pt-pt
), @brandnholl (id-id
), @TongEc (zh-cn
), @xahidex (bd-bn
, hi-in
), @mehmetabak (tr-tr
), @simondeeley (en-gb
)
For forked repos, click "Code," then "Update branch" from the main repo page. If you originally cloned the code, you can create a fork from GitHub, then update your Git connection from your Vercel project settings. Once you've done this, you may need to go to your project deployments page, click •••, select "Create deployment," and choose
main
.
In the admin menu, select "Batch edit ..." From there, you can perform bulk tag, favorite, and delete actions.
This template statically optimizes core views such as
/
and/grid
to minimize visitor load times. Consequently, when photos are added, edited, or removed, it might take several minutes for those changes to propagate. If it seems like a change is not taking effect, try navigating to/admin/configuration
and clicking "Clear Cache."
There have been reports (#184 + #185) that having large photos (over 30MB), or a CDN, e.g., Cloudflare in front of Vercel, may destabilize static optimization.
As the template has evolved, EXIF fields (such as lenses) have been added, blur data is generated through a different method, and AI/privacy features have been added. In order to bring older photos up to date, either click the 'sync' button next to a photo or go to photo updates (
/admin/photos/updates
) to sync all photos that need updates.
Many services such as iMessage, Slack, and X, require near-instant responses when unfurling link-based content. In order to guarantee sufficient responsiveness, consider rendering pages and image assets ahead of time by enabling static optimization by setting
NEXT_PUBLIC_STATICALLY_OPTIMIZE_PHOTOS = 1
andNEXT_PUBLIC_STATICALLY_OPTIMIZE_PHOTO_OG_IMAGES = 1
. Keep in mind that this will increase platform usage.
By default, all photos are shown full-width, regardless of orientation. Enable matting to showcase horizontal and vertical photos at similar scales by setting
NEXT_PUBLIC_MATTE_PHOTOS = 1
.
Thumbnail grid density (seen on
/grid
, tag overviews, and other photo sets) is dependent on aspect ratio configuration (ratios of 1 or less have more photos per row). This can be overridden by settingNEXT_PUBLIC_SHOW_LARGE_THUMBNAILS = 1
.
While all private paths (
/tag/private/*
) require authentication, raw links to individual photo assets remain publicly accessible. Randomly generated urls from storage providers are only secure via obscurity. Use with caution.
My images/content have fallen out of sync with my database and/or my production site no longer matches local development. What do I do?
Navigate to
/admin/configuration
and click "Clear Cache."
Navigate to
/admin/configuration
and click "Clear Cache." If this doesn't help, open an issue.
This template relies on
sharp
to manipulate images andnext/image
to serve them, neither of which currently support HEIC (https://github.com/vercel/next.js/discussions/30043 + https://github.com/lovell/sharp/issues/3981). Fortunately, you can still upload HEIC files directly from native share controls on Apple platforms and they will automatically be converted to JPG upon upload. If you think you have a viable HEIC strategy, feel free to open a PR. See https://github.com/sambecker/exif-photo-blog/issues/229 for discussion.
Absent configuration, the default grid aspect ratio is
1
.NEXT_PUBLIC_GRID_ASPECT_RATIO
can be set to any number (for instance,1.5
for 3:2 images) or ignored by setting to0
.
Fujifilm simulation data is stored in vendor-specific Makernote binaries embedded in EXIF data. Under certain circumstances an intermediary may strip out this data. For instance, there is a known issue on iOS where editing an image, e.g., cropping it, causes Makernote data loss. If simulation data appears to be missing, try importing the original file as it was stored by the camera. Additionally, if you can confirm the simulation mode, you can edit the photo and manually select it.
If you don't see a recipe, first try syncing your photo from the ••• menu, or from
/admin/photos
. If the data looks incorrect, open an issue with the file in question attached in order for it to be investigated. Fujifilm file specifications have evolved over time and recipe parsing may need to be adjusted based on camera model/vintage.
This can be accomplished by setting
NEXT_PUBLIC_CATEGORY_VISIBILITY
(which has a default value oftags,cameras,lenses,recipes,films
) totags,cameras,lenses
.
For a number of reasons, only EXIF orientations: 1, 3, 6, and 8 are supported. Orientations 2, 4, 5, and 7—which make use of mirroring—are not supported.
Earlier versions of this template generated blur data on the client, which varied visually from browser to browser. Data is now generated consistently on the server. If you wish to update blur data for a particular photo, edit the photo in question, make no changes, and choose "Update."
The default timeout for processing multiple uploads is 60 seconds (the limit for Hobby accounts). This can be extended to 5 minutes on Pro accounts by setting
maxDuration = 300
insrc/app/admin/uploads/page.tsx
.
You may need to pre-purchase credits before accessing the OpenAI API. See #110 for discussion. If you've customized key permissions, make sure write access to the Responses API is enabled.
Once AI text generation is configured, photos missing text will show up in photo updates (
/admin/photos/updates
).
At this time, there are no plans to introduce support for new storage providers. The template now supports Vercel Blob, AWS S3, Cloudflare R2, and MinIO (self-hosted S3-compatible storage). While configuring other AWS-compatible providers should not be too difficult, there's nuance to consider surrounding details like IAM, CORS, and domain configuration, which can differ slightly from platform to platform. If you'd like to contribute an implementation for a new storage provider, please open a PR.
At this time, an external storage provider is necessary in order to develop locally. If you have a strategy to propose which allows files to be locally uploaded and served to
next/image
in away that mirrors an external storage provider for debugging purposes, please open a PR.
Possibly. See #116 and #132 for discussion around image hosting and docker usage.
Previous versions of this template stored Next.js "App Router" files in
/src
, and app-level functionality in/src/site
. If you've made customizations and are having difficulty merging updates, consider moving/src/app
files to/
, and renamingsrc/site
to/src/app
. Other structural changes include movingtailwind.css
andmiddleware.ts
to/
. Additionally, it may be helpful to review PR #195 for an overview of the most significant changes.
For Tasks:
Click tags to check more tools for each tasksFor Jobs:
Alternative AI tools for exif-photo-blog
Similar Open Source Tools

exif-photo-blog
EXIF Photo Blog is a full-stack photo blog application built with Next.js, Vercel, and Postgres. It features built-in authentication, photo upload with EXIF extraction, photo organization by tag, infinite scroll, light/dark mode, automatic OG image generation, a CMD-K menu with photo search, experimental support for AI-generated descriptions, and support for Fujifilm simulations. The application is easy to deploy to Vercel with just a few clicks and can be customized with a variety of environment variables.

cursor-tools
cursor-tools is a CLI tool designed to enhance AI agents with advanced skills, such as web search, repository context, documentation generation, GitHub integration, Xcode tools, and browser automation. It provides features like Perplexity for web search, Gemini 2.0 for codebase context, and Stagehand for browser operations. The tool requires API keys for Perplexity AI and Google Gemini, and supports global installation for system-wide access. It offers various commands for different tasks and integrates with Cursor Composer for AI agent usage.

llm-vscode
llm-vscode is an extension designed for all things LLM, utilizing llm-ls as its backend. It offers features such as code completion with 'ghost-text' suggestions, the ability to choose models for code generation via HTTP requests, ensuring prompt size fits within the context window, and code attribution checks. Users can configure the backend, suggestion behavior, keybindings, llm-ls settings, and tokenization options. Additionally, the extension supports testing models like Code Llama 13B, Phind/Phind-CodeLlama-34B-v2, and WizardLM/WizardCoder-Python-34B-V1.0. Development involves cloning llm-ls, building it, and setting up the llm-vscode extension for use.

tiledesk-dashboard
Tiledesk is an open-source live chat platform with integrated chatbots written in Node.js and Express. It is designed to be a multi-channel platform for web, Android, and iOS, and it can be used to increase sales or provide post-sales customer service. Tiledesk's chatbot technology allows for automation of conversations, and it also provides APIs and webhooks for connecting external applications. Additionally, it offers a marketplace for apps and features such as CRM, ticketing, and data export.

Gemini-API
Gemini-API is a reverse-engineered asynchronous Python wrapper for Google Gemini web app (formerly Bard). It provides features like persistent cookies, ImageFx support, extension support, classified outputs, official flavor, and asynchronous operation. The tool allows users to generate contents from text or images, have conversations across multiple turns, retrieve images in response, generate images with ImageFx, save images to local files, use Gemini extensions, check and switch reply candidates, and control log level.

mcpdoc
The MCP LLMS-TXT Documentation Server is an open-source server that provides developers full control over tools used by applications like Cursor, Windsurf, and Claude Code/Desktop. It allows users to create a user-defined list of `llms.txt` files and use a `fetch_docs` tool to read URLs within these files, enabling auditing of tool calls and context returned. The server supports various applications and provides a way to connect to them, configure rules, and test tool calls for tasks related to documentation retrieval and processing.

langserve
LangServe helps developers deploy `LangChain` runnables and chains as a REST API. This library is integrated with FastAPI and uses pydantic for data validation. In addition, it provides a client that can be used to call into runnables deployed on a server. A JavaScript client is available in LangChain.js.

shortest
Shortest is an AI-powered natural language end-to-end testing framework built on Playwright. It provides a seamless testing experience by allowing users to write tests in natural language and execute them using Anthropic Claude API. The framework also offers GitHub integration with 2FA support, making it suitable for testing web applications with complex authentication flows. Shortest simplifies the testing process by enabling users to run tests locally or in CI/CD pipelines, ensuring the reliability and efficiency of web applications.

parsera
Parsera is a lightweight Python library designed for scraping websites using LLMs. It offers simplicity and efficiency by minimizing token usage, enhancing speed, and reducing costs. Users can easily set up and run the tool to extract specific elements from web pages, generating JSON output with relevant data. Additionally, Parsera supports integration with various chat models, such as Azure, expanding its functionality and customization options for web scraping tasks.

ChatDBG
ChatDBG is an AI-based debugging assistant for C/C++/Python/Rust code that integrates large language models into a standard debugger (`pdb`, `lldb`, `gdb`, and `windbg`) to help debug your code. With ChatDBG, you can engage in a dialog with your debugger, asking open-ended questions about your program, like `why is x null?`. ChatDBG will _take the wheel_ and steer the debugger to answer your queries. ChatDBG can provide error diagnoses and suggest fixes. As far as we are aware, ChatDBG is the _first_ debugger to automatically perform root cause analysis and to provide suggested fixes.

shell-pilot
Shell-pilot is a simple, lightweight shell script designed to interact with various AI models such as OpenAI, Ollama, Mistral AI, LocalAI, ZhipuAI, Anthropic, Moonshot, and Novita AI from the terminal. It enhances intelligent system management without any dependencies, offering features like setting up a local LLM repository, using official models and APIs, viewing history and session persistence, passing input prompts with pipe/redirector, listing available models, setting request parameters, generating and running commands in the terminal, easy configuration setup, system package version checking, and managing system aliases.

clickclickclick
ClickClickClick is a framework designed to enable autonomous Android and computer use using various LLM models, both locally and remotely. It supports tasks such as drafting emails, opening browsers, and starting games, with current support for local models via Ollama, Gemini, and GPT 4o. The tool is highly experimental and evolving, with the best results achieved using specific model combinations. Users need prerequisites like `adb` installation and USB debugging enabled on Android phones. The tool can be installed via cloning the repository, setting up a virtual environment, and installing dependencies. It can be used as a CLI tool or script, allowing users to configure planner and finder models for different tasks. Additionally, it can be used as an API to execute tasks based on provided prompts, platform, and models.

ethereum-etl-airflow
This repository contains Airflow DAGs for extracting, transforming, and loading (ETL) data from the Ethereum blockchain into BigQuery. The DAGs use the Google Cloud Platform (GCP) services, including BigQuery, Cloud Storage, and Cloud Composer, to automate the ETL process. The repository also includes scripts for setting up the GCP environment and running the DAGs locally.

python-tgpt
Python-tgpt is a Python package that enables seamless interaction with over 45 free LLM providers without requiring an API key. It also provides image generation capabilities. The name _python-tgpt_ draws inspiration from its parent project tgpt, which operates on Golang. Through this Python adaptation, users can effortlessly engage with a number of free LLMs available, fostering a smoother AI interaction experience.

rclip
rclip is a command-line photo search tool powered by the OpenAI's CLIP neural network. It allows users to search for images using text queries, similar image search, and combining multiple queries. The tool extracts features from photos to enable searching and indexing, with options for previewing results in supported terminals or custom viewers. Users can install rclip on Linux, macOS, and Windows using different installation methods. The repository follows the Conventional Commits standard and welcomes contributions from the community.
For similar tasks

exif-photo-blog
EXIF Photo Blog is a full-stack photo blog application built with Next.js, Vercel, and Postgres. It features built-in authentication, photo upload with EXIF extraction, photo organization by tag, infinite scroll, light/dark mode, automatic OG image generation, a CMD-K menu with photo search, experimental support for AI-generated descriptions, and support for Fujifilm simulations. The application is easy to deploy to Vercel with just a few clicks and can be customized with a variety of environment variables.

photoprism
PhotoPrism is an AI-powered photos app for the decentralized web. It uses the latest technologies to tag and find pictures automatically without getting in your way. You can run it at home, on a private server, or in the cloud.

album-ai
Album AI is an experimental project that uses GPT-4o-mini to automatically identify metadata from image files in the album. It leverages RAG technology to enable conversations with the album, serving as a photo album or image knowledge base to assist in content generation. The tool provides APIs for search and chat functionalities, supports one-click deployment to platforms like Render, and allows for integration and modification under a permissive open-source license.

home-gallery
Home-Gallery.org is a self-hosted open-source web gallery for browsing personal photos and videos with tagging, mobile-friendly interface, and AI-powered image and face discovery. It aims to provide a fast user experience on mobile phones and help users browse and rediscover memories from their media archive. The tool allows users to serve their local data without relying on cloud services, view photos and videos from mobile phones, and manage images from multiple media source directories. Features include endless photo stream, video transcoding, reverse image lookup, face detection, GEO location reverse lookups, tagging, and more. The tool runs on NodeJS and supports various platforms like Linux, Mac, and Windows.

spec-kit
Spec Kit is a tool designed to enable organizations to focus on product scenarios rather than writing undifferentiated code through Spec-Driven Development. It flips the script on traditional software development by making specifications executable, directly generating working implementations. The tool provides a structured process emphasizing intent-driven development, rich specification creation, multi-step refinement, and heavy reliance on advanced AI model capabilities for specification interpretation. Spec Kit supports various development phases, including 0-to-1 Development, Creative Exploration, and Iterative Enhancement, and aims to achieve experimental goals related to technology independence, enterprise constraints, user-centric development, and creative & iterative processes. The tool requires Linux/macOS (or WSL2 on Windows), an AI coding agent (Claude Code, GitHub Copilot, Gemini CLI, or Cursor), uv for package management, Python 3.11+, and Git.
For similar jobs

exif-photo-blog
EXIF Photo Blog is a full-stack photo blog application built with Next.js, Vercel, and Postgres. It features built-in authentication, photo upload with EXIF extraction, photo organization by tag, infinite scroll, light/dark mode, automatic OG image generation, a CMD-K menu with photo search, experimental support for AI-generated descriptions, and support for Fujifilm simulations. The application is easy to deploy to Vercel with just a few clicks and can be customized with a variety of environment variables.

obsidian-textgenerator-plugin
Text Generator is an open-source AI Assistant Tool that leverages Generative Artificial Intelligence to enhance knowledge creation and organization in Obsidian. It allows users to generate ideas, titles, summaries, outlines, and paragraphs based on their knowledge database, offering endless possibilities. The plugin is free and open source, compatible with Obsidian for a powerful Personal Knowledge Management system. It provides flexible prompts, template engine for repetitive tasks, community templates for shared use cases, and highly flexible configuration with services like Google Generative AI, OpenAI, and HuggingFace.

video2blog
video2blog is an open-source project aimed at converting videos into textual notes. The tool follows a process of extracting video information using yt-dlp, downloading the video, downloading subtitles if available, translating subtitles if not in Chinese, generating Chinese subtitles using whisper if no subtitles exist, converting subtitles to articles using gemini, and manually inserting images from the video into the article. The tool provides a solution for creating blog content from video resources, enhancing accessibility and content creation efficiency.

obsidian-weaver
Obsidian Weaver is a plugin that integrates ChatGPT/GPT-3 into the note-taking workflow of Obsidian. It allows users to easily access AI-generated suggestions and insights within Obsidian, enhancing the writing and brainstorming process. The plugin respects Obsidian's philosophy of storing notes locally, ensuring data security and privacy. Weaver offers features like creating new chat sessions with the AI assistant and receiving instant responses, all within the Obsidian environment. It provides a seamless integration with Obsidian's interface, making the writing process efficient and helping users stay focused. The plugin is constantly being improved with new features and updates to enhance the note-taking experience.

wordlift-plugin
WordLift is a plugin that helps online content creators organize posts and pages by adding facts, links, and media to build beautifully structured websites for both humans and search engines. It allows users to create, own, and publish their own knowledge graph, and publishes content as Linked Open Data following Tim Berners-Lee's Linked Data Principles. The plugin supports writers by providing trustworthy and contextual facts, enriching content with images, links, and interactive visualizations, keeping readers engaged with relevant content recommendations, and producing content compatible with schema.org markup for better indexing and display on search engines. It also offers features like creating a personal Wikipedia, publishing metadata to share and distribute content, and supporting content tagging for better SEO.

AI-Writing-Assistant
DeepWrite AI is an AI writing assistant tool created with the help of ChatGPT3. It is designed to generate perfect blog posts with utmost clarity. The tool is currently at version 1.0 with plans for further improvements. It is an open-source project, welcoming contributions. An extension has been developed for using the tool directly in Notepad, currently supported only on Calmly Writer. The tool requires installation and setup, utilizing technologies like React, Next, TailwindCSS, Node, and Express. For support, users can message the creator on Instagram. The creator, Sabir Khan, is an undergraduate student of Computer Science from Mumbai, known for frequently creating innovative projects.

AI-Assistant-ChatGPT
AI Assistant ChatGPT is a web client tool that allows users to create or chat using ChatGPT or Claude. It enables generating long texts and conversations with efficient control over quality and content direction. The tool supports customization of reverse proxy address, conversation management, content editing, markdown document export, JSON backup, context customization, session-topic management, role customization, dynamic content navigation, and more. Users can access the tool directly at https://eaias.com or deploy it independently. It offers features for dialogue management, assistant configuration, session configuration, and more. The tool lacks data cloud storage and synchronization but provides guidelines for independent deployment. It is a frontend project that can be deployed using Cloudflare Pages and customized with backend modifications. The project is open-source under the MIT license.

MarkFlowy
MarkFlowy is a lightweight and feature-rich Markdown editor with built-in AI capabilities. It supports one-click export of conversations, translation of articles, and obtaining article abstracts. Users can leverage large AI models like DeepSeek and Chatgpt as intelligent assistants. The editor provides high availability with multiple editing modes and custom themes. Available for Linux, macOS, and Windows, MarkFlowy aims to offer an efficient, beautiful, and data-safe Markdown editing experience for users.