diff --git a/LICENSE b/LICENSE
index ba75c69..41e04e1 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1 +1,21 @@
-TODO: Add your license here.
+MIT License
+
+Copyright (c) 2025-2026 Andrew 'nuark' G.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index 6ea60f0..dd33b52 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,237 @@
# liblinphone_flutter
-libLinPhone integration library for Flutter apps
+A Flutter plugin that provides integration with the Linphone library for VoIP calls (audio and video) on Android and iOS platforms.
-## Getting Started
+## Third-Party Licenses
-Better docs will be available some day
+This project depends on the Linphone SDK, developed by Belledonne Communications, which is dual-licensed under the GNU Affero General Public License v3 (AGPLv3) and a proprietary commercial license.
+This wrapper library itself is licensed under the MIT License. However, it is designed to work with the Linphone SDK, and therefore **does not remove or replace the licensing requirements of Linphone**.
+
+### Important
+
+Any application using this plugin and linking against the Linphone SDK is subject to the terms of the AGPLv3, unless a commercial license for Linphone is obtained.
+
+In practice, this means that applications using this plugin must comply with AGPLv3 requirements, which may include releasing the application's source code under a compatible license.
+
+For proprietary or closed-source applications, you must obtain a commercial license for the Linphone SDK from Belledonne Communications.
+
+## Description
+
+This plugin wraps the native Linphone SDK (liblinphone) and exposes a Dart API for making SIP-based voice and video calls in Flutter applications.
+
+## Features
+
+- SIP account registration
+- Audio and video calls
+- Video streaming with local preview and remote view
+- Call management (answer, hangup, toggle video/microphone)
+- Registration and call state event streams
+
+## Platform Support
+
+| Platform | Status |
+| -------- | --------- |
+| Android | Supported |
+| iOS | Supported |
+
+## Requirements
+
+- Flutter SDK >= 3.3.0
+- Dart SDK >= 3.9.0-333.2.beta
+- Linphone SDK (native dependency)
+
+## Installation
+
+Add this to your `pubspec.yaml`:
+
+```yaml
+dependencies:
+ liblinphone_flutter: ^0.0.3
+```
+
+Or if you want to go with git:
+
+```yaml
+dependencies:
+ liblinphone_flutter:
+ git:
+ url: https://git.nuark.xyz/nuark/liblinphone_flutter.git
+ ref: commit-hash
+```
+
+Then run:
+
+```bash
+flutter pub get
+```
+
+### Platform-Specific Setup
+
+#### Android
+
+Ensure you have the necessary permissions in your `AndroidManifest.xml`:
+
+```xml
+
+
+
+
+```
+
+#### iOS
+
+The plugin requires access to the camera and microphone. Add the following to your `Info.plist`:
+
+```xml
+NSCameraUsageDescription
+Camera access is required for video calls
+NSMicrophoneUsageDescription
+Microphone access is required for audio and video calls
+```
+
+## Usage
+
+### Basic Example
+
+```dart
+import 'package:liblinphone_flutter/liblinphone_flutter.dart';
+
+final liblinphone = LiblinphoneFlutter();
+
+// Initialize
+await liblinphone.checkPermissions();
+await liblinphone.initialize();
+
+// Register to SIP server
+await liblinphone.register(
+ 'username',
+ 'password',
+ 'sip.server.com',
+ 5060,
+);
+
+// Listen to registration events
+liblinphone.registrationEvents.listen((state) {
+ print('Registration state: $state');
+});
+
+// Listen to call events
+liblinphone.callEvents.listen((state) {
+ print('Call state: $state');
+});
+
+// Make a video call
+await liblinphone.makeCall('sip:recipient@sip.server.com', true);
+
+// Answer incoming call
+await liblinphone.answerCall();
+
+// Toggle video during call
+await liblinphone.toggleVideo();
+
+// Toggle microphone
+await liblinphone.toggleMicrophone();
+
+// Hangup
+await liblinphone.hangupCall();
+
+// Unregister and cleanup
+await liblinphone.unregister();
+await liblinphone.stop();
+```
+
+### Video Views
+
+For video calls, use the provided widgets to display local and remote video streams:
+
+```dart
+import 'package:liblinphone_flutter/widgets/local_view.dart';
+import 'package:liblinphone_flutter/widgets/remote_view.dart';
+
+// In your widget tree
+Column(
+ children: [
+ // Remote video (full screen or large area)
+ Expanded(
+ child: RemoteView(),
+ ),
+ // Local video preview (picture-in-picture)
+ SizedBox(
+ height: 150,
+ width: 100,
+ child: LocalView(),
+ ),
+ ],
+)
+```
+
+## API Reference
+
+### Main Class: `LiblinphoneFlutter`
+
+#### Methods
+
+| Method | Description |
+| ----------------------------------------------------------------- | -------------------------------------------------- |
+| `Future checkPermissions()` | Checks and requests camera/microphone permissions |
+| `Future initialize()` | Initializes the Linphone core |
+| `Future register(username, password, serverIp, serverPort)` | Registers to a SIP server |
+| `Future unregister()` | Unregisters from the SIP server |
+| `Future makeCall(callTo, isVideoEnabled)` | Makes an outgoing call |
+| `Future answerCall()` | Answers an incoming call |
+| `Future hangupCall()` | Hangs up the current call |
+| `Future inCall()` | Returns true if there is an active call |
+| `Future callType()` | Returns the type of the current call (audio/video) |
+| `Future toggleVideo()` | Toggles video enabled state during a call |
+| `Future toggleMicrophone()` | Toggles microphone muted state |
+| `Future stop()` | Stops the Linphone core |
+| `Future syncCurrentState()` | Forces synchronization of current state |
+
+#### Event Streams
+
+| Stream | Type | Description |
+| -------------------- | --------------------------- | -------------------------------- |
+| `registrationEvents` | `Stream` | Emits registration state changes |
+| `callEvents` | `Stream` | Emits call state changes |
+
+### Enums
+
+#### `RegistrationState`
+
+- `None` - Not registered
+- `Progress` - Registration in progress
+- `Ok` - Successfully registered
+- `Cleared` - Registration cleared
+- `Failed` - Registration failed
+
+#### `CallState`
+
+- `Idle` - No active call
+- `IncomingReceived` - Incoming call received
+- `OutgoingInit` - Outgoing call initialized
+- `OutgoingProgress` - Outgoing call in progress
+- `OutgoingRinging` - Remote party ringing
+- `Connected` - Call connected
+- `StreamsRunning` - Media streams running
+- `Pausing` - Call pausing
+- `Paused` - Call paused
+- `Resuming` - Call resuming
+- `Error` - Call error
+- `End` - Call ended
+- And other states...
+
+#### `CallType`
+
+- `Audio` - Audio-only call
+- `Video` - Video call
+- `Unknown` - Call type unknown
+
+## License
+
+This project is licensed under the MIT License.
+
+## Links
+
+- [Homepage](https://git.nuark.xyz/nuark/liblinphone_flutter)
+- [Linphone Project](https://www.linphone.org/)