Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "Narev Development",
"name": "thin-ops Development",
"dockerComposeFile": "docker-compose.yaml",
"service": "dev",
"workspaceFolder": "/workspace",
Expand Down
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ LOG_FILE_PATH=logs/app.log
# ===================================
# API CONFIGURATION
# ===================================
API_TITLE=Narev Backend
API_TITLE=thin-ops Backend
API_DESCRIPTION=FOCUS 1.2 compliant billing data analyzer for cloud and SaaS providers
API_VERSION=0.2.7

Expand Down
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/config.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Discussions
url: https://github.com/narevai/narev/discussions
url: https://github.com/narevai/thin-ops/discussions
about: Ask questions and discuss ideas here
- name: Documentation
url: https://github.com/narevai/narev#readme
url: https://github.com/narevai/thin-ops#readme
about: Check the docs before reporting issues
2 changes: 1 addition & 1 deletion CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ representative at an online or offline event.

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
`opensource@narev.ai`.
`oss@narev.ai`.
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
Expand Down
10 changes: 5 additions & 5 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ We want you here. Especially if youre not a bot.

## Ways to Contribute

- **Report bugs** via [GitHub Issues](https://github.com/narevai/narev/issues)
- **Report bugs** via [GitHub Issues](https://github.com/narevai/thin-ops/issues)
- **Suggest features** for better AI cost tracking
- **Improve documentation**
- **Submit code changes**
- **Add test coverage**

### Before You Start

1. Check existing [issues](https://github.com/narevai/narev/issues) and [PRs](https://github.com/narevai/narev/pulls)
1. Check existing [issues](https://github.com/narevai/thin-ops/issues) and [PRs](https://github.com/narevai/thin-ops/pulls)
2. Read our [Code of Conduct](CODE_OF_CONDUCT.md)
3. For large changes, open an issue first to discuss

Expand All @@ -37,14 +37,14 @@ We want you here. Especially if youre not a bot.
1. Clone the repository

```bash
git clone https://github.com/narevai/narev.git
cd narev
git clone https://github.com/narevai/thin-ops.git
cd thin-ops
```

1. **Reopen in the dev container**
- When prompted, choose **Reopen in Container**, or
- Command Palette (Cmd/Ctrl+Shift+P): **Dev Containers: Reopen in Container**
- This project uses a single **Narev Development** configuration (see `.devcontainer/devcontainer.json`), backed by `.devcontainer/docker-compose.yaml`.
- This project uses a single **thin-ops Development** configuration (see `.devcontainer/devcontainer.json`), backed by `.devcontainer/docker-compose.yaml`.

2. **Environment file**
- Copy `.env.example` to `.env` if you do not have one yet.
Expand Down
41 changes: 17 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,44 +1,37 @@
# Narev
# ThinOps

![Narev Banner](./.github/assets/banner.webp)
![ThinOps Banner](./.github/assets/banner.webp)

## Convert any billing into FOCUS format

[![GitHub last commit](https://img.shields.io/github/last-commit/narevai/narev)](https://github.com/narevai/narev/commits)
[![Latest tag](https://img.shields.io/github/v/tag/narevai/narev?label=latest)](https://github.com/narevai/narev/tags)
[![Code Size](https://img.shields.io/github/languages/code-size/narevai/narev)](https://github.com/narevai/narev)
[![GitHub last commit](https://img.shields.io/github/last-commit/narevai/thin-ops)](https://github.com/narevai/thin-ops/commits)
[![Latest tag](https://img.shields.io/github/v/tag/narevai/thin-ops?label=latest)](https://github.com/narevai/thin-ops/tags)
[![Code Size](https://img.shields.io/github/languages/code-size/narevai/thin-ops)](https://github.com/narevai/thin-ops)
[![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)

Narev is an open source, self-hosted FinOps platform. It allows translating SaaS data into a FOCUS 1.2 format, and exporting it.
**thin-ops** is a self-hosted FinOps platform. It is built for tracking infrastructure spend and unifying it into a FOCUS format.

**Sources we support**:
![Narev Dashboard](./.github/assets/screenshot.png)

**Cloud platforms we support**:

- AWS
- Azure
- GCP
- OpenAI

**Exports we support**:

- Snowflake
- CSV
- Excel

We ship with lightweight FOCUS-compliant analytics.

![Narev Dashboard](./.github/assets/screenshot.png)

## Quick Start

### Demo Mode (with sample data)

```bash
docker run -d \
--name narev \
--name thin-ops \
-p 8000:8000 \
-v $(pwd)/data:/app/data \
-e DEMO="true" \
ghcr.io/narevai/narev:latest
ghcr.io/narevai/thin-ops:latest
```

Then open <http://localhost:8000>.
Expand All @@ -56,12 +49,12 @@ Then run the container with your generated key:

```bash
docker run -d \
--name narev-prod \
--name thin-ops \
-p 8000:8000 \
-v $(pwd)/data:/app/data \
-e ENCRYPTION_KEY="replace-with-your-generated-fernet-key" \
-e ENVIRONMENT="production" \
ghcr.io/narevai/narev:latest
ghcr.io/narevai/thin-ops:latest
```

Then open <http://localhost:8000>.
Expand All @@ -73,8 +66,8 @@ For a self-hosted install, you can also use Docker Compose:
```yaml
services:
narev:
image: ghcr.io/narevai/narev:latest
container_name: narev
image: ghcr.io/narevai/thin-ops:latest
container_name: thin-ops
ports:
- "8000:8000"
volumes:
Expand All @@ -95,9 +88,9 @@ Then open <http://localhost:8000>.

### Security

Narev does not include built-in authentication yet. For production use, run it behind a reverse proxy, VPN, SSO/auth proxy, or another trusted access layer. Avoid exposing the container directly to the public internet.
Thin-ops does not include built-in authentication yet. For production use, run it behind a reverse proxy, VPN, SSO/auth proxy, or another trusted access layer. Avoid exposing the container directly to the public internet.

- Full production setup in the [Deployment Guide](https://www.narev.ai/docs/opensource/getting-started/deployment).
- Full production setup in the [Deployment Guide](https://www.narev.ai/docs/narev-oss/getting-started/deployment).

## License

Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Security Policy

Report security vulnerabilities to **opensource@narev.ai**.
Report security vulnerabilities to **oss@narev.ai**.

Do not create public GitHub issues for security reports.
4 changes: 0 additions & 4 deletions backend/app/api/v1/config.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
"""
NarevAI Billing Analyzer - Config API v1
"""

from fastapi import APIRouter

from app.config import get_settings
Expand Down
4 changes: 0 additions & 4 deletions backend/app/api/v1/providers.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
"""
NarevAI Billing Analyzer - Providers API v1
"""

from uuid import UUID

from fastapi import APIRouter, Depends, HTTPException, Query, status
Expand Down
6 changes: 1 addition & 5 deletions backend/app/config.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
"""
NarevAI Billing Analyzer - Application Configuration
"""

from functools import lru_cache
from typing import Any

Expand Down Expand Up @@ -58,7 +54,7 @@ class Settings(BaseSettings):
log_file_path: str = Field(default="logs/app.log", description="Log file path")

# API Configuration
api_title: str = Field(default="NarevAI Billing Analyzer", description="API title")
api_title: str = Field(default="thin-ops Billing Analyzer", description="API title")
api_description: str = Field(
default="FOCUS 1.2 compliant billing data analyzer for cloud and SaaS providers",
description="API description",
Expand Down
4 changes: 0 additions & 4 deletions backend/app/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
"""
NarevAI Billing Analyzer - Models Package
"""

from app.models.billing_data import BillingData
from app.models.pipeline_run import PipelineRun
from app.models.provider import Provider, ProviderTestResult
Expand Down
4 changes: 0 additions & 4 deletions backend/app/models/billing_data.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
"""
NarevAI Billing Analyzer - FOCUS 1.2 compliant Billing Data Model
"""

from uuid import uuid4

from sqlalchemy import (
Expand Down
4 changes: 0 additions & 4 deletions backend/app/models/pipeline_run.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
"""
NarevAI Billing Analyzer - Pipeline Run Model
"""

from uuid import uuid4

from sqlalchemy import JSON, Column, DateTime, ForeignKey, Index, Integer, String, Text
Expand Down
4 changes: 0 additions & 4 deletions backend/app/models/provider.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
"""
NarevAI Billing Analyzer - Provider Model
"""

from typing import Any
from uuid import uuid4

Expand Down
6 changes: 1 addition & 5 deletions backend/main.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
"""
NarevAI Billing Analyzer - Main FastAPI Application
"""

import logging
import os
import subprocess
Expand Down Expand Up @@ -88,7 +84,7 @@ async def health_check():

@api.get("/api/")
async def api_root():
return {"message": "Hello from NarevAI API! 🚀", "status": "working"}
return {"message": "thin-ops API", "status": "working"}

@api.get("/api/test")
async def test_endpoint():
Expand Down
3 changes: 0 additions & 3 deletions backend/migrations/init.sql
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
-- NarevAI Billing Analyzer - Database Schema
-- FOCUS 1.2 Compliant Schema

-- Enable UUID extension for PostgreSQL
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Expand Down
3 changes: 0 additions & 3 deletions backend/migrations/init_sqlite.sql
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
-- NarevAI Billing Analyzer - SQLite Database Schema
-- FOCUS 1.2 Compliant Schema

-- Providers table
CREATE TABLE IF NOT EXISTS providers (
id TEXT PRIMARY KEY,
Expand Down
4 changes: 2 additions & 2 deletions backend/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ requires = ["setuptools>=45", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "narev-api"
name = "thin-ops-api"
version = "0.2.7"
description = "NarevAI - FOCUS billing data analyzer"
description = "thin-ops - selfhosted FinOps platform"
requires-python = ">=3.12,<3.13"
dependencies = [
"pydantic>=2.11.7",
Expand Down
9 changes: 2 additions & 7 deletions backend/test_api.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
"""
Manual API Testing Script for NarevAI Backend
Runs curl commands to test all main endpoints and validates responses.
"""

import json
import subprocess
import sys
Expand Down Expand Up @@ -494,7 +489,7 @@ def main():
"""Main function."""
import argparse

parser = argparse.ArgumentParser(description="Test NarevAI API endpoints")
parser = argparse.ArgumentParser(description="Test ThinOps API endpoints")
parser.add_argument(
"--url",
default="http://localhost:8000",
Expand All @@ -513,7 +508,7 @@ def main():
# Handle quiet vs verbose flags
verbose = args.verbose and not args.quiet

print("🧪 NarevAI API Test Suite")
print("ThinOps API Test Suite")
print(f"🌐 Testing API at: {args.url}")
if verbose or not args.quiet:
print(f"📅 Started at: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
Expand Down
8 changes: 4 additions & 4 deletions backend/test_api.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/bash

# NarevAI API Test Script
# ThinOps API Test Script
# Simple bash script to test all main endpoints with curl

set -e # Exit on any error
Expand All @@ -22,7 +22,7 @@ FAILED=0

# Helper functions
print_header() {
echo -e "${BLUE}🧪 NarevAI API Test Suite${NC}"
echo -e "${BLUE}🧪 ThinOps API Test Suite${NC}"
echo -e "${BLUE}🌐 Testing API at: $BASE_URL${NC}"
echo -e "${BLUE}📅 Started at: $(date)${NC}"
echo ""
Expand Down Expand Up @@ -311,7 +311,7 @@ main() {
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
echo "Usage: $0 [BASE_URL]"
echo ""
echo "Test NarevAI API endpoints"
echo "Test ThinOps API endpoints"
echo ""
echo "Arguments:"
echo " BASE_URL Base API URL (default: http://localhost:8000)"
Expand All @@ -326,4 +326,4 @@ if [[ "$1" == "-h" || "$1" == "--help" ]]; then
exit 0
fi

main "$@"
main "$@"
1 change: 0 additions & 1 deletion backend/tests/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ def test_api_root_endpoint(client):
response = client.get("/api/")
assert response.status_code == 200
data = response.json()
assert data["message"] == "Hello from NarevAI API! 🚀"
assert data["status"] == "working"


Expand Down
2 changes: 1 addition & 1 deletion backend/tests/unit/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def test_get_settings_default():

settings = Settings()

assert settings.api_title == "NarevAI Billing Analyzer"
assert settings.api_title == "thin-ops Billing Analyzer"
assert settings.environment == "production" # Real default from config
assert settings.debug is False # Default is False
assert settings.database_type == "sqlite"
Expand Down
2 changes: 1 addition & 1 deletion backend/uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions docs/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { defineConfig } from "vitepress";

const vitePressConfigs = {
srcDir: "src",
title: "Narev AI Documentation",
description: "Open source AI platform documentation",
title: "thin-ops AI Documentation",
description: "Open source FinOps platform documentation",
base: "/docs/",

sitemap: {
Expand Down Expand Up @@ -52,11 +52,11 @@ const vitePressConfigs = {
},
],

socialLinks: [{ icon: "github", link: "https://github.com/narevai/narev" }],
socialLinks: [{ icon: "github", link: "https://github.com/narevai/thin-ops" }],

editLink: {
pattern:
"https://github.com/narevai/narev/issues/new?title=Documentation%20feedback:%20:path&body=**Page:**%20https://narev.ai/:path%0A%0A**Feedback:**%0A%0A<!-- Please describe your feedback about this documentation page -->",
"https://github.com/narevai/thin-ops/issues/new?title=Documentation%20feedback:%20:path&body=**Page:**%20https://narev.ai/:path%0A%0A**Feedback:**%0A%0A<!-- Please describe your feedback about this documentation page -->",
text: "❓ Something unclear?",
},
},
Expand Down
Loading