Saka NLP Actor avatar

Saka NLP Actor

Pricing

from $0.01 / 1,000 results

Go to Apify Store
Saka NLP Actor

Saka NLP Actor

An Apify Actor that uses every feature of Saka-NLP to extract text from web pages and analyse it with Indonesian and regional-language NLP.

Pricing

from $0.01 / 1,000 results

Rating

0.0

(0)

Developer

Muhammad Ikhwan Fathulloh

Muhammad Ikhwan Fathulloh

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Saka-NLP Web Extractor & Processor

Saka-NLP Logo

An Apify Actor that uses every feature of Saka-NLP v0.2.6 to extract text from web pages and analyse it with Indonesian and regional-language NLP — plus a plug-and-play LLM integration that works with OpenAI, Gemini, Claude, LM Studio, Ollama, SumoPod, Groq, and any OpenAI-compatible endpoint.

README_ID.md


Saka-NLP Features Used

Saka-NLP ModuleFunctionDescription
tokenize / async_tokenizeTokenizationSplit text into tokens; handles URLs, @mentions, #hashtags, emojis
get_token_countToken countCount total tokens in a text string
normalize / async_normalizeSlang normalizationConvert informal/slang words to standard Indonesian
parse_transaction_unitsNumeric normalization10k → 10000, 1jt → 1000000
extract_transaction_entitiesTransaction NERTag numbers as PRICE or QUANTITY from context
demojizeEmoji → text❤️ → cinta (Indonesian alias)
replace_emoticonsEmoticon → text:)Happy face
analyze / async_analyzeMorphological analysisRoot word, prefixes, suffixes, regional lexicon match, compound word splitting
get_stopwordsMulti-language stopwordsid, sunda, jawa, bali, minang, batak, en, jaksel, all
query_kbbiKBBI dictionary lookupFetch word definitions from the official Indonesian dictionary
latin_to_aksara_sunda / aksara_sunda_to_latinSundanese scriptBidirectional Latin ↔ Sundanese script transliteration
latin_to_aksara_jawa / aksara_jawa_to_latinJavanese scriptBidirectional Latin ↔ Hanacaraka (Javanese) transliteration
latin_to_aksara_bali / aksara_bali_to_latinBalinese scriptBidirectional Latin ↔ Balinese script transliteration
OutputFormatterMulti-format reportsRender results as markdown, html, csv, table, json, or text

LLM Integration (Plug-and-Play)

Connect any LLM provider by simply supplying a provider name and API key. The actor sends the extracted text and NLP results to the LLM for four optional tasks.

Token Optimization

This actor uses four strategies from Saka-NLP to minimize LLM token usage:

StrategySaka-NLP APIToken saving
Slang normalization before sendingbuild_prompt(optimize_text=True)Removes redundant informal tokens from input
Hard input token capbuild_prompt(max_tokens=N)Truncates text at exactly N tokens — no wasted budget
Output contract schemabuild_prompt(output_contract={...})LLM receives exact JSON schema → shorter, structured reply, no prose
Batch modesingle call, 4 tasksAll tasks in ONE API call → system prompt + article text sent once
CSV keyword contextOutputFormatter.format(top_words, 'csv')Keywords as compact CSV string, not verbose JSON
Saka output parserparse_llm_output(text, 'json')Robust JSON extraction — no need for LLM to add markdown fences

Batch mode savings (default ON):

4 separate calls: ~1,400 input tokens (4× system + 4× article text)
1 batch call: ~ 500 input tokens (1× system + 1× article text + compact context)
Saving: ~ 65% fewer input tokens

Batch mode can be disabled via llmBatchMode: false if your provider rejects multi-task prompts.

Supported Providers

llmProviderEndpointDefault Model
openaiapi.openai.com/v1gpt-4o-mini
geminigenerativelanguage.googleapis.com/v1beta/openaigemini-2.0-flash
claudeapi.anthropic.com/v1claude-3-5-haiku-20241022
groqapi.groq.com/openai/v1llama-3.3-70b-versatile
mistralapi.mistral.ai/v1mistral-small-latest
togetherapi.together.xyz/v1meta-llama/Llama-3-8b-chat-hf
openrouteropenrouter.ai/api/v1openai/gpt-4o-mini
deepseekapi.deepseek.com/v1deepseek-chat
sumopodai.sumopod.com/v1gpt-4o-mini
lmstudiolocalhost:1234/v1local-model
ollamalocalhost:11434/v1llama3
customset via llmBaseUrlset via llmModel

