# jeremybrooks/jinx architecture

> Architecture diagram of the GitHub repository jeremybrooks/jinx, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/jeremybrooks/jinx
- Repository: https://github.com/jeremybrooks/jinx

## Overview

Jinx is a Java client library for Flickr’s API. An application configures the Jinx client with credentials and an OAuth token, invokes a domain-specific API class, and receives a typed response (or a JinxException); the client handles signed HTTP requests and JSON conversion. README documents broad coverage including photo search, upload/replace, authentication, groups, places, tags, statistics and push. Most domain API implementations are unsampled, so their links to the client and Flickr are documented rather than asserted from inspected calls.

Main entry points: [`src/main/java/net/jeremybrooks/jinx/Jinx.java`](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/Jinx.java) (Jinx client), [`src/main/java/net/jeremybrooks/jinx/api/PhotosApi.java`](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/api/PhotosApi.java) (Photo API), [`src/main/java/net/jeremybrooks/jinx/api/OAuthApi.java`](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/api/OAuthApi.java) (OAuth API), [`src/main/java/net/jeremybrooks/jinx/api/PhotosUploadApi.java`](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/api/PhotosUploadApi.java) (Photo upload)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Client core"]
  node_jinx["Jinx client<br/>[Jinx.java]"]
  node_constants["API constants<br/>[JinxConstants.java]"]
  node_errors["Jinx errors<br/>[JinxException.java]"]
  node_transport["Request utilities<br/>[JinxUtils.java]"]
  node_proxy["Proxy settings<br/>[JinxProxy.java]"]
  node_logger["Logging interface<br/>[LogInterface.java]"]
end

subgraph group_auth["Authentication"]
  node_oauthapi["OAuth API<br/>[OAuthApi.java]"]
  node_token["OAuth token"]
end

subgraph group_photo["Photo services"]
  node_photosapi["Photo API<br/>[PhotosApi.java]"]
  node_search["Photo search options"]
  node_upload["Photo upload"]
  node_photoextras["Photo utilities<br/>[PhotoUtils.java]"]
end

subgraph group_domains["Other Flickr APIs"]
  node_otherapis["Domain API modules"]
  node_prefs["Preferences API<br/>[PrefsApi.java]"]
end

subgraph group_models["Responses and utilities"]
  node_response["Response base<br/>[Response.java]"]
  node_photomodel["Photo response model<br/>[PhotoInfo.java]"]
  node_person["Person response model<br/>[Person.java]"]
  node_context["Photo context model<br/>[Context.java]"]
  node_contactsmodel["Contacts response model<br/>[Contacts.java]"]
end

node_app(("Java application"))
node_flickr{{"Flickr API"}}

node_app -->|"configures"| node_jinx
node_app -->|"requests OAuth"| node_oauthapi
node_app -->|"calls"| node_photosapi
node_app -->|"uploads media"| node_upload
node_app -->|"calls"| node_otherapis
node_jinx -->|"sends requests"| node_flickr
node_jinx -->|"uses"| node_transport
node_jinx -->|"uses endpoints"| node_constants
node_jinx -->|"throws"| node_errors
node_jinx -->|"parses into"| node_response
node_jinx -->|"logs through"| node_logger
node_jinx -->|"uses credentials"| node_token
node_oauthapi -->|"calls"| node_jinx
node_oauthapi -->|"requests tokens"| node_flickr
node_oauthapi -->|"exchanges token"| node_token
node_photosapi -.->|"uses client"| node_jinx
node_photosapi -.->|"accepts options"| node_search
node_photosapi -.->|"returns"| node_photomodel
node_upload -.->|"uses client"| node_jinx
node_upload -.->|"uploads media"| node_flickr
node_otherapis -.->|"uses client"| node_jinx
node_otherapis -.->|"calls endpoints"| node_flickr
node_prefs -->|"uses client"| node_jinx
node_prefs -->|"returns"| node_person
node_photomodel -->|"extends"| node_response
node_person -->|"extends"| node_response
node_context -->|"converts values"| node_transport
node_contactsmodel -->|"converts values"| node_transport
node_photosapi -.->|"uses"| node_photoextras
node_jinx -.->|"supports proxy"| node_proxy

