AI prompts
base on Photo, Chat and Sharing Community Server # circled.me community server
This project aims to help people easily backup and share photos, videos, albums on their own server. Focusing on performance, low footprint and ease of implementation and use.
The application is not dependant on any other service if you use the default SQLite DB engine. Currently SQLite and MySQL are supported for metadata storage.
After certain services that scan for faces, locations, etc, became paid some time ago, I have decided I'd rather be able to host my own photos.
The main reason being, of course, privacy! But also at that time, there was no alternatve that offered good performance and low CPU/memory usage.
Another focus of this project is having the ability to host everything a community needs to be able to communicate and exchange photos, ideas, etc.
I strongly believe in local/focused communities and sharing with the community, but at the same time - keeping everything private, within the community.
In my personal case, I share mostly photos with my family and close friends.
Logo is <a href="http://madebytow.com/">madebytow.com</a>
## Mobile app
The **circled.me** mobile app **works with multiple accounts and servers**. For example, you can have your family server and account, and your gaming/running/reading comunities' accounts on the same app and being able to interact with all of them at the same time. It is currently the only way to interface with the server. Go to https://circled.me to download it or go to the source repo here: https://github.com/circled-me/app
<img src="https://app.circled.me/screenshots.jpg"/>
___
⚠️ **NOTE: Please note that this project is still in development and could introduce breaking changes.**
⚠️ **WARNING: Do not use this as your main/only backup solution.**
___
## Main features:
- Fast response times and low CPU and memory footprint
- iOS and Android photo backup (using the circled.me app available on the AppStore and Google Play)
- Supports either locally mounted disks or
- S3-compatible Services - this allows different users to use their own S3 bucket on the same server
- Push notifications for new Album photos, etc
- Face detection and tagging
- Albums
- Adding local server contributors and viewers
- Sharing albums with anyone with a "secret" link
- Chat with push notifications
- Filtering photos by tagged person, year, month, location, etc
- Moments - automatically grouping photos by time and location
- Reverse geocoding for all assets
- Automatic video conversion to web-compatible H.264 format
## Compiling and Running the server
To compile the server you will need go 1.21 or above and simply build it within the cloned repository: `CGO_ENABLED=1 go build`.
The easiest way to try and run the server is to use the latest image available on Docker Hub, see example docker-compose file below.
The latest version of the server uses SQLite as default DB engine.
```bash
docker-compose -f docker-compose-example.yaml up
```
Now you can use the app and connect to your server at `http://<YOUR_IP>:8080` and create your first (admin) user.
Current configuration environment variables:
- `SQLITE_FILE` - location of the SQLite file. If non-existent, a new DB file will be created with the given name. Note that MySQL below takes precedence (if both configured)
- `MYSQL_DSN` - see example or refer to https://github.com/go-sql-driver/mysql#dsn-data-source-name
- `BIND_ADDRESS` - IP and port to bind to (incompatible with `TLS_DOMAINS`). This is useful if your server is, say, behind reverse proxy
- `TLS_DOMAINS` - a list of comma-separated domain names. This uses the Let's Encrypt Gin implementation (https://github.com/gin-gonic/autotls)
- `DEBUG_MODE` - currently defaults to `yes`
- `DEFAULT_BUCKET_DIR` - a directory that will be used as default bucket if no other buckets exist (i.e. the first time you run the server)
- `DEFAULT_ASSET_PATH_PATTERN` - the default path pattern to create subdirectories and file names based on asset info. Defaults to `<year>/<month>/<id>`
- `PUSH_SERVER` - the push server URL. Defaults to `https://push.circled.me`
- `FACE_DETECT` - enable/disable face detection. Defaults to `yes`
- `FACE_DETECT_CNN` - use Convolutional Neural Network for face detection (as opposed to HOG). Much slower, but more accurate at different angles. Defaults to `no`
- `FACE_MAX_DISTANCE_SQ` - squared distance between faces to consider them similar. Defaults to `0.11`
## docker-compose example
```yaml
version: '2'
services:
circled-server:
image: gubble/circled-server:latest
restart: always
ports:
- "8080:8080"
environment:
SQLITE_FILE: "/mnt/data1/circled.db"
BIND_ADDRESS: "0.0.0.0:8080"
DEFAULT_BUCKET_DIR: "/mnt/data1"
DEFAULT_ASSET_PATH_PATTERN: "<year>/<month>/<id>"
volumes:
- ./circled-data:/mnt/data1
```
The project includes an example docker-compose file with MySQL configuration.
", Assign "at most 3 tags" to the expected json: {"id":"3590","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"