LLM Tasks

TaskOutput keyDescription
summaryllm_analysis.llm_summaryFluent AI-generated article summary
sentimentllm_analysis.llm_sentimentPositive / negative / neutral + confidence score
keywordsllm_analysis.llm_keywordsRefined top-10 keywords chosen by the LLM
categoryllm_analysis.llm_categoryTopic classification (Technology, Politics, Health, etc.)

LLM analysis is fully optional — leave llmApiKey empty to skip it.

Example — SumoPod

curl https://ai.sumopod.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-xxxx" \
-d '{"model": "gpt-4o-mini", "messages": [{"role":"user","content":"Hello"}]}'

Equivalent actor input:

{
"url": "https://kompas.com/artikel",
"llmProvider": "sumopod",
"llmApiKey": "sk-xxxx",
"llmModel": "gpt-4o-mini",
"llmTasks": "summary,sentiment,keywords,category"
}

Example — Custom / Self-hosted

{
"url": "https://kompas.com/artikel",
"llmProvider": "custom",
"llmBaseUrl": "https://my-llm-server.com/v1",
"llmApiKey": "my-token",
"llmModel": "my-model",
"llmTasks": "summary,sentiment"
}

Example — LM Studio (local)

{
"url": "https://kompas.com/artikel",
"llmProvider": "lmstudio",
"llmApiKey": "lm-studio",
"llmTasks": "summary,keywords"
}

Input

Core Parameters

ParameterTypeDefaultDescription
urlStringRequired. URL of the web page to process
langStringidStopword language: id, sunda, jawa, bali, minang, batak, en, jaksel, all
topNInteger20Number of top words to return (5–100)
summaryLinesInteger5Number of sentences in the extractive summary (1–20)
kbbiLookupInteger5Number of top words to look up in KBBI (0 = disabled)
aksaraWordsInteger5Number of top words to transliterate into regional scripts (0 = disabled)
outputFormatStringjsonFormat for formatted_reports: json, markdown, html, csv, table, text
includeFullTextBooleanfalseInclude the full extracted text in the output

LLM Parameters

ParameterTypeDefaultDescription
llmProviderStringopenaiLLM provider name (see table above)
llmApiKeyStringBearer token / API key. Leave empty to skip LLM
llmBaseUrlStringOverride base URL (required for custom provider)
llmModelStringModel name. Uses provider default when empty
llmTasksStringallComma-separated tasks: summary, sentiment, keywords, category
llmTimeoutInteger60Max seconds to wait for LLM response (10–300)
llmBatchModeBooleantrueSend all tasks in 1 API call (saves ~65% input tokens)

Full Example Input

{
"url": "https://www.kompas.com/sains/read/2024/01/01/example-article",
"lang": "id",
"topN": 25,
"summaryLines": 5,
"kbbiLookup": 5,
"aksaraWords": 5,
"outputFormat": "markdown",
"includeFullText": false,
"llmProvider": "openai",
"llmApiKey": "sk-xxxx",
"llmModel": "gpt-4o-mini",
"llmTasks": "summary,sentiment,keywords,category",
"llmTimeout": 60
}

Example A — NLP only (no LLM)

{
"url": "https://www.kompas.com/tekno/read/2024/01/15/kecerdasan-buatan-indonesia",
"lang": "id",
"topN": 20,
"summaryLines": 5,
"kbbiLookup": 5,
"aksaraWords": 5,
"outputFormat": "markdown",
"includeFullText": false
}

Example B — NLP + OpenAI

{
"url": "https://www.kompas.com/tekno/read/2024/01/15/kecerdasan-buatan-indonesia",
"lang": "id",
"topN": 20,
"summaryLines": 5,
"kbbiLookup": 5,
"aksaraWords": 5,
"outputFormat": "markdown",
"includeFullText": false,
"llmProvider": "openai",
"llmApiKey": "sk-proj-xxxx",
"llmModel": "gpt-4o-mini",
"llmTasks": "summary,sentiment,keywords,category",
"llmBatchMode": true,
"llmTimeout": 60
}

Example C — LM Studio (local, no cloud key)

