diff --git a/Makefile b/Makefile index 92d8b6e..a5cb9b8 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,9 @@ BACKEND := backend FRONTEND := frontend PORT ?= 3000 DOCKER_USER ?= xprilion -VERSION ?= 0.2.0 +VERSION ?= 0.3.0 DOCKER_COMPOSE := docker compose +LOGO_SRC := assets/full-logo.png # ─── Setup ──────────────────────────────────────────────── @@ -240,6 +241,40 @@ docs-docker: ## Run docs in Docker (port 4000) docs-build: ## Build docs to site/docs/.vitepress/dist cd site && npx vitepress build docs +# ─── Logo Generation ───────────────────────────────────── + +.PHONY: logo +logo: ## Generate all logo sizes from assets/full-logo.png + @echo "Generating logo sizes from $(LOGO_SRC)..." + @mkdir -p $(FRONTEND)/public site/docs/public + @# Favicons for webapp + sips -z 16 16 $(LOGO_SRC) --out $(FRONTEND)/public/favicon-16x16.png + sips -z 32 32 $(LOGO_SRC) --out $(FRONTEND)/public/favicon-32x32.png + sips -z 180 180 $(LOGO_SRC) --out $(FRONTEND)/public/apple-touch-icon.png + sips -z 192 192 $(LOGO_SRC) --out $(FRONTEND)/public/logo-192.png + sips -z 512 512 $(LOGO_SRC) --out $(FRONTEND)/public/logo-512.png + @# Generate .ico from 32x32 (copy as favicon.ico for browsers) + cp $(FRONTEND)/public/favicon-32x32.png $(FRONTEND)/public/favicon.ico + @# Logo for header/nav + sips -z 64 64 $(LOGO_SRC) --out $(FRONTEND)/public/logo-64.png + @# OG image (1200x630 for social sharing - pad/crop as needed) + sips -z 630 630 $(LOGO_SRC) --out $(FRONTEND)/public/og-image-square.png + sips -p 630 1200 $(FRONTEND)/public/og-image-square.png --out $(FRONTEND)/public/og-image.png + rm $(FRONTEND)/public/og-image-square.png + @# Copy to docs site + cp $(FRONTEND)/public/favicon-16x16.png site/docs/public/ + cp $(FRONTEND)/public/favicon-32x32.png site/docs/public/ + cp $(FRONTEND)/public/favicon.ico site/docs/public/ + cp $(FRONTEND)/public/apple-touch-icon.png site/docs/public/ + cp $(FRONTEND)/public/logo-64.png site/docs/public/ + cp $(FRONTEND)/public/logo-192.png site/docs/public/ + cp $(FRONTEND)/public/logo-512.png site/docs/public/ + cp $(FRONTEND)/public/og-image.png site/docs/public/ + @# Full logo for README + cp $(LOGO_SRC) assets/logo.png + sips -z 200 200 $(LOGO_SRC) --out assets/logo-200.png + @echo "Done! Logo sizes generated in frontend/public/, site/docs/public/, and assets/" + # ─── Cleanup ───────────────────────────────────────────── .PHONY: clean diff --git a/README.md b/README.md index 5eabea9..01e9458 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ -# OpenMLR +
+
+
+ A self-hosted ML research agent that plans, researches, writes papers, and executes code — all in one conversation. +
[](https://render.com/deploy?repo=https://github.com/xprilion/OpenMLR) [](https://www.heroku.com/deploy?template=https://github.com/xprilion/OpenMLR) @@ -16,6 +22,7 @@ A self-hosted ML research agent that plans, researches, writes papers, and execu - **Plan + Execute modes** — Plan mode gathers context; Execute mode does the work. Toggle with `Cmd+M`. - **Paper research** — OpenAlex, Semantic Scholar, arXiv, CrossRef, Papers With Code. Reads full papers, crawls citation graphs. - **Paper writing** — Section-by-section drafting with auto-save. Export to Markdown/LaTeX. +- **Compute environments** — Execute code on local Docker, SSH remotes, or Modal cloud. Probe GPU/CPU capabilities. - **Background jobs** — Celery + Redis. Close the browser, come back later. - **Multi-provider LLMs** — OpenAI, Anthropic, OpenRouter, plus local models (Ollama, LM Studio). - **MCP servers** — Connect external tools via the Model Context Protocol. diff --git a/assets/full-logo.png b/assets/full-logo.png new file mode 100644 index 0000000..46280a1 Binary files /dev/null and b/assets/full-logo.png differ diff --git a/assets/logo-200.png b/assets/logo-200.png new file mode 100644 index 0000000..aa833a5 Binary files /dev/null and b/assets/logo-200.png differ diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000..46280a1 Binary files /dev/null and b/assets/logo.png differ diff --git a/backend/openmlr/app.py b/backend/openmlr/app.py index b150bfc..66f1d03 100644 --- a/backend/openmlr/app.py +++ b/backend/openmlr/app.py @@ -52,7 +52,7 @@ async def lifespan(app: FastAPI): app = FastAPI( title="OpenMLR", description="ML research intern — reads papers, trains models, writes papers", - version="2.0.0", + version="0.3.0", lifespan=lifespan, ) diff --git a/backend/openmlr/routes/health.py b/backend/openmlr/routes/health.py index 0ba4fc2..f4fea71 100644 --- a/backend/openmlr/routes/health.py +++ b/backend/openmlr/routes/health.py @@ -6,7 +6,7 @@ router = APIRouter(tags=["health"]) -VERSION = "0.1.0" +VERSION = "0.3.0" @router.get("/api/health") diff --git a/backend/pyproject.toml b/backend/pyproject.toml index f9a1a48..aebbc44 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openmlr" -version = "0.2.0" +version = "0.3.0" description = "OpenMLR — an ML research intern that reads papers, trains models, and ships code" requires-python = ">=3.12" license = { text = "MIT" } diff --git a/backend/tests/test_app.py b/backend/tests/test_app.py index 0137534..2a94fdc 100644 --- a/backend/tests/test_app.py +++ b/backend/tests/test_app.py @@ -12,7 +12,7 @@ async def test_app_title(self): assert app.title == "OpenMLR" async def test_app_version(self): - assert app.version == "2.0.0" + assert app.version == "0.3.0" async def test_app_routers_registered(self): route_paths = [r.path for r in app.routes] diff --git a/frontend/index.html b/frontend/index.html index 719cbfe..59a99c5 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,6 +4,31 @@
OpenMLR
ML Research Intern
+
+ ML Research Intern
+