Odoo 18 Website Auto-Translation
A locally hosted translation platform for an Odoo 18 university website, powered by Ollama and local models.
OstimGPT is a Retrieval-Augmented Generation chatbot built for OSTİM Technical University. It collects, processes, retrieves and presents information from university sources, with source citations, session management, monitoring dashboards and a layered set of security controls. I contributed across the retrieval pipeline, the caching and session layers, the operations tooling and the security hardening.
OstimGPT is a Retrieval-Augmented Generation chatbot developed for OSTİM Technical University. It answers questions using content drawn from the university’s own sources rather than from a general-purpose model’s training data, and it shows where each answer came from.
The system runs on locally hosted infrastructure. Everything from collecting source material to serving an answer happens inside the university’s environment, which shaped almost every technical decision on the project.
I worked on this as a member of the development team inside the Digital Transformation Coordination Office. My contributions concentrated on the data and retrieval pipeline, the caching and session layers, the monitoring and diagnostics tooling, and the security hardening of the public-facing endpoints.
A university publishes a large amount of information across many pages: admissions requirements, academic regulations, departmental details, announcements and procedures. That information is accurate but scattered, and finding a specific answer often means knowing which page to look on in the first place.
The Digital Transformation Coordination Office runs internal software projects for the university. OstimGPT was one of those projects: an assistant that could answer questions in natural language while staying anchored to the university’s published sources.
A general-purpose chatbot cannot answer institution-specific questions reliably, and a chatbot that answers confidently without evidence is worse than no chatbot at all in an academic setting. The system had to be grounded, traceable and safe to expose.
My Role
I developed the web crawler that collected content from the university website, added the validation and cleaning applied to that content, and improved retrieval quality by optimising how documents were divided into chunks. I implemented source citation support in responses and a response confidence indicator. I built the in-memory caching layer, user session management with automated session cleanup, and secure UUID-based session tracking. I created the monitoring and administration dashboards, added a health-check endpoint, and developed structured diagnostics and logging. On the security side I implemented request rate limiting, input validation against SQL injection, HTML sanitisation against cross-site scripting, script-injection blocking and per-IP request controls.
Team Context
OstimGPT was built by the software development team inside the university’s Digital Transformation Coordination Office, working in sprints under Scrum with CMMI-aligned process standards. I was one contributor on that team. The work described here is the portion I personally implemented; the surrounding platform, its deployment and its broader direction were the team’s shared work, reviewed collaboratively before merging.
The system follows a standard retrieval-augmented pattern, but most of the engineering effort sat in the parts around the model rather than in the model itself: getting clean source material in, dividing it usefully, returning evidence with the answer, and keeping the endpoint safe and observable.
A request flows through validation and rate limiting into a session-aware retrieval pipeline. University content is crawled, cleaned and chunked ahead of time; at query time the relevant chunks are retrieved and passed to a locally hosted language model, which returns an answer together with its source citations and a confidence indicator. Caching, structured logging and health checks sit alongside the request path and feed the monitoring dashboards.
Answers carry the sources they were drawn from, so a reader can verify a claim rather than trust it.
Responses expose a confidence signal, so a weak answer looks different from a strong one.
Collects university web content as the source material for retrieval.
Collected content is validated and cleaned before it can reach the retrieval layer.
Documents are divided so retrieved passages carry enough context without losing precision.
Repeated work is served from cache instead of being recomputed.
UUID-tracked sessions with automated cleanup of expired state.
Administration and monitoring views make the running system inspectable.
A health-check endpoint and structured logging support operational awareness.
Crawled web content arrives inconsistent — navigation fragments, duplicate boilerplate and partial extractions mixed in with the text that actually matters.
I added a validation and cleaning stage between collection and storage, so content is rejected or normalised before it can pollute retrieval. Fixing data quality at ingestion is far cheaper than compensating for it at query time.
Chunk size directly changes answer quality, and neither extreme works: large chunks dilute relevance, small chunks lose the context needed to answer.
I treated chunking as something to tune rather than configure once, adjusting how documents were divided and reviewing what the retrieval step actually returned for representative questions.
A chatbot endpoint accepts free-form text from anyone, which makes it an unusually broad input surface.
I treated input handling as part of the feature rather than a later hardening pass: validation against SQL injection, HTML sanitisation, script-injection blocking, rate limiting and per-IP controls were built into the request path.
Running locally meant there was no vendor dashboard to fall back on when something behaved unexpectedly.
I built the observability the project needed: a health-check endpoint, structured diagnostics and logging, and administration dashboards that made the system’s state visible without reading raw log files.
| Decision | Alternative considered | Why |
|---|---|---|
| Host the language model locally rather than calling a hosted API. | A commercial model API. | University content stays inside university infrastructure, and the system has no external dependency or per-request cost. The cost is that capacity and model choice are bounded by local hardware. |
| Return source citations with every answer. | Return the answer text alone. | In an academic setting an unverifiable answer has little value. Citations let a reader check the claim, and they make wrong retrieval visible instead of silent. |
| Add a response confidence indicator. | Present every response with the same weight. | Uniform presentation encourages uniform trust. Surfacing a confidence signal lets a reader calibrate, which matters most exactly when retrieval has found little to work with. |
| Use an in-memory cache rather than an external cache service. | A dedicated caching service. | It removed a moving part from a locally hosted deployment and was sufficient for the workload. The trade-off is that cached state does not survive a restart or scale across processes. |
The system answers questions from university sources and shows the sources it used, with a confidence signal attached to each response. Sessions are tracked and cleaned up automatically, and repeated work is served from cache.
The security controls I implemented — input validation, sanitisation, script-injection blocking, rate limiting and per-IP controls — are applied on the request path rather than bolted on afterwards.
The monitoring and administration dashboards, health-check endpoint and structured diagnostics give the team a way to see what the system is doing while it runs.

The chat widget in use: a question about OSTİM’s founding is answered from university sources, and the session closes itself after a period of inactivity.
Have a software, AI, RAG, or web application project in mind? Let’s discuss what you need and determine the right technical approach.