{
"url": "https://www.kompas.com/tekno/read/2024/01/15/kecerdasan-buatan-indonesia",
"lang": "id",
"llmProvider": "lmstudio",
"llmApiKey": "local",
"llmTasks": "summary,sentiment"
}

Example D — SumoPod custom endpoint

{
"url": "https://www.detik.com/finance/berita-ekonomi-bisnis/artikel",
"lang": "id",
"topN": 30,
"llmProvider": "custom",
"llmBaseUrl": "https://ai.sumopod.com/v1",
"llmApiKey": "sk-xxxx",
"llmModel": "gpt-4o-mini",
"llmTasks": "summary,keywords,category",
"llmBatchMode": true
}

Output

Example A — NLP only (llm_analysis is null)

{
"url": "https://www.kompas.com/tekno/read/2024/01/15/kecerdasan-buatan-indonesia",
"domain": "kompas.com",
"title": "Kecerdasan Buatan Dorong Transformasi Digital Indonesia - Kompas.com",
"language": "id",
"text_preview": "Kecerdasan buatan (AI) kini menjadi pendorong utama transformasi digital di Indonesia. Pemerintah menargetkan Indonesia masuk 10 besar negara ekonomi digital dunia pada 2045...",
"text_normalized": "Kecerdasan buatan sekarang menjadi pendorong utama transformasi digital di Indonesia. Pemerintah menargetkan Indonesia masuk 10 besar negara ekonomi digital dunia pada 2045...",
"extractive_summary": "Kecerdasan buatan (AI) kini menjadi pendorong utama transformasi digital di Indonesia. Investasi teknologi AI meningkat 340% dalam dua tahun terakhir. Pemerintah menargetkan Indonesia masuk 10 besar ekonomi digital dunia pada 2045.",
"stats": {
"char_count": 8420,
"token_count_raw": 1384,
"token_count_clean": 847,
"unique_token_count": 318,
"sentence_count": 52,
"avg_sentence_length": 26.6,
"lexical_density_pct": 37.54,
"regional_word_count": 14
},
"stopword_coverage": {
"id": 460, "sunda": 58, "jawa": 45, "bali": 47,
"minang": 40, "batak": 90, "en": 180, "jaksel": 37, "all": 1057
},
"tokens_raw_sample": ["Kecerdasan", "buatan", "AI", "kini", "menjadi", "pendorong", "utama", "transformasi"],
"tokens_clean_sample": ["kecerdasan", "buatan", "pendorong", "transformasi", "digital", "indonesia", "teknologi"],
"top_words": [
{ "word": "teknologi", "count": 28 },
{ "word": "digital", "count": 24 },
{ "word": "kecerdasan", "count": 19 },
{ "word": "indonesia", "count": 17 },
{ "word": "transformasi", "count": 14 },
{ "word": "pemerintah", "count": 11 },
{ "word": "investasi", "count": 9 },
{ "word": "inovasi", "count": 7 }
],
"top_bigrams": [
{ "bigram": "kecerdasan buatan", "count": 17 },
{ "bigram": "transformasi digital", "count": 12 },
{ "bigram": "ekonomi digital", "count": 7 }
],
"top_trigrams": [
{ "trigram": "era kecerdasan buatan", "count": 6 },
{ "trigram": "transformasi digital indonesia", "count": 4 }
],
"morphology_sample": [
{ "word": "mempertanggungjawabkan", "root": "tanggung", "prefixes": ["memper"], "suffixes": ["kan"], "type": "regional", "regional_matches": ["jawa"] },
{ "word": "mentransformasikan", "root": "transformasi","prefixes": ["men"], "suffixes": ["kan"], "type": "unknown", "regional_matches": [] },
{ "word": "menyebarluaskan", "root": "sebar luas", "prefixes": ["meny"], "suffixes": ["kan"], "type": "unknown", "regional_matches": [] }
],
"top_roots": [
{ "root": "teknologi", "count": 8 },
{ "root": "digital", "count": 6 },
{ "root": "transformasi", "count": 4 }
],
"regional_words": [
{ "word": "mangga", "root": "mangga", "regional_matches": ["sunda", "jawa"] },
{ "word": "horas", "root": "horas", "regional_matches": ["batak"] }
],
"transaction_analysis": {
"transaction_normalized_preview": "Investasi senilai 10000000 rupiah dialokasikan untuk 3 proyek startup.",
"transaction_entities": [
{ "value": 10000000, "type": "PRICE", "original_token": "10000000" },
{ "value": 3, "type": "QUANTITY", "original_token": "3" }
],
"price_count": 1,
"quantity_count": 1
},
"kbbi_lookup": [
{ "word": "teknologi", "status": "found", "definitions": ["metode ilmiah untuk mencapai tujuan praktis"] },
{ "word": "inovasi", "status": "found", "definitions": ["pemasukan hal-hal baru", "pembaruan"] },
{ "word": "startup", "status": "not_found", "definitions": [] }
],
"aksara_transliteration": [
{
"word": "teknologi",
"aksara_sunda": "ᮒᮨᮊ᮪ᮔᮧᮜᮧᮌᮤ", "aksara_sunda_back": "teknologi",
"aksara_jawa": "ꦠꦺꦏ꧀ꦤꦺꦴꦭꦺꦴꦒꦶ", "aksara_jawa_back": "teknologi",
"aksara_bali": "ᬢᭂᬓ᭄ᬦᭀᬮᭀᬕᬶ", "aksara_bali_back": "teknologi"
},
{
"word": "digital",
"aksara_sunda": "ᮓᮤᮌᮤᮒᮜ᮪", "aksara_sunda_back": "digital",
"aksara_jawa": "ꦢꦶꦒꦶꦠꦭ꧀", "aksara_jawa_back": "digital",
"aksara_bali": "ᬤᬶᬕᬶᬢᬮ᭄", "aksara_bali_back": "digital"
}
],
"formatted_reports": {
"top_words_markdown": "| word | count |\n|---|---|\n| teknologi | 28 |\n| digital | 24 |\n| kecerdasan | 19 |",
"top_words_csv": "word,count\nteknologi,28\ndigital,24\nkecerdasan,19\n",
"top_words_table": "word | count\n-----------\nteknologi | 28\ndigital | 24",
"morphology_html": "<table border=\"1\"><tr><th>word</th><th>root</th></tr><tr><td>mempertanggungjawabkan</td><td>tanggung</td></tr></table>",
"morphology_json": "[{\"word\":\"mempertanggungjawabkan\",\"root\":\"tanggung\",\"prefixes\":[\"memper\"],\"suffixes\":[\"kan\"]}]"
},
"llm_analysis": null
}

