Back to blog
Mobile Development

NOTEorious App: Advanced Note-Taking with AI & OCR Technology

Deep dive into the development of NOTEorious, a cutting-edge note-taking application featuring LexifAI integration, OCR capabilities, 3D backgrounds, and IP logging functionality.

May 18, 2025|6 min read|Talal Alkhaled
FlutterOCRLexifAIMobileSenior Design
01

A capstone with a real client

NOTEorious was my Computer Engineering senior design project at Michigan State University, built for a real client rather than a grading rubric. The brief asked for a cross-platform notes app with OCR text extraction, handwriting recognition, AI-powered enhancement, and cloud sync. What started as a note-taking app grew into a full AI platform.

02

Flutter as the foundation

Flutter won the framework decision because one Dart codebase ships to both iOS and Android with native 60 fps rendering. The dependency list tells the story of the app: camera and image picker for capture, Firebase for auth and sync, and Google ML Kit working alongside custom models for recognition. Hot reload kept the build moving quickly.

pubspec.yaml
# pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
  camera: ^0.10.5
  image_picker: ^0.8.7
  firebase_core: ^2.13.0
  firebase_auth: ^4.6.1
  cloud_firestore: ^4.7.1
  google_ml_kit: ^0.13.0
03

The AI layer

The heart of the app is LexifAI, a custom OCR engine that reaches over 95 percent accuracy across PDFs and photos, with preprocessing that analyzes document structure before extracting a word. Handwriting converts to text in real time, and an integrated assistant summarizes and enhances notes after capture. All of it is tuned to run within a phone's memory and battery budget.

04

Backend and sync

An Express and MongoDB backend keeps notes synchronized across devices. The hard part was offline: edits made without a connection queue locally and reconcile automatically, with conflict resolution deciding what wins when two devices touch the same note. Version history keeps every mistake recoverable.

server/routes/notes.js
// Express.js notes endpoint
app.post('/api/notes', authenticate, async (req, res) => {
  try {
    const note = new Note({
      userId: req.user.id,
      title: req.body.title,
      content: req.body.content,
      ocrText: req.body.ocrText,
      createdAt: new Date(),
    });
    await note.save();
    res.status(201).json(note);
  } catch (error) {
    res.status(400).json({ error: error.message });
  }
});
05

Security, testing, shipping

Notes are personal, so the app treats them that way: Firebase Authentication with biometric login, AES-256 encryption for sensitive data, and GDPR-style controls for export and deletion. Testing reached 95 percent coverage across unit, widget, and integration suites, and a GitHub Actions pipeline builds and distributes to both app stores.

Key takeaways
01

Real clients beat imaginary users

Building for an actual client forced tradeoffs a classroom spec never would. Every requirement change taught more than the original plan did.

02

Mobile constraints shape the ML

An OCR model that is accurate but slow on a phone is useless. Tuning for on-device memory and battery drove more design decisions than raw accuracy did.

03

Offline-first is a feature, not a fallback

Sync that survives bad connectivity took queuing, conflict resolution, and version history. It was the hardest part of the backend and the most appreciated.

04

Coverage pays for itself

The 95 percent test coverage felt slow to build, then caught regressions every week. On a two-store release pipeline, the suite is the safety net.

Want to see it in practice?

Everything in this article comes from projects I have actually built and shipped. Browse the work, or reach out if you want to talk through the details.