click node_jinx "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/Jinx.java"
click node_constants "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/JinxConstants.java"
click node_errors "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/JinxException.java"
click node_transport "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/JinxUtils.java"
click node_proxy "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/JinxProxy.java"
click node_oauthapi "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/api/OAuthApi.java"
click node_token "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/OAuthAccessToken.java"
click node_photosapi "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/api/PhotosApi.java"
click node_search "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/response/photos/SearchParameters.java"
click node_upload "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/api/PhotosUploadApi.java"
click node_photoextras "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/PhotoUtils.java"
click node_otherapis "https://github.com/jeremybrooks/jinx/tree/master/src/main/java/net/jeremybrooks/jinx/api"
click node_prefs "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/api/PrefsApi.java"
click node_response "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/response/Response.java"
click node_photomodel "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/response/photos/PhotoInfo.java"
click node_person "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/response/people/Person.java"
click node_context "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/response/common/Context.java"
click node_contactsmodel "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/response/contacts/Contacts.java"
click node_logger "https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/logger/LogInterface.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_jinx,node_constants,node_errors,node_transport,node_proxy,node_logger toneBlue
class node_oauthapi,node_token toneAmber
class node_photosapi,node_search,node_upload,node_photoextras,node_flickr toneMint
class node_otherapis,node_prefs toneRose
class node_response,node_photomodel,node_person,node_context,node_contactsmodel,node_app toneIndigo
```

## Components

### Client core

- [Jinx client](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/Jinx.java): `src/main/java/net/jeremybrooks/jinx/Jinx.java`
- [API constants](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/JinxConstants.java): `src/main/java/net/jeremybrooks/jinx/JinxConstants.java`
- [Jinx errors](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/JinxException.java): `src/main/java/net/jeremybrooks/jinx/JinxException.java`
- [Request utilities](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/JinxUtils.java): `src/main/java/net/jeremybrooks/jinx/JinxUtils.java`
- [Proxy settings](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/JinxProxy.java): `src/main/java/net/jeremybrooks/jinx/JinxProxy.java`
- [Logging interface](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/logger/LogInterface.java): `src/main/java/net/jeremybrooks/jinx/logger/LogInterface.java`

### Authentication

- [OAuth API](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/api/OAuthApi.java): `src/main/java/net/jeremybrooks/jinx/api/OAuthApi.java`
- [OAuth token](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/OAuthAccessToken.java): `src/main/java/net/jeremybrooks/jinx/OAuthAccessToken.java`

### Photo services

- [Photo API](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/api/PhotosApi.java): `src/main/java/net/jeremybrooks/jinx/api/PhotosApi.java`
- [Photo search options](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/response/photos/SearchParameters.java): `src/main/java/net/jeremybrooks/jinx/response/photos/SearchParameters.java`
- [Photo upload](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/api/PhotosUploadApi.java): `src/main/java/net/jeremybrooks/jinx/api/PhotosUploadApi.java`
- [Photo utilities](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/PhotoUtils.java): `src/main/java/net/jeremybrooks/jinx/PhotoUtils.java`

### Other Flickr APIs

- [Domain API modules](https://github.com/jeremybrooks/jinx/tree/master/src/main/java/net/jeremybrooks/jinx/api): `src/main/java/net/jeremybrooks/jinx/api`
- [Preferences API](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/api/PrefsApi.java): `src/main/java/net/jeremybrooks/jinx/api/PrefsApi.java`

### Responses and utilities

- [Response base](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/response/Response.java): `src/main/java/net/jeremybrooks/jinx/response/Response.java`
- [Photo response model](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/response/photos/PhotoInfo.java): `src/main/java/net/jeremybrooks/jinx/response/photos/PhotoInfo.java`
- [Person response model](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/response/people/Person.java): `src/main/java/net/jeremybrooks/jinx/response/people/Person.java`
- [Photo context model](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/response/common/Context.java): `src/main/java/net/jeremybrooks/jinx/response/common/Context.java`
- [Contacts response model](https://github.com/jeremybrooks/jinx/blob/master/src/main/java/net/jeremybrooks/jinx/response/contacts/Contacts.java): `src/main/java/net/jeremybrooks/jinx/response/contacts/Contacts.java`

### Other components

- **Java application**
- **Flickr API**

## Connections

- Java application → Jinx client: configures
- Java application → OAuth API: requests OAuth
- Java application → Photo API: calls
- Java application → Photo upload: uploads media
- Java application → Domain API modules: calls
- Jinx client → Flickr API: sends requests (evidence: `src/main/java/net/jeremybrooks/jinx/Jinx.java`)
- Jinx client → Request utilities: uses (evidence: `src/main/java/net/jeremybrooks/jinx/Jinx.java`)
- Jinx client → API constants: uses endpoints (evidence: `src/main/java/net/jeremybrooks/jinx/Jinx.java`)
- Jinx client → Jinx errors: throws (evidence: `src/main/java/net/jeremybrooks/jinx/Jinx.java`)
- Jinx client → Response base: parses into (evidence: `src/main/java/net/jeremybrooks/jinx/Jinx.java`)
- Jinx client → Logging interface: logs through (evidence: `src/main/java/net/jeremybrooks/jinx/Jinx.java`)
- Jinx client → OAuth token: uses credentials (evidence: `src/main/java/net/jeremybrooks/jinx/Jinx.java`)
- OAuth API → Jinx client: calls (evidence: `src/main/java/net/jeremybrooks/jinx/api/OAuthApi.java`)
- OAuth API → Flickr API: requests tokens (evidence: `src/main/java/net/jeremybrooks/jinx/api/OAuthApi.java`)
- OAuth API → OAuth token: exchanges token (evidence: `src/main/java/net/jeremybrooks/jinx/api/OAuthApi.java`)
- Photo API → Jinx client: uses client (evidence: `src/main/java/net/jeremybrooks/jinx/api/PhotosApi.java`)
- Photo API → Photo search options: accepts options (evidence: `src/main/java/net/jeremybrooks/jinx/api/PhotosApi.java`)
- Photo API → Photo response model: returns (evidence: `src/main/java/net/jeremybrooks/jinx/api/PhotosApi.java`)
- Photo upload → Jinx client: uses client
- Photo upload → Flickr API: uploads media
- Domain API modules → Jinx client: uses client (evidence: `src/main/java/net/jeremybrooks/jinx/api/OAuthApi.java`)
- Domain API modules → Flickr API: calls endpoints
- Preferences API → Jinx client: uses client (evidence: `src/main/java/net/jeremybrooks/jinx/api/PrefsApi.java`)
- Preferences API → Person response model: returns (evidence: `src/main/java/net/jeremybrooks/jinx/api/PrefsApi.java`)
- Photo response model → Response base: extends (evidence: `src/main/java/net/jeremybrooks/jinx/response/photos/PhotoInfo.java`)
- Person response model → Response base: extends (evidence: `src/main/java/net/jeremybrooks/jinx/response/people/Person.java`)
- Photo context model → Request utilities: converts values (evidence: `src/main/java/net/jeremybrooks/jinx/response/common/Context.java`)
- Contacts response model → Request utilities: converts values (evidence: `src/main/java/net/jeremybrooks/jinx/response/contacts/Contacts.java`)
- Photo API → Photo utilities: uses
- Jinx client → Proxy settings: supports proxy (evidence: `src/main/java/net/jeremybrooks/jinx/Jinx.java`)