Example B — NLP + LLM (llm_analysis populated)

{
"url": "https://www.kompas.com/tekno/read/2024/01/15/kecerdasan-buatan-indonesia",
"domain": "kompas.com",
"title": "Kecerdasan Buatan Dorong Transformasi Digital Indonesia - Kompas.com",
"language": "id",
"text_preview": "Kecerdasan buatan (AI) kini menjadi pendorong utama transformasi digital di Indonesia...",
"text_normalized": "Kecerdasan buatan sekarang menjadi pendorong utama transformasi digital di Indonesia...",
"extractive_summary": "Kecerdasan buatan (AI) kini menjadi pendorong utama transformasi digital di Indonesia. Investasi teknologi AI meningkat 340% dalam dua tahun terakhir.",
"stats": {
"char_count": 8420, "token_count_raw": 1384, "token_count_clean": 847,
"unique_token_count": 318, "sentence_count": 52,
"avg_sentence_length": 26.6, "lexical_density_pct": 37.54, "regional_word_count": 14
},
"stopword_coverage": { "id": 460, "sunda": 58, "jawa": 45, "all": 1057 },
"tokens_raw_sample": ["Kecerdasan", "buatan", "AI", "kini", "menjadi"],
"tokens_clean_sample": ["kecerdasan", "buatan", "transformasi", "digital", "indonesia"],
"top_words": [
{ "word": "teknologi", "count": 28 }, { "word": "digital", "count": 24 },
{ "word": "kecerdasan", "count": 19 }, { "word": "indonesia", "count": 17 }
],
"top_bigrams": [{ "bigram": "kecerdasan buatan", "count": 17 }],
"top_trigrams": [{ "trigram": "era kecerdasan buatan", "count": 6 }],
"morphology_sample": [
{ "word": "mempertanggungjawabkan", "root": "tanggung", "prefixes": ["memper"], "suffixes": ["kan"], "type": "regional", "regional_matches": ["jawa"] }
],
"top_roots": [{ "root": "teknologi", "count": 8 }],
"regional_words": [{ "word": "mangga", "root": "mangga", "regional_matches": ["sunda", "jawa"] }],
"transaction_analysis": {
"transaction_normalized_preview": "Investasi senilai 10000000 rupiah dialokasikan untuk 3 proyek startup.",
"transaction_entities": [
{ "value": 10000000, "type": "PRICE", "original_token": "10000000" },
{ "value": 3, "type": "QUANTITY", "original_token": "3" }
],
"price_count": 1, "quantity_count": 1
},
"kbbi_lookup": [
{ "word": "teknologi", "status": "found", "definitions": ["metode ilmiah untuk mencapai tujuan praktis"] },
{ "word": "startup", "status": "not_found", "definitions": [] }
],
"aksara_transliteration": [
{
"word": "teknologi",
"aksara_sunda": "ᮒᮨᮊ᮪ᮔᮧᮜᮧᮌᮤ", "aksara_sunda_back": "teknologi",
"aksara_jawa": "ꦠꦺꦏ꧀ꦤꦺꦴꦭꦺꦴꦒꦶ", "aksara_jawa_back": "teknologi",
"aksara_bali": "ᬢᭂᬓ᭄ᬦᭀᬮᭀᬕᬶ", "aksara_bali_back": "teknologi"
}
],
"formatted_reports": {
"top_words_markdown": "| word | count |\n|---|---|\n| teknologi | 28 |\n| digital | 24 |",
"top_words_csv": "word,count\nteknologi,28\ndigital,24\n",
"morphology_html": "<table border=\"1\"><tr><th>word</th><th>root</th></tr><tr><td>mempertanggungjawabkan</td><td>tanggung</td></tr></table>",
"morphology_json": "[{\"word\":\"mempertanggungjawabkan\",\"root\":\"tanggung\",\"prefixes\":[\"memper\"],\"suffixes\":[\"kan\"]}]"
},
"llm_analysis": {
"provider_model": "gpt-4o-mini",
"batch_mode": true,
"token_usage": {
"prompt_tokens": 487,
"completion_tokens": 198,
"total_tokens": 685,
"prompt_tokens_estimated": 312
},
"llm_summary": {
"text": "Artikel ini membahas bagaimana kecerdasan buatan menjadi pendorong utama transformasi digital Indonesia. Pemerintah menargetkan Indonesia masuk 10 besar ekonomi digital dunia pada 2045, didukung investasi teknologi yang meningkat 340% dalam dua tahun terakhir. Berbagai startup lokal memanfaatkan AI untuk mengotomatisasi layanan dan meningkatkan efisiensi.",
"model": "gpt-4o-mini"
},
"llm_sentiment": {
"parsed": { "label": "positive", "score": 0.88 },
"model": "gpt-4o-mini"
},
"llm_keywords": {
"parsed": {
"keywords": ["kecerdasan buatan", "transformasi digital", "startup",
"investasi teknologi", "ekonomi digital", "inovasi",
"otomatisasi", "infrastruktur", "data", "pemerintah"]
},
"model": "gpt-4o-mini"
},
"llm_category": {
"parsed": { "label": "Technology", "score": 0.96 },
"model": "gpt-4o-mini"
}
}
}

