# ManifoldCF Kit: Apache projects for small business October 30, 2026. Companion to [permission aware document search with Apache ManifoldCF](https://jwatte.com/blog/apache-manifoldcf-permission-aware-search-small-business/). ## How to use this kit Give this kit to the person who operates your directory, file shares and search application. Start on an isolated test environment with invented documents and real test identities whose access differs. Fill in the worksheet before connecting a production repository. This is a documentation based setup and acceptance plan; we have not installed, benchmarked or restored this stack for the article. Successful collection is only one test: the ordinary employee must also fail to retrieve restricted content through the real application. ## Project card and version decision | Project | Tier | Current release and date | Official starting point | |---|---|---|---| | Apache ManifoldCF | Your IT department or provider | 2.31, July 30, 2026 | [Downloads](https://manifoldcf.apache.org/en_US/download.html) | ManifoldCF collects documents and permission information, resolves users' access tokens through authority connectors, and sends indexed material to a search engine. Your search application still authenticates people and enforces the documented permission filter. It is not a finished search website or chatbot. For example, a twelve person law office could search permitted matter folders without exposing another team's files. A forty person manufacturer could search approved drawings while excluding unfinished designs and pricing. These are illustrations, not customers. Both use the operating budget below only if their measured workload fits; integration and data cleanup are additional. Skip a new index if one well organized shared drive or your existing office suite's search already does the job. The index creates another confidential copy with its own retention, deletion and recovery duties. Why IT is needed: source permissions, authority tokens, directory identities and query filters must agree. A mistake can disclose private titles and excerpts even when the original files remain inaccessible. The smallest documented evaluation is a single process with Jetty, agents, UI and embedded HSQLDB. A small ongoing deployment can use PostgreSQL, an agents process and private web applications. Those roles do not mandate separate machines. No universal production CPU or RAM minimum is established by the checked guide; measure extraction, database and index load. Our three host budget is a sizing assumption, with no failover guarantee. Record these decisions before work: | Item | Fill in | |---|---| | Owner and covering administrator | __________ | | Approved source and exact product/version | __________ | | Repository connector and required dependencies | __________ | | Authority connector, identity format and domains | __________ | | ManifoldCF archive version, checksum and signature verification | __________ | | Java runtime, launcher and preview option | __________ | | Search engine version and security plugin version | __________ | | Application route that always enforces security | __________ | | Maximum permission revocation delay | __________ | | Maximum acceptable data loss and recovery time | __________ | | Approved backup retention and deletion process | __________ | Use Java 25 for the documented 2.31 setup, with preview features enabled by the matching launcher. The current README says Java 25 or newer; the release branch compiles for 25 with preview enabled. Do not assume that preview bytecode works unchanged on a later Java release. The documentation index still links 2.30 although 2.31 pages exist. Old Java and database tuning instructions need review. ManifoldCF lists Solr 9.x security plugin 2.2 dated September 7, 2022. No Solr 10 security plugin is listed. Solr 10's separate Java 21 requirement does not establish compatibility. Choose maintained versions whose integration the provider can demonstrate; do not use an obsolete engine solely to match a tutorial. Sources: [current README](https://raw.githubusercontent.com/apache/manifoldcf/trunk/README.md), [release branch build](https://raw.githubusercontent.com/apache/manifoldcf/release-2.31/common-build.xml), [deployment guide](https://manifoldcf.apache.org/release/release-2.31/en_US/how-to-build-and-deploy.html), [Solr integration](https://svn.apache.org/repos/asf/manifoldcf/integration/solr-9.x/trunk/README.txt). Read October 30, 2026, 00:28 to 00:30 UTC. Release branch source is corroboration, not an immutable release archive. ## 1. Choose the source connector deliberately The [included connector matrix](https://manifoldcf.apache.org/release/release-2.31/en_US/included-connectors.html) and [user guide](https://manifoldcf.apache.org/release/release-2.31/en_US/end-user-documentation.html) list repositories including Windows Shares, File System, SharePoint, Web, RSS, JDBC, CMIS, Google Drive and Amazon S3. Outputs include Solr and Elasticsearch; authorities include Active Directory and LDAP. Tika and OpenNLP are separate transformation options. - Generic File System has no native document ACL support beyond manually entered per-job tokens. Mounting a protected share does not change that limitation. - Windows Share/DFS uses the JCIFS family. Check the dependency, build and registration in the actual distribution; the release branch's default connector list omits it. Do not assume every container includes it. - With Active Directory, verify SID based behavior and the documented Use SIDs setting. A Samba/LDAP mapping uses a different identity convention. Test nested groups, explicit denies and DFS references where used. - The published SharePoint matrix ends at tested 2013 versions. Do not infer SharePoint Online compatibility. Require an exact version/authentication demonstration. - JDBC's embedded CSV support is deprecated since 2.26; use the separate CSV connector. - A crawler identity can read more than an employee. Its rights must never become the search user's rights. Use an account with only the read access required for the approved repository scope and its permission metadata. Record any broader grant required by a connector and have the owner approve it. Do not store credentials in this worksheet, chat or source control. Sources: guides above, [registration list](https://raw.githubusercontent.com/apache/manifoldcf/release-2.31/distribution/src/main/resources/connectors.xml), [JCIFS build](https://raw.githubusercontent.com/apache/manifoldcf/release-2.31/connectors/jcifs/build.xml), [release notes](https://raw.githubusercontent.com/apache/manifoldcf/release-2.31/CHANGES.txt). Read October 30, 00:30 to 00:32 UTC. ## 2. Start the private single process example 1. Download the official 2.31 binary and verify its signature and checksum using [Apache's download instructions](https://manifoldcf.apache.org/en_US/download.html). 2. Install Java 25. Set `JAVA_HOME` to that installation using your operating system's normal environment configuration. 3. Unpack the archive on the isolated machine. From its root, run the supplied launcher: ```sh java -version cd example ./start.sh ``` Windows uses `start.bat`. The current README also gives `java --enable-preview -jar start.jar` from the example directory. Prefer the supplied launcher and verify its options. Do not run both at once. 4. Reach the UI only through a private connection: port 8345, application path `/mcf-crawler-ui`. Change demonstration credentials before admitting another person. Test that the public network cannot reach the service. 5. Confirm the UI and agents start, and check the embedded HSQLDB state location in the supplied configuration. Do not treat the disposable database as your production backup plan. The official current README offers `apache/manifoldcf:2.31` as a Docker option. Confirm its required connectors, persistent volumes, runtime and private port bindings. No complete production Compose file is supplied by this kit, and no container was tested here. Source: [README](https://raw.githubusercontent.com/apache/manifoldcf/trunk/README.md) and [deployment instructions](https://manifoldcf.apache.org/release/release-2.31/en_US/how-to-build-and-deploy.html), read October 30, 00:28 and 00:30 UTC. ## 3. Establish query time enforcement before indexing secrets Follow the [Solr 9.x integration README](https://svn.apache.org/repos/asf/manifoldcf/integration/solr-9.x/trunk/README.txt) for the supported plugin and schema. It specifies six multivalued string fields: ```text allow_token_document deny_token_document allow_token_parent deny_token_parent allow_token_share deny_token_share ``` Its complete schema example uses indexed, stored and required fields with `__nosecurity__` defaults. Review the example as a whole; never treat a missing ACL on a protected document as authorization to publish it. Preserve applicable document, parent and share restrictions, with denial taking precedence. The documented query parser class is `org.apache.solr.mcf.ManifoldCFQParserPlugin`, registered as `manifoldCFSecurity`. Configure its `AuthorityServiceBaseURL` to the private authority service. The protected request handler appends: ```text fq={!manifoldCFSecurity} ``` The trusted application supplies `AuthenticatedUserName` and, where applicable, `AuthenticatedUserDomain`. Derive them from verified authentication and controlled mapping. Discard client supplied identity/token overrides. Do not allow the user to choose another handler or call Solr directly. A filter supplied only by browser JavaScript is insufficient. The alternative documented integration uses a search component. Implement one complete route and test it. Authority response `TOKEN:` lines determine security; status messages alone are not a substitute for the filter. An authority failure must not cause the application to retry unrestricted. Protect titles, highlights, facets, counts, autocomplete, exports, downloads and AI context. Partition personalized caches appropriately and recheck authorization before serving cached content. These are acceptance requirements for the application, not claims that installing the plugin automatically secures every feature. The [security analysis](https://manifoldcf.apache.org/en_US/security.html) describes a possible scoring/global statistics side channel. If even document existence is sensitive, obtain a design review for separate indexes and stronger isolation. Read October 30, 00:28 to 00:29 UTC. ## 4. Create the first job Use synthetic source files with distinctive phrases. Our suggested set is an ordinary procedure, a restricted partner memo and an explicitly denied document. Record which test account may see each. Avoid real patient, student, client or personnel data. In the UI, following the [user guide](https://manifoldcf.apache.org/release/release-2.31/en_US/end-user-documentation.html): 1. Create the output connection to the isolated Solr collection and verify it. 2. Create an authority group, assign the authority connection to it and verify its identity mapping. 3. Create the repository connection to the narrow test location and select the same authority group. It namespaces tokens; changing it later requires reindexing. Confirm the connector preserves that source's permission model. 4. Create a job selecting the repository, output pipeline, start location and file rules. Keep the first run manual. 5. Run it, inspect status/history and privately inspect indexed permission fields. Resolve skipped files and extraction failures. 6. Query through the employee application using each test identity, then complete the matrix below. | Test | Required result | Observed result, time and reviewer | |---|---|---| | Ordinary employee searches ordinary phrase | Approved document found | __________ | | Ordinary employee searches restricted phrase/title/identifier | No content or metadata disclosure | __________ | | Authorized reviewer searches restricted phrase | Correct document found | __________ | | User matches both allow and applicable deny | Denial wins | __________ | | User forges partner identity or tokens | Override rejected or ignored | __________ | | Browser calls engine or unprotected handler directly | Connection or request denied | __________ | | Directory/authority unavailable | No unrestricted fallback | __________ | | Unknown or disabled identity | Restricted content denied | __________ | | Group membership revoked | Exclusion within approved interval | __________ | | Source ACL tightened | Exclusion after required recrawl, within interval | __________ | | Source document deleted | Removed according to approved policy | __________ | | Snippets, facets, exports and AI context | Same restrictions as search | __________ | | Restored environment | Same positive and negative results | __________ | A broken index returning nothing fails the authorized positive test. A paused crawler is not proof that already indexed documents are inaccessible. Record actual revocation lag; do not substitute the scheduled interval for a measurement. ## 5. Move to an ongoing deployment Use the release's [database and process instructions](https://manifoldcf.apache.org/release/release-2.31/en_US/how-to-build-and-deploy.html) to configure maintained PostgreSQL storage for crawl state, initialize it, register selected connectors and start the agents and web applications. Review older tuning advice with your database administrator. Multiprocess operation can share a host; adding a distributed coordinator is a separate design choice. Keep the UI behind a private network or administrator only Access policy. Separate employee search from crawler administration. The [private server guide](https://jwatte.com/blog/kimsufi-vps-cloudflare-tunnel-access/) covers access and independent recovery. An entrance login does not implement document authorization. Once the matrix passes, set a schedule and source request limits. Monitor last successful collection, failures, queue growth, disk space, authority failures and stale permissions. Define who pauses search during an urgent revocation or directory outage. Our first week sequence is a proposal, not a promised setup duration: - First: approve source scope, identities, exclusion rules and recovery targets. - Next: establish the disposable runtime and supported plugin pair. - Then: run the narrow job and every positive/negative permission test. - Before expansion: restore the state into isolation and repeat the tests. - At review: measure actual effort and load, price remaining integration, and decide whether the current office suite or managed service is sufficient. ## 6. Backup, update and restore checklist - Back up the PostgreSQL crawler database consistently using its maintained backup tooling. A job configuration export does not preserve all crawl state. - Protect configuration, connector definitions and required dependencies, plus the Solr schema/security configuration and a recoverable index/source set. - Store encrypted independent copies and keep recovery keys outside the failed machine. Retain versions according to approved policy; backups can preserve old permissions and deleted content. - Test restoration with agents stopped and outbound production destinations disconnected. Restore database/configuration and compatible index state, then reconcile sources before enabling jobs. - Verify the same test users still receive the intended results. Measure recovery time and data loss against the written target. - Before updates, record Java, ManifoldCF, connector, parser, plugin and engine versions; check advisories and test the combination in staging. - Preserve a consistent rollback point and account for database/schema changes. Replacing an executable alone may not reverse an upgrade. [ManifoldCF advisories](https://security.apache.org/projects/manifoldcf/) identify CVE-2022-45910 in versions through 2.23: LDAP injection through inadequately validated identity parameters in Active Directory and SharePoint Active Directory authority connectors. Upgrade affected versions and validate identity input. The list does not certify bundled dependencies. Follow [Solr advisories](https://solr.apache.org/security.html), [Tika advisories](https://tika.apache.org/security.html) and [ASF security](https://www.apache.org/security/) as well. Isolate parsers handling untrusted documents and limit resources and outbound access. Sources read October 30, 00:28 to 00:30 UTC; Solr and Tika observations reused from October 29, 21:38 and 21:40. Before regulated records enter the system, check HIPAA for patient information, attorney client confidentiality and applicable professional rules for matter files, GLBA Safeguards applicability for financial information, and FERPA for student education records. Before ingestion, have the county or city records officer approve the applicable retention/public records handling and holds; keep criminal justice information out pending CJIS review. This kit supplies no compliance determination. Official references are in the companion article's dated source list. ## 7. Cost worksheet All dollars are US dollars before tax. Fill in both a low and high case. Existing repository and identity licenses remain on both sides. ```text Setup hours S: low ____ high ____ Monthly admin hours A: low ____ high ____ Hourly compensation or quoted provider rate L: ____ Number of hosts and monthly cost each: ____ Total monthly hosting: ____ Retained backup GB, including all versions: low ____ high ____ Monthly backup and usage charges: ____ Alternative users U and per-user price P: ____ Alternative setup/admin hours and required extras: ____ Self hosted setup = S x L Self hosted monthly = hosting + backups + A x L Self hosted 36 months = setup + 36 x monthly Managed 36 months = managed setup + 36 x (U x P + managed admin + extras) Savings = managed total minus self hosted total Break even = ceiling(extra self hosted setup / positive monthly saving) If setup and monthly self hosted costs are both higher: never ``` Our filled case holds twenty users fixed at both endpoints, with three $48 DigitalOcean Basic Regular hosts, each four shared vCPUs/8 GiB/160 GiB disk. This is an isolation budget, not a minimum or resilient cluster. Backups hold 200 to 1,000 GB: `max(0, GB minus 10) x $0.00695`, giving $1.3205 to $6.8805 monthly. Transfer and requests are assumed within included allowances. The shared labor proxy is $68.09/hour, calculated as $47.66 divided by 0.700, rounded before multiplying. It estimates employee compensation; an outside provider needs its own quote. Our IT assumptions are 24 to 60 setup hours and 6 to 16 monthly hours. Custom integration, interface development, migration, training, compliance work, incidents and setup-period hosting are excluded; add them when applicable. Onyx Business publishes $20/user/month with annual billing: twenty seats cost $400 monthly equivalent. Our managed setup assumption is 2 to 4 hours, with 0.5 to 1.5 monthly hours. These are our allowances, not vendor service terms. | Filled example | Self hosted low | Self hosted high | Managed low | Managed high | |---|---:|---:|---:|---:| | Setup | $1,634 | $4,085 | $136 | $272 | | Monthly with administration | $554 | $1,240 | $434 | $502 | | 36 months | $21,573 | $48,737 | $15,762 | $18,349 | | Self hosted extra cost | $5,811 | $30,388 | Reference | Reference | | Self hosted break even | Never | Never | Reference | Reference | Calculate before rounding. Low self hosting is `24 x $68.09 + 36 x ($144 + $1.3205 + 6 x $68.09)`. Low managed is `2 x $68.09 + 36 x ($400 + 0.5 x $68.09)`. This is conditional on Onyx Business meeting the source and identity need. Its SharePoint Online connector supports permission sync with certificate authentication and additional grants, including the permission required to read role assignments. It has exclusions and scheduled permission propagation. OIDC/SAML SSO belongs to quoted Enterprise pricing. Legacy Windows share parity is unverified, and marketing conflicts with detailed documentation on plan entitlement; confirm the contract before purchasing. If Microsoft 365 or Google Workspace search already meets the requirement, test it first. The supplied browser research prices Business Basic and Business Starter at $7/user/month on their annual terms, so twenty users cost $140 monthly equivalent or $5,040 over 36 months. Existing subscribers may incur no additional search license fee. This does not erase data cleanup or access review time. Sources: [DigitalOcean](https://www.digitalocean.com/pricing/droplets), [B2](https://www.backblaze.com/cloud-storage/pricing), [BLS wages](https://data.bls.gov/oesprofile/?areas=INDUSTRY,STATE,MSA&major_group=150000&measure=01&occupation=151244&year=2025), [BLS compensation share](https://data.bls.gov/timeseries/CMU2020000000000P), October 29, 21:10 to 21:17 UTC. [Onyx price](https://onyx.app/pricing), October 30, 00:28 and browser 00:29; [connector overview](https://docs.onyx.app/admins/connectors/overview), 00:29; [SharePoint instructions](https://docs.onyx.app/admins/connectors/official/microsoft-365/sharepoint.md), 00:30. [Microsoft](https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products) and [Google](https://workspace.google.com/pricing.html), supplied October 29 and 30 browser research; Google's exact time was not supplied. ## 8. Setup time when Claude or ChatGPT does the typing These are the series' IT planning assumptions, not measured installation savings. AI setup uses 65% to 90% of manual hours; AI monthly administration uses 80% to 100%. Human review of 6 to 18 setup hours and 3 to 8 monthly hours is already included. Prompting, supervision, testing and corrections count; unattended tool time is not automatically human labor. | View | Low | High | |---|---:|---:| | Manual setup hours | 24 | 60 | | AI setup hours | 15.6 | 54 | | Manual monthly hours | 6 | 16 | | AI monthly hours | 4.8 | 16 | | Manual 36 months | $21,573 | $48,737 | | Claude Max 5x subscription | $19,960 | $50,228 | | ChatGPT Pro 100 subscription | $19,960 | $50,228 | | Claude Opus 5.5 API | $18,132 | $48,790 | | GPT-6 Astra API | $18,247 | $49,483 | For either $100 monthly subscription, charge one setup month and allocate $50 monthly for 36 operating months only when other work uses the remaining half. Exclusive use adds $1,800. Never allocate more than the full subscription across projects. Equal prices do not imply equal allowances; extra usage and additional setup months add cost. ```text AI setup = S x setup share x L + setup tool fee AI monthly = unchanged hosting/backups + A x admin share x L + monthly tool fee AI 36 months = AI setup + 36 x AI monthly API fee = (ordinary input x ordinary rate + cache writes x write rate + cache reads x read rate + output x output rate) / 1,000,000 ``` Our cumulative setup API budget is 1 to 5 million input and 100,000 to 500,000 output tokens. Monthly, it is 500,000 to 2 million input and 50,000 to 200,000 output. Low input is 30% ordinary, 10% short writes and 60% reads. High input has no caching. Include retries and billed reasoning; these are many calls, not one prompt. Keep individual requests within the applicable context rate band. No credits or batch discounts are deducted. | Model | Ordinary input / output / short write / read per million | Setup fee low / high | Monthly fee low / high | |---|---|---|---| | Claude Opus 5.5 | $4 / $20 / $5 / $0.20 | $3.82 / $30 | $1.91 / $12 | | GPT-6 Astra | $10 / $50 / $12.50 / $1 | $9.85 / $75 | $4.925 / $30 | The high case saves no monthly administration time. Subscription costs overtake manual work in month 7; Claude API in month 32; OpenAI API in month 12. Low AI cases still cost more than the conditional managed comparison. Claude Code or Codex can prepare configuration and restoration commands on an authorized server. Desktop Commander's free local service supplies terminal/file access; it is not a sandbox. Optional Remote Pro at $20 monthly adds a $20 setup month and $10 monthly with the same half allocation, $380 over the period. Claude in Chrome can help with provider/Access settings while a person watches. ChatGPT's separate cloud browser is available only where supported; it does not supply server access. Use staging and approved commands or a restricted sandbox. Keep secrets and private documents out of chat. Subscriptions cover supervised supported tools; custom automated pipelines use API credentials and budgets. Review every access change and test restoration. The person responsible still owns the permission decision. Sources, reused October 29, 2026, 23:27 to 23:32 UTC: [Claude Max](https://support.claude.com/en/articles/11049741-what-is-the-max-plan), [ChatGPT prices](https://chatgpt.com/pricing/), [Claude API](https://platform.claude.com/docs/en/about-claude/pricing), [OpenAI API](https://developers.openai.com/api/docs/pricing), [OpenAI caching](https://developers.openai.com/api/docs/guides/prompt-caching), [Desktop Commander](https://desktopcommander.app/) and [pricing](https://desktopcommander.app/pricing/), [Claude in Chrome](https://support.claude.com/en/articles/12012173-get-started-with-claude-in-chrome), [ChatGPT cloud browser](https://help.openai.com/en/articles/20001280-using-cloud-browser-in-chatgpt). [Codex CLI](https://learn.chatgpt.com/docs/cli) checked October 30, 00:28 UTC. ## 9. Questions for the provider and final acceptance Ask which exact source versions and permission rules are supported, which connectors need extra dependencies, and how identities are validated. Ask for measured revocation delay, the full list of protected retrieval routes and the behavior when the authority is down. Ask who patches the complete stack, how the index is reconciled after restore, and who covers an absence. Obtain separate prices for integration, incidents and any regulated-data assessment. Approve expansion only when the positive and negative tests pass, a restore succeeds, the cost worksheet has real quotes for excluded work, and an owner accepts the residual limits. Otherwise keep the pilot restricted and use the existing search system. *This kit is informational, not legal, security or IT consulting advice. Local requirements and contracts need review.* *Apache, the Apache feather logo and the Apache project names are trademarks of The Apache Software Foundation. This site is not affiliated with or endorsed by the ASF. Other product names are used for identification only.*