Processing Pipeline

URL Input
[1] Fetch + BeautifulSoup remove nav / footer / script / style
│ page_title, full_text
[2] saka.normalize slang normalization + 10k → 10000
saka.demojize emoji → Indonesian text alias
saka.replace_emoticons :) → Happy face
│ clean_text
[3] saka.async_tokenize tokenization
saka.get_stopwords stopword filter (9 language variants)
│ tokens_clean
[4] Counter + n-gram word frequency, bigrams, trigrams
[5] saka.async_analyze × N concurrent morphology: root, affixes, regional dict, compounds
[6] saka.extract_transaction_entities PRICE / QUANTITY NER
[7] saka.query_kbbi KBBI dictionary definitions
[8] saka.latin_to_aksara_* transliterate to 3 regional scripts
OutputFormatter render reports in 6 formats
[9] LLMClient (plug-and-play) summary · sentiment · keywords · category
└─ any OpenAI-compatible API OpenAI / Gemini / Claude / Groq / SumoPod / ...
Apify Dataset (JSON)

Display Information

FieldValue
TaglineFull-stack Indonesian NLP on any web page — powered by Saka-NLP
CategoriesContent Moderation, Text Processing, Language Processing
SEO TitleSaka-NLP Web Extractor & Processor — Indonesian NLP Actor
SEO DescriptionApify Actor for full Indonesian NLP: tokenization, morphology, slang normalization, KBBI lookup, regional script transliteration, transaction NER, n-grams, multi-format reports, and plug-and-play LLM integration — powered by Saka-NLP v0.2.6.

Monetization

This Actor uses a Pay Per Result pricing model.

FieldValue
Pricing modelPay per result
Price per unit$0.01 USD
UnitPer page successfully analysed
Billed whenA run produces at least one dataset item

Output Schema

The full schema is defined in .actor/output_schema.json (output). Dataset views are configured inline in .actor/actor.json under storages.dataset. Four dataset views are available in the Apify Console:

ViewFields shown
Overviewurl, domain, title, language, extractive_summary, stats
Word Frequencyurl, top_words, top_bigrams, top_trigrams
Morphological Analysisurl, morphology_sample, top_roots, regional_words
LLM Analysisurl, llm_analysis

Top-level output fields:

FieldTypeDescription
urlStringProcessed URL
domainStringHostname extracted from the URL
titleStringHTML <title> of the page
languageStringStopword language code used
text_previewStringFirst 2,000 characters of extracted text
text_normalizedStringFirst 500 characters of slang-normalized text
extractive_summaryStringAuto-generated extractive summary
statsObjectchar_count, token_count_raw/clean, unique_token_count, sentence_count, avg_sentence_length, lexical_density_pct, regional_word_count
stopword_coverageObjectStopword list size per language
tokens_raw_sampleArrayFirst 50 raw tokens
tokens_clean_sampleArrayFirst 50 clean tokens
top_wordsArray{word, count} — top-N most frequent words
top_bigramsArray{bigram, count} — top 10 two-word sequences
top_trigramsArray{trigram, count} — top 10 three-word sequences
morphology_sampleArray{word, root, prefixes, suffixes, type, regional_matches} for up to 15 tokens
top_rootsArray{root, count} — most common stem forms
regional_wordsArrayTokens matched in a regional dictionary
transaction_analysisObjecttransaction_entities, price_count, quantity_count
kbbi_lookupArray{word, status, definitions} from KBBI
aksara_transliterationArray{word, aksara_sunda, aksara_jawa, aksara_bali, …_back}
formatted_reportsObjectReports in markdown, csv, table, html, json formats
llm_analysisObjectLLM results: llm_summary, llm_sentiment, llm_keywords, llm_category (optional)
full_textStringFull page text (only when includeFullText: true)

Dependencies

PackageVersionPurpose
apify1.7.2Apify Python SDK
saka-nlp0.2.6Indonesian NLP framework
beautifulsoup44.12.3HTML parsing
requests2.32.3HTTP client + LLM API calls
lxml5.2.2Fast HTML/XML parser backend for BeautifulSoup
emoji2.12.1Emoji conversion (required by saka.demojize)
emot3.1.0Emoticon conversion (required by saka.replace_emoticons)

Deploy to Apify

Option 1 — Apify Console (GitHub Integration)

  1. Create a new Actor at Apify Console
  2. Choose Git repository as the source
  3. Enter your GitHub repository URL
  4. Enable GitHub Integration for automatic deploys on push

Option 2 — Apify CLI

npm install -g apify-cli
apify login
apify push

Project Structure

saka-nlp-actor/
├── .actor/
│ ├── actor.json # Apify actor metadata + inline dataset views
│ └── output_schema.json # Output schema (actorOutputSchemaVersion)
├── main.py # Actor entry point
├── llm_client.py # Plug-and-play LLM integration
├── INPUT_SCHEMA.json # Input definition
├── requirements.txt # Python dependencies
├── Dockerfile # Docker configuration
├── LICENSE # MIT License
├── README.md # This file (English)
└── README_ID.md # Indonesian documentation

License

This project is licensed under the LICENSE.

MIT License
Copyright (c) 2026 Muhammad Ikhwan Fathulloh
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.