diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
index 6716e2d865..6a3f57813c 100644
--- a/.github/workflows/pr.yml
+++ b/.github/workflows/pr.yml
@@ -12,6 +12,7 @@ on:
- 'docs/**'
- '**/*.md'
- '.github/workflows/developer-guide-docs.yml'
+ - '.github/workflows/website-docs.yml'
- 'CodenameOneDesigner/**'
- 'Ports/IOSPort/**'
push:
@@ -25,6 +26,7 @@ on:
- 'docs/**'
- '**/*.md'
- '.github/workflows/developer-guide-docs.yml'
+ - '.github/workflows/website-docs.yml'
- 'CodenameOneDesigner/**'
- 'Ports/IOSPort/**'
diff --git a/.github/workflows/website-docs.yml b/.github/workflows/website-docs.yml
index 769afba4b1..cb84d4299c 100644
--- a/.github/workflows/website-docs.yml
+++ b/.github/workflows/website-docs.yml
@@ -50,6 +50,20 @@ jobs:
set -euo pipefail
gem install --no-document asciidoctor rouge
+ - name: Download latest OTA skins
+ run: |
+ set -euo pipefail
+ scripts/website/fetch_ota_skins.sh
+ env:
+ GITHUB_TOKEN: ${{ github.token }}
+
+ - name: Update developer guide PDF redirect
+ run: |
+ set -euo pipefail
+ scripts/website/update_developer_guide_redirect.sh
+ env:
+ GITHUB_TOKEN: ${{ github.token }}
+
- name: Build website
run: |
set -euo pipefail
@@ -58,6 +72,17 @@ jobs:
WEBSITE_INCLUDE_JAVADOCS: "true"
WEBSITE_INCLUDE_DEVGUIDE: "true"
+ - name: Validate OTA skin output
+ run: |
+ set -euo pipefail
+ test -f docs/website/public/OTA/Skins.xml
+
+ - name: Validate developer guide redirect output
+ run: |
+ set -euo pipefail
+ test -f docs/website/public/_redirects
+ grep -Eq '^/files/developer-guide\.pdf https://github\.com/codenameone/CodenameOne/releases/download/.+/developer-guide\.pdf 302$' docs/website/public/_redirects
+
- name: Upload built site artifact
uses: actions/upload-artifact@v4
with:
diff --git a/docs/website/content/architecture-of-the-gui-builder.md b/docs/website/content/architecture-of-the-gui-builder.md
index a2d46d8d70..3f9bf1ae71 100644
--- a/docs/website/content/architecture-of-the-gui-builder.md
+++ b/docs/website/content/architecture-of-the-gui-builder.md
@@ -18,7 +18,7 @@ The Codename One Designer isn't a standard code generator, the UI is saved withi
1. No fragile generated code to break.
2. Designers who don't know Java can use the tool.
-3. The "[Codename One LIVE!](http://www.codenameone.com/codename-one-live.html)" application can show a live preview of your design as you build it.
+3. The "[Codename One LIVE!](/codename-one-live)" application can show a live preview of your design as you build it.
4. Images and theme settings can be integrated directly with the GUI without concern.
5. The tool is consistent since the file you save is the file you run.
6. GUI's/themes can be downloaded dynamically without replacing the application (this can reduce download size).
@@ -46,7 +46,7 @@ Container c = u.createContainer(r, "uiNameInResource");
(Notice that since Form & Dialog both derive from Container you can just downcast to the appropriate type).
-This would work for any resource file and can work completely dynamically! E.g. you can download a resource file on the fly and just show the UI that is within the resource file... That is what [Codename One LIVE!](http://www.codenameone.com/codename-one-live.html) is doing internally.
+This would work for any resource file and can work completely dynamically! E.g. you can download a resource file on the fly and just show the UI that is within the resource file... That is what [Codename One LIVE!](/codename-one-live) is doing internally.
### IDE Bindings
diff --git a/docs/website/content/blog/java-is-superior-to-react-native-in-practically-every-way.md b/docs/website/content/blog/java-is-superior-to-react-native-in-practically-every-way.md
index 312502c2f0..cd6bb12a99 100644
--- a/docs/website/content/blog/java-is-superior-to-react-native-in-practically-every-way.md
+++ b/docs/website/content/blog/java-is-superior-to-react-native-in-practically-every-way.md
@@ -224,9 +224,9 @@ compared to Codename One and has some obvious potential issues.
## Truly native cross-platform app development with Java or Kotlin for iOS, Android & Web.
-[ Get Started ](https://codenameone.com/getting-started.html)
+[Get Started](/getting-started/)
-[ Why Codename one? ](https://codenameone.com/introduction.html)
+[Why Codename one? ](/introduction/)
---
## Archived Comments
diff --git a/docs/website/content/demo-camera-demo.md b/docs/website/content/demo-camera-demo.md
index 3e4257c9da..8e8fb3dd53 100644
--- a/docs/website/content/demo-camera-demo.md
+++ b/docs/website/content/demo-camera-demo.md
@@ -35,8 +35,8 @@ Blog Post: [link](/blog/camera-demo.html)
Source: [link](https://github.com/codenameone/CameraDemo)
-JS Port: [link](http://www.codenameone.com/demos/CameraDemo/)
+JS Port: [link](/demos/CameraDemo/)
-Android App: [link](http://www.codenameone.com/demos/CameraDemo/CameraDemo-release.apk)
+Android App: [link](/demos/CameraDemo/CameraDemo-release.apk)
ios: [link](#)
diff --git a/docs/website/content/demo-chrome.md b/docs/website/content/demo-chrome.md
index 1fa8c447a3..0727f46311 100644
--- a/docs/website/content/demo-chrome.md
+++ b/docs/website/content/demo-chrome.md
@@ -35,8 +35,8 @@ Since Apple doesn’t allow demos on itunes and doesn’t allow installing apps
Source: [link](https://github.com/codenameone/Chrome)
-JS Port: [link](http://www.codenameone.com/demos/Chrome/)
+JS Port: [link](/demos/Chrome/)
-Android App: [link](http://www.codenameone.com/demos/Chrome/Chrome-release.apk)
+Android App: [link](/demos/Chrome/Chrome-release.apk)
ios: [link](#)
diff --git a/docs/website/content/demo-clean-modern-port-of-psd-design-to-cross-platform-native-mobile-app.md b/docs/website/content/demo-clean-modern-port-of-psd-design-to-cross-platform-native-mobile-app.md
index 4ba77f6fbb..076123175f 100644
--- a/docs/website/content/demo-clean-modern-port-of-psd-design-to-cross-platform-native-mobile-app.md
+++ b/docs/website/content/demo-clean-modern-port-of-psd-design-to-cross-platform-native-mobile-app.md
@@ -55,6 +55,6 @@ Blog Post: [link](/template-clean-modern-ui-kit.html)
Source: [link](https://github.com/codenameone/CleanModernUIKit)
-JS Port: [link](http://www.codenameone.com/demos/CleanModern/)
+JS Port: [link](/demos/CleanModern/)
-Android App: [link](http://www.codenameone.com/demos/CleanModern/CleanModern-release.apk)
+Android App: [link](/demos/CleanModern/CleanModern-release.apk)
diff --git a/docs/website/content/demo-dr-sbaitso.md b/docs/website/content/demo-dr-sbaitso.md
index 824c14799f..12dafb83be 100644
--- a/docs/website/content/demo-dr-sbaitso.md
+++ b/docs/website/content/demo-dr-sbaitso.md
@@ -37,12 +37,12 @@ Tutorial: [link](https://www.udemy.com/learn-mobile-programming-by-example-with-
Source: [link](https://github.com/codenameone/codenameone-demos/tree/master/DrSbaitso)
-JS Port: [link](http://www.codenameone.com/demos/DrSbaitso/)
+JS Port: [link](/demos/DrSbaitso/)
-Windows Desktop: [link](http://www.codenameone.com/demos/DrSbaitso/DrSbaitso.exe)
+Windows Desktop: [link](/demos/DrSbaitso/DrSbaitso.exe)
-Mac App: [link](http://www.codenameone.com/demos/DrSbaitso/DrSbaitso.dmg)
+Mac App: [link](/demos/DrSbaitso/DrSbaitso.dmg)
-Android App: [link](http://www.codenameone.com/demos/DrSbaitso/DrSbaitso-release.apk)
+Android App: [link](/demos/DrSbaitso/DrSbaitso-release.apk)
ios: [link](#)
diff --git a/docs/website/content/demo-geoviz-demo.md b/docs/website/content/demo-geoviz-demo.md
index 4911fd3de1..ec9efc4056 100644
--- a/docs/website/content/demo-geoviz-demo.md
+++ b/docs/website/content/demo-geoviz-demo.md
@@ -35,12 +35,12 @@ Blog Post: [link](https://beta.codenameone.com/blog/geo-viz-and-codename-one.htm
Source: [link](https://github.com/codenameone/codenameone-demos/tree/master/GeoVizDemo)
-JS Port: [link](http://www.codenameone.com/demos/GeoVizDemo/)
+JS Port: [link](/demos/GeoVizDemo/)
-Windows Desktop: [link](http://www.codenameone.com/demos/GeoVizDemo/GeoVizDemo.exe)
+Windows Desktop: [link](/demos/GeoVizDemo/GeoVizDemo.exe)
-Mac App: [link](http://www.codenameone.com/demos/GeoVizDemo/GeoVizDemo.dmg)
+Mac App: [link](/demos/GeoVizDemo/GeoVizDemo.dmg)
-Android App: [link](http://www.codenameone.com/demos/GeoVizDemo/GeoVizDemo-release.apk)
+Android App: [link](/demos/GeoVizDemo/GeoVizDemo-release.apk)
ios: [link](#)
diff --git a/docs/website/content/demo-google-maps-demo.md b/docs/website/content/demo-google-maps-demo.md
index 92a65596de..dcc2e2205e 100644
--- a/docs/website/content/demo-google-maps-demo.md
+++ b/docs/website/content/demo-google-maps-demo.md
@@ -35,8 +35,8 @@ Blog Post: [link](https://beta.codenameone.com/blog/new-improved-native-google-m
Source: [link](https://github.com/codenameone/codenameone-google-maps/tree/master/GoogleMapsTest)
-JS Port: [link](http://www.codenameone.com/demos/GoogleMaps/)
+JS Port: [link](/demos/GoogleMaps/)
-Android App: [link](http://www.codenameone.com/demos/GoogleMaps/GoogleMapsTestApp-release.apk)
+Android App: [link](/demos/GoogleMaps/GoogleMapsTestApp-release.apk)
ios: [link](#)
diff --git a/docs/website/content/demo-kitchen-sink.md b/docs/website/content/demo-kitchen-sink.md
index be07c7c770..a5083c73b8 100644
--- a/docs/website/content/demo-kitchen-sink.md
+++ b/docs/website/content/demo-kitchen-sink.md
@@ -21,7 +21,7 @@ The demo displays icons/cards with various categories to show off various featur
Source: [link](https://github.com/codenameone/KitchenSink/)
-JS Port: [link](http://www.codenameone.com/demos/KitchenSink/)
+JS Port: [link](/demos/KitchenSink/)
iOS iTunes: [link](https://apps.apple.com/us/app/kitchen-sink-codename-one/id635048865)
@@ -29,6 +29,6 @@ Universal Windows (UWP): [link](https://www.microsoft.com/en-us/p/codename-one-k
Google Play [link](https://play.google.com/store/apps/details?id=com.codename1.demos.kitchen)
-Windows Desktop: [link](http://www.codenameone.com/demos/KitchenSink/KitchenSink.exe)
+Windows Desktop: [link](/demos/KitchenSink/KitchenSink.exe)
-Mac App: [link](http://www.codenameone.com/demos/KitchenSink/KitchenSink.dmg)
+Mac App: [link](/demos/KitchenSink/KitchenSink.dmg)
diff --git a/docs/website/content/demo-pheonix-ui-port-of-psd-design-to-cross-platform-native-mobile-app.md b/docs/website/content/demo-pheonix-ui-port-of-psd-design-to-cross-platform-native-mobile-app.md
index dfa4f9931a..095dc40760 100644
--- a/docs/website/content/demo-pheonix-ui-port-of-psd-design-to-cross-platform-native-mobile-app.md
+++ b/docs/website/content/demo-pheonix-ui-port-of-psd-design-to-cross-platform-native-mobile-app.md
@@ -52,6 +52,6 @@ Blog Post: [link](https://beta.codenameone.com/template-phoenix-ui.html)
Source: [link](https://github.com/codenameone/PhoenixUI)
-JS Port: [link](http://www.codenameone.com/demos/Pheonix/)
+JS Port: [link](/demos/Pheonix/)
-Android App: [link](http://www.codenameone.com/demos/Pheonix/Pheonix-release.apk)
+Android App: [link](/demos/Pheonix/Pheonix-release.apk)
diff --git a/docs/website/content/demo-poker-demo.md b/docs/website/content/demo-poker-demo.md
index 0160e8a930..385c3a8b0e 100644
--- a/docs/website/content/demo-poker-demo.md
+++ b/docs/website/content/demo-poker-demo.md
@@ -31,8 +31,6 @@ The Poker demo was written as part of an article covering game development with
Notice that the JavaScript HTML5 demo is not what we have on the device where applications are translated to native code!
Since Apple doesn’t allow demos on itunes and doesn’t allow installing apps without itunes we can’t distribute the native app demos, you would need to build from source with an itunes demo account.
-Tutorial: [link](http://www.codenameone.com/manual/appendix-game.html)
-
Source: [link](https://github.com/codenameone/codenameone-demos/tree/master/CN1Poker)
JS Port: [link](/demos/Poker/)
@@ -41,6 +39,6 @@ Windows Desktop: [link](/demos/Poker/Poker.exe)
Mac App: [link](/demos/Poker/Poker.dmg)
-Android App: [link](http://www.codenameone.com/demos/Poker/Poker-release.apk)
+Android App: [link](/demos/Poker/Poker-release.apk)
ios: [link](#)
diff --git a/docs/website/content/demo-propertycross-demo.md b/docs/website/content/demo-propertycross-demo.md
index 39bc60704b..d75548f3c9 100644
--- a/docs/website/content/demo-propertycross-demo.md
+++ b/docs/website/content/demo-propertycross-demo.md
@@ -47,12 +47,12 @@ Tutorial: [link](https://www.udemy.com/learn-mobile-programming-by-example-with-
Source: [link](https://github.com/codenameone/PropertyCross)
-JS Port: [link](http://www.codenameone.com/demos/PropertyCross/)
+JS Port: [link](/demos/PropertyCross/)
-Windows Desktop: [link](http://www.codenameone.com/demos/PropertyCross/PropertyCross.exe)
+Windows Desktop: [link](/demos/PropertyCross/PropertyCross.exe)
-Mac App: [link](http://www.codenameone.com/demos/PropertyCross/PropertyCross.dmg)
+Mac App: [link](/demos/PropertyCross/PropertyCross.dmg)
-Android App: [link](http://www.codenameone.com/demos/PropertyCross/PropertyCross-release.apk)
+Android App: [link](/demos/PropertyCross/PropertyCross-release.apk)
ios: [link](#)
diff --git a/docs/website/content/demo-ratatouilles-restaurant.md b/docs/website/content/demo-ratatouilles-restaurant.md
index 192f800972..fc0de002ef 100644
--- a/docs/website/content/demo-ratatouilles-restaurant.md
+++ b/docs/website/content/demo-ratatouilles-restaurant.md
@@ -45,8 +45,8 @@ Blog Post: [link](https://beta.codenameone.com/blog/ratatouilles-restaurant-in-c
Source: [link](https://github.com/codenameone/RestaurantDemo)
-JS Port: [link](http://www.codenameone.com/demos/Restaurant/)
+JS Port: [link](/demos/Restaurant/)
-Android App: [link](http://www.codenameone.com/demos/Restaurant/Restaurant.apk)
+Android App: [link](/demos/Restaurant/Restaurant.apk)
ios: [link](#)
diff --git a/docs/website/content/demo-solitaire-klondike.md b/docs/website/content/demo-solitaire-klondike.md
index 6d4eb3d373..512f98c3a2 100644
--- a/docs/website/content/demo-solitaire-klondike.md
+++ b/docs/website/content/demo-solitaire-klondike.md
@@ -38,9 +38,9 @@ Since Apple doesn’t allow demos on itunes and doesn’t allow installing apps
Source: [link](https://github.com/codenameone/codenameone-demos/tree/master/Solitaire)
-JS Port: [link](http://www.codenameone.com/demos/Solitaire)
+JS Port: [link](/demos/Solitaire)
-Mac App: [link](http://www.codenameone.com/demos/Solitaire/Solitaire.dmg)
+Mac App: [link](/demos/Solitaire/Solitaire.dmg)
Android App: [link](https://play.google.com/store/apps/details?id=com.codename1.apps.solitaire)
diff --git a/docs/website/content/demo-swiftnotes-port-of-native-android-app-to-codename-one-iphone-ios-windows-and-javascript-targets.md b/docs/website/content/demo-swiftnotes-port-of-native-android-app-to-codename-one-iphone-ios-windows-and-javascript-targets.md
index 17adb23715..eba5de3102 100644
--- a/docs/website/content/demo-swiftnotes-port-of-native-android-app-to-codename-one-iphone-ios-windows-and-javascript-targets.md
+++ b/docs/website/content/demo-swiftnotes-port-of-native-android-app-to-codename-one-iphone-ios-windows-and-javascript-targets.md
@@ -48,7 +48,7 @@ Notice that the JavaScript HTML5 demo is not what we have on the device where ap
Source: [link](https://github.com/codenameone/SwiftnotesCN1/)
-JS Port: [link](http://www.codenameone.com/demos/SwiftnotesCN1/)
+JS Port: [link](/demos/SwiftnotesCN1/)
Universal Windows (UWP): [link](https://www.microsoft.com/library/errorpages/smarterror.aspx?correlationId=+GXvrjf4ckKpWyk9.0.0.3)
diff --git a/docs/website/content/developing-in-codename-one.md b/docs/website/content/developing-in-codename-one.md
index 9add083f33..de3ec8835f 100644
--- a/docs/website/content/developing-in-codename-one.md
+++ b/docs/website/content/developing-in-codename-one.md
@@ -10,15 +10,15 @@ hero_image: "/uploads/Group-2270.svg"

-- [JavaDocs of the API's](https://codenameone.com/javadoc/)
+- [JavaDocs of the API's](/javadoc/)
- [ Developers Guide (HTML)](/developer-guide.html)
-- [The Codename One Blog](https://codenameone.com/blog.html)
+- [The Codename One Blog](/blog/)
- [Developers Guide (PDF)](https://www.codenameone.com/files/developer-guide.pdf)
-- [ How Do I?](https://codenameone.com/how-do-i.html)
+- [How Do I?](/how-do-i/)
## The Codename One Tutorials & Courses
@@ -27,7 +27,7 @@ hero_image: "/uploads/Group-2270.svg"
- **[Hello World Tutorial](https://youtu.be/rl6z7DD2-vg)**
Shows off how to create a simple hello world application that works on all devices and looks native to all devices.
-- **[How Do I?](https://codenameone.com/how-do-i.html)**
+- **[How Do I?](/how-do-i/)**
Short video tutorials that walk you through common Codename One concepts and simple/basic ideas.
- **[Codename One Academy](https://debugagent.com/series/cn1)**
@@ -36,5 +36,5 @@ hero_image: "/uploads/Group-2270.svg"
- **[Tutorials & Documentation List](/developer-guide.html)**
An exhaustive list of tutorials and references in both written and video form.
-- **[Tutorial Tag In the Blog](https://codenameone.com/tag/tutorial)**
+- **[Tutorial Tag In the Blog](/blog/)**
The Codename One blog publishes tutorials regularly and you can follow all of them in this tag.
diff --git a/docs/website/content/eclipse-plugin-installation.md b/docs/website/content/eclipse-plugin-installation.md
index b7244df6e6..fd1b37d01f 100644
--- a/docs/website/content/eclipse-plugin-installation.md
+++ b/docs/website/content/eclipse-plugin-installation.md
@@ -6,6 +6,8 @@ slug: "eclipse-plugin-installation"
# Installing The Eclipse Plugin
+**IMPORTANT:** The IDE plugins are no longer supported. This page is here for historical purposes only. See [Getting Started](/getting-started/) for discussion of the maven build process.
+
1. [Home](/)
2. Developers
3. Installing The Eclipse Plugin
diff --git a/docs/website/content/home-test.md b/docs/website/content/home-test.md
index 1630c87b8d..6100925d8c 100644
--- a/docs/website/content/home-test.md
+++ b/docs/website/content/home-test.md
@@ -12,7 +12,7 @@ slug: "home-test"
## Trusted by 40k+ developers
-[Build an App](https://codenameone.com/getting-started.html)
+[Build an App](/getting-started/)
@@ -26,7 +26,7 @@ slug: "home-test"
#### Rapid cross-platform app development using **Java** or **Kotlin** with **100% code reuse**. Apps are compiled down to native code for maximum performance and a smooth user experience.
-[Learn about the Architecture](https://codenameone.com/introduction.html)
+[Learn about the Architecture](/introduction/)
## Developer-friendly Tooling
@@ -38,7 +38,7 @@ slug: "home-test"
#### Build beautiful UI with Codename One’s rich set of widgets, specifically designed for mobile apps. **Native** look and feel out of the box, but **fully themeable** using **CSS** to provide your own unique look.
-[Demo Showcase](https://codenameone.com/demos.html) [Component Gallery](https://www.codenameone.com/javadoc/com/codename1/ui/package-summary.html)
+[Demo Showcase](/demos/) [Component Gallery](/javadoc/com/codename1/ui/package-summary.html)
## Why Codename One?
@@ -66,7 +66,7 @@ When you make changes to your app’s CSS stylesheet, the changes are reflected
The core of Codename One is free and open source. GPL + CE licensed so it is free to use with commercial projects.
-[Explore the Features](https://codenameone.com/introduction.html)
+[Explore the Features](/introduction/)
## How it works
@@ -126,11 +126,11 @@ Can I access native APIs in my app?
Yes, you can access both system APIs and 3rd party native frameworks and libraries.
-[Learn about the Architecture](https://codenameone.com/introduction.html)
+[Learn about the Architecture](/introduction/)
## Made with Codename One
-BeRider Shared electric scooters in Prague. Highly rated app with Google Maps integration.[](https://play.google.com/store/apps/details?id=com.berider.app) [](https://apps.apple.com/us/app/berider-scooter-sharing/id1465804731)  Jubilee Motor Car insurance app by Jubilee General Insurance.[](https://play.google.com/store/apps/details?id=com.jubilee) [ Ordyx POS Point of Sale (POS) system.](https://play.google.com/store/apps/details?id=com.jubilee) [](https://www.ordyx.com/) HBZ Mobile banking app of Habib Bank AG Zurich, a Swiss multinational commercial bank based in Zurich, Switzerland.[](https://play.google.com/store/apps/details?id=com.bilogicsys.hmobile.json.main) [](https://apps.apple.com/ae/app/hbz/id1235586645)  Ana Paltel Paltel account manager app by Palestine Telecommunications Company.[](https://play.google.com/store/apps/details?id=com.paltel.mobapp&hl=en&gl=US) [](https://apps.apple.com/us/app/ana-paltel/id1131291631)  yHomework Math solver app. Highly rated, 1M+ installs.[](https://play.google.com/store/apps/details?id=com.MathUnderground.MathSolver) [](https://apps.apple.com/us/app/yhomework-math-solver/id604715759)  Oxbridge Academy Private distance learning college based in South Africa.[](https://play.google.com/store/apps/details?id=ox.app) [](https://apps.apple.com/za/app/oxbridge-academy-mobile-app/id964490340)  Arrivu Voice/AI technology solutions.[](https://www.arrivu.com/)  Previous Next [Demo Showcase](https://codenameone.com/demos.html)
+BeRider Shared electric scooters in Prague. Highly rated app with Google Maps integration.[](https://play.google.com/store/apps/details?id=com.berider.app) [](https://apps.apple.com/us/app/berider-scooter-sharing/id1465804731)  Jubilee Motor Car insurance app by Jubilee General Insurance.[](https://play.google.com/store/apps/details?id=com.jubilee) [ Ordyx POS Point of Sale (POS) system.](https://play.google.com/store/apps/details?id=com.jubilee) [](https://www.ordyx.com/) HBZ Mobile banking app of Habib Bank AG Zurich, a Swiss multinational commercial bank based in Zurich, Switzerland.[](https://play.google.com/store/apps/details?id=com.bilogicsys.hmobile.json.main) [](https://apps.apple.com/ae/app/hbz/id1235586645)  Ana Paltel Paltel account manager app by Palestine Telecommunications Company.[](https://play.google.com/store/apps/details?id=com.paltel.mobapp&hl=en&gl=US) [](https://apps.apple.com/us/app/ana-paltel/id1131291631)  yHomework Math solver app. Highly rated, 1M+ installs.[](https://play.google.com/store/apps/details?id=com.MathUnderground.MathSolver) [](https://apps.apple.com/us/app/yhomework-math-solver/id604715759)  Oxbridge Academy Private distance learning college based in South Africa.[](https://play.google.com/store/apps/details?id=ox.app) [](https://apps.apple.com/za/app/oxbridge-academy-mobile-app/id964490340)  Arrivu Voice/AI technology solutions.[](https://www.arrivu.com/)  Previous Next [Demo Showcase](/demos/)
## Loved by Developers, Trusted by Enterprises
diff --git a/docs/website/content/introduction.md b/docs/website/content/introduction.md
index 7f3e3d8028..6cc753746e 100644
--- a/docs/website/content/introduction.md
+++ b/docs/website/content/introduction.md
@@ -20,7 +20,7 @@ Codename One allows full access to each platform's native APIs via native interf
You can then fill in those stubs with native code. Using native interfaces, you can even integrate native UI widgets into your app seamlessly.
-[Learn more about Native Interfaces](https://codenameone.com/how_di_i/access-native-device-functionality-invoke-native-interfaces.html)
+[Learn more about Native Interfaces](how-do-i/how-do-i-access-native-device-functionality-invoke-native-interfaces/)

@@ -44,7 +44,7 @@ You can use third-party native libraries via native interfaces. You can embed na
There is already a wide assortment of cn1libs developed by both Codename One and third-party developers. Notable cn1libs include Google Maps support, WebSocket support, and Parse support.
-[Learn More about CN1libs](https://codenameone.com/cn1libs.html)
+[Learn More about CN1libs](/cn1libs/)
## Platform Architecture (Accordion)
@@ -53,15 +53,15 @@ There is already a wide assortment of cn1libs developed by both Codename One and
{{< /collapse >}}
{{< collapse summary="Android Architecture" >}}
-[](https://codenameone.com/wp-content/uploads/2020/09/android-architecture-.svg)
+[
{{< /collapse >}}
{{< collapse summary="UWP Architecture" >}}
-[](https://codenameone.com/wp-content/uploads/2020/09/UWP-Architecture-.svg)
+[](/uploads/UWP-Architecture-.svg)
{{< /collapse >}}
{{< collapse summary="Javascript Port Architecture" >}}
-[](https://codenameone.com/wp-content/uploads/2020/09/Javascript-Port-Architecture-.svg)
+[](/uploads/Javascript-Port-Architecture-.svg)
{{< /collapse >}}
## Compiled to Native
diff --git a/docs/website/content/untitled-2.md b/docs/website/content/untitled-2.md
deleted file mode 100644
index 589a651e2a..0000000000
--- a/docs/website/content/untitled-2.md
+++ /dev/null
@@ -1,58 +0,0 @@
----
-title: "Untitled"
-date: 2015-03-03
-slug: "untitled-2"
----
-
-
-
-# Codename One Build Server
-
-This is where you can manage all your builds, settings and subscription details
-
-1. [Home](/)
-2. Build Server
-
-
-
-- [Builds](#builds-tab)
-- [Subscription](#subscription-tab)
-- [Account](#account-tab)
-
-Check out the new [Codename One Build Web App](https://cloud.codenameone.com/buildapp/index.html), [Android App](https://play.google.com/store/apps/details?id=com.codename1.build.app) and [iOS App (Beta)](https://www.codenameone.com/blog/build-app-on-ios.html)
-Your Builds appear here. Notice that older builds are automatically deleted to preserve server space!
-
-
-
-You can purchase annual pro/enterprise subscriptions via SWIFT bank transfers based on a purchase order invoice by clicking one of these buttons and following the instructions within.
-Annual Professional Subscription
-Annual Enterprise Subscription
-
-If you wish to cancel your subscription you can do so at any time through the PayPal interface
-[](https://www.paypal.com/cgi-bin/webscr?cmd=_subscr-find&alias=FM42CH7XVHZP4)
-notice you can use any credit card with PayPal!
-
-Subscription plans prevent free users from abusing the servers by sending too many build requests and weighing down the servers.
-To learn more about the benefits of various subscription levels and to upgrade your account check out [this page](/pricing.html).
-
-First Name:
-
-Surname:
-
-Company Name:
-
-E-mail:
-
-Password:
-
-Password Verification:
-
-Token: \[Undefined\]
-
-REFERRAL LINK: \[Undefined\]
-
-Update Details
-
-
-
-
diff --git a/docs/website/content/untitled.md b/docs/website/content/untitled.md
deleted file mode 100644
index a9db2ecf09..0000000000
--- a/docs/website/content/untitled.md
+++ /dev/null
@@ -1,831 +0,0 @@
----
-title: "Untitled"
-date: 2020-08-14
-slug: "untitled"
----
-
-# cn1libs
-
-1. [Home](/)
-2. cn1libs
-
-## Extend Codename One With Native & Generic Libraries/Plugins
-
-In this page we list plugins/extensions from various sources
-
-Codename One can be extended with native or Java code. However because of its flexibility it's somewhat difficult to leverage the existing JAR format to its full extent. That's why Codename One introduced the `cn1lib` format which allows 3rd parties to package extensions to Codename One that can be used anywhere.
-To learn more about the cn1lib format you can check out the Codename One Developer Guide.
-
-You can install any one of the extensions listed here by launching the Codename One settings and selecting to install an extension button:
-
-
-
-Notice that this list is generated from [this github repository](https://github.com/codenameone/CodenameOneLibs) you can submit your own cn1lib easily to the list thru a pull request as explained there.
-
-[The Developer Guide cn1libs section](/manual/advanced-topics.html#_libraries_cn1lib)
-
-### Form to crop and resize your images
-
-- Crop and resize your images whatsapp style. Ensures final cropped images have equal width and heights. Resizes to your desired dimensions. Allows for a minimum image size
-- Supports iOS
-- Supports Android
-- By Javier Anton
-
-MIT
-
-[Get It](https://github.com/javieranton-zz/PhotoCropper)
-
-### Crisp Codename One SDK
-
-- Integrate Crisp chat and CRM into your app
-- Supports all platforms
-- By Codename One
-
-MIT
-
-[Get It](https://github.com/codenameone/CrispCodenameOneSDK)
-
-### Sign-in with Apple Support
-
-- Add sign-in with apple support
-- Supports all platforms
-- By Codename One
-
-GPL+CE
-
-[Get It](https://github.com/shannah/cn1-applesignin)
-
-### CN1JailbreakDetect
-
-- Detect if device is rooted/jailbroken
-- Supports iOS
-- Supports Android
-- By Codename One
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/CN1JailbreakDetect)
-
-### Codename One Asciidoctor
-
-- Asciidoc to HTML5 converter for Codename One
-- Supports all platforms
-- By Codename One
-
-MIT
-
-[Get It](https://github.com/shannah/CN1Asciidoctor)
-
-### CodeRAD
-
-- MVC, Rapid Application Development library
-- Supports all platforms
-- By Codename One
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/CodeRAD)
-
-### RAD Chat Room
-
-- A full featured Chat Room UI Component
-- Supports all platforms
-- By Codename One
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/RADChatRoom)
-
-### Native Logs Reader
-
-- A small library to get easily the native logs of Android and iOS.
-- Supports iOS
-- Supports Android
-- By Francesco Galgani
-
-CC0 - Public Domain
-
-[Get It](https://github.com/jsfan3/CN1Libs-NativeLogsReader)
-
-### Video Optimizer
-
-- It allows to get info about a video (duration, bitrate, size), get a preview image of a video and optimize a video for fast upload. It can also be used to check if a given file is a supported video.
-- Supports iOS
-- Supports Android
-- By Francesco Galgani
-
-CC0 + LGPL v.3
-
-[Get It](https://github.com/jsfan3/CN1Libs-VideoOptimizer/)
-
-### Wowza Live Streaming Events
-
-- The purpose of this CN1Lib is to add live streaming capabilities to iOS and Android Codename One apps, hiding all the complexities and reducing the effort.
-- Supports iOS
-- Supports Android
-- By Francesco Galgani
-
-Mixed
-
-[Get It](https://github.com/jsfan3/CN1Libs-WowzaLiveStreaming/)
-
-### Device
-
-- A small library to get the market (consumer-friendly) name, model, and manufacturer of devices.
-- Supports iOS
-- Supports Android
-- By Diamond Dev Group
-
-MIT License
-
-[Get It](https://github.com/diamonddevgroup/CN1-Device)
-
-### Camera Kit
-
-- Low level camera access API
-- Supports iOS
-- Supports Android
-- Supports Simulator
-- Supports Javascript
-- By Codename One
-
-MIT License
-
-[Get It](https://github.com/codenameone/CameraKitCodenameOne/tree/master)
-
-### comScore Analytics
-
-- comScore mobile metrix / analytics support for Codename One
-- Supports iOS
-- Supports Android
-- By Diamond Dev Group
-
-MIT License
-
-[Get It](https://github.com/diamonddevgroup/comScore-CodenameOne)
-
-### SMSInterceptor
-
-- Intercept incoming SMS on supported platforms in Codename One apps
-- Supports Android
-- By Diamond Dev Group
-
-MIT License
-
-[Get It](https://github.com/diamonddevgroup/SMSInterceptor)
-
-### SMSActivation
-
-- Implements the full activation via SMS user signup process
-- Supports all platforms
-- By Codename One
-
-MIT License
-
-[Get It](https://github.com/codenameone/SMSActivation/)
-
-### AnimatedGifSupport
-
-- Support for Animated GIFs
-- Supports all platforms
-- By Codename One
-
-MIT License
-
-[Get It](https://github.com/codenameone/AnimatedGifSupport)
-
-### Server data caching library
-
-- Easily enable and control device cache for remote data
-- Supports all platforms
-- By Yaakov Gesher
-
-MIT License
-
-[Get It](https://github.com/jegesh/cn1-object-cacher)
-
-### BraintreeCodenameOne
-
-- Provides Braintree (PayPal) API support for Codename One apps
-- Supports iOS
-- Supports Android
-- By Codename One
-
-MIT License
-
-[Get It](https://github.com/codenameone/BraintreeCodenameOne)
-
-### FingerprintScanner
-
-- Fingerprint/TouchID support
-- Supports iOS
-- Supports Android
-- By Codename One
-
-MIT License
-
-[Get It](https://github.com/codenameone/FingerprintScanner)
-
-### CN1-Helper
-
-- A Helper library for basic styling with code in Codename One. This eliminates the need to have endless UIID in your GUI builder
-- Supports iOS
-- Supports Android
-- Supports Javascript
-- Supports UWP
-- Supports Simulator
-- Supports RIM
-- Supports J2ME
-- By Diamond Dev Group
-
-MIT License
-
-[Get It](https://github.com/diamondobama/cn1-Helper)
-
-### Intercom Support
-
-- Adds support for integrating intercom.io for customer support and cross screen insight
-- Supports iOS
-- Supports Android
-- By Codename One
-
-GPL+Classpath Exception
-
-[Get It](https://github.com/codenameone/IntercomSupport/)
-
-### SSL Certificate Fingerprint
-
-- Checks that the certificate of a server matches a specific value
-- Supports Desktop
-- Supports iOS
-- Supports Android
-- By Codename One
-
-GPL+Classpath Exception
-
-[Get It](https://github.com/codenameone/SSLCertificateFingerprint/tree/master)
-
-### Drag and Drop from the native desktop OS
-
-- Allows the desktop/JavaScript versions to receive files dropped into them
-- Supports Desktop
-- Supports JavaScript
-- By Steve Hannah
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/cn1-native-data-transfer)
-
-### Kotlin support for Codename One
-
-- Adds support for Kotlin in Codename One apps. (Requires IntelliJ IDEA)
-- Supports iOS
-- Supports Android
-- Supports Javascript
-- Supports UWP
-- Supports Simulator
-- Supports RIM
-- Supports J2ME
-- By Codename One
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/codenameone-kotlin)
-
-### Admob Fullscreen Ads
-
-- Admob Fullscreen Ads library, supports iOS and Android
-- Supports iOS
-- Supports Android
-- By Ram (creator of yhomework)
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/admobfullscreen-codenameone)
-
-### StartApp Fullscreen Ads
-
-- StartApp Fullscreen Ads library, supports iOS and Android
-- Supports iOS
-- Supports Android
-- By CodenameOne
-
-Apache 2.0
-
-[Get It](https://github.com/chen-fishbein/startapp-codenameone)
-
-### Circle Progress
-
-- Circle Progress Components
-- Supports iOS
-- Supports Android
-- By CodenameOne
-
-MIT License
-
-[Get It](https://github.com/chen-fishbein/CN1CircleProgress)
-
-### Codename One Data Access Library
-
-- Provides a Data access layer for SQLite databases in Codename One.
-- Supports iOS
-- Supports Android
-- Supports Javascript
-- Supports Simulator
-- By Steve Hannah
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/cn1-data-access-lib)
-
-### SpatiaLite Database
-
-- Provides SpatiaLite database support for Codename One.
-- Supports iOS
-- Supports Android
-- Supports Simulator
-- By Steve Hannah
-
-MPL Tri-License
-
-[Get It](https://github.com/shannah/cn1-spatialite)
-
-### Generic Webservice Client
-
-- Web service client for connecting to a RESTful web service.
-- Supports iOS
-- Supports Android
-- Supports Javascript
-- Supports UWP
-- Supports Simulator
-- Supports RIM
-- Supports J2ME
-- By Steve Hannah
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/cn1-generic-webservice-client)
-
-### CN1Xataface
-
-- Web service client for connecting to a MySQL back-end.
-- Supports iOS
-- Supports Android
-- Supports Javascript
-- Supports UWP
-- Supports Simulator
-- Supports RIM
-- Supports J2ME
-- By Steve Hannah
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/cn1-xataface)
-
-### Flurry Library
-
-- This plugin supports flurry analytics and Interstitial Ads (Full Screen Ads) \\nThe library is implemented for Android and iOS.
-- Supports iOS
-- Supports Android
-- By Steve Hannah, Chen Fishbein, Sam Lotti
-
-Apache 2.0
-
-[Get It](https://github.com/chen-fishbein/flurry-codenameone)
-
-### Codename One CodeScanner Library
-
-- This library provides code scanning (QR code and Bar code) support for Codename One
-- Supports iOS
-- Supports Android
-- Supports Blackberry
-- By CodenameOne
-
-Apache 2.0
-
-[Get It](https://github.com/codenameone/cn1-codescan)
-
-### Scandit Codescanner
-
-- This library provides code scanning (QR code and Bar code) using the Scandit SDK. NOTE: This library requires you to install the iOS and Android native SDKs into your app separately. See installation instructions on website.
-- Supports iOS
-- Supports Android
-- By CodenameOne
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/cn1-codescan-scandit)
-
-### QRScanner
-
-- CN1Lib for using ZBar scanning in Android apps. This removes the reliance on an external scanning app to be installed on Android. Important: Currently requires Android API level 21 which might cause issues
-- Supports Android
-- By CodenameOne
-
-MIT License
-
-[Get It](https://github.com/littlemonkeyltd/QRScanner)
-
-### Zip Support
-
-- This is a Codename One library for Zip support based on the code from the zipme project
-- Supports all platforms
-- By CodenameOne
-
-Modified GPL
-
-[Get It](https://github.com/codenameone/ZipSupport)
-
-### Codename One Freshdesk SDK
-
-- Codename One support for Freshdesk.\\nThis library wraps the native iOS and Android SDKs to provide a single cross-platform Java API\\n that can be used in a Codename One project.
-- Supports iOS
-- Supports Android
-- By Steve Hannah
-
-GPL+Classpath Exception
-
-[Get It](http://shannah.github.io/cn1-freshdesk/)
-
-### Telephony
-
-- Simcard information support for codename one applications\\nThis library can retrieve MCC, MNC, ISO country code and carrier name information from the simcard\\nCurrently supported in Android and iOS.
-- Supports iOS
-- Supports Android
-- By Fabricio Cabeca (from Pmovil)
-
-MIT License
-
-[Get It](https://github.com/Pmovil/Telephony)
-
-### Parse4CN1
-
-- Parse4CN1 - Codename One Library for Parse. Currrent version matches release v3.1.1
-- Supports iOS
-- Supports Android
-- Supports UWP
-- By Chidiebere Okwudire (from SMash ICT Solutions)
-
-Apache License
-
-[Get It](https://github.com/sidiabale/parse4cn1)
-
-### Core2d
-
-- 2d gaming library
-- Supports all platforms
-- By Antonio Mannucci
-
-MIT License
-
-[Get It](https://github.com/chen-fishbein/core2d-cn1lib)
-
-### codenameone-connectivity
-
-- Simple library for getting basic connection information on codename one
-- Supports iOS
-- Supports Android
-- By Nick K (from littlemonkey)
-
-MIT License
-
-[Get It](https://github.com/littlemonkeyltd/codenameone-connectivity)
-
-### Google Analytics
-
-- Native Google Analytics Library
-- Supports iOS
-- Supports Android
-- By Ivan (from Pmovil)
-
-MIT License
-
-[Get It](https://github.com/Pmovil/cn1libs-native-ga)
-
-### Calendar Library
-
-- Allows Codename One applications to use the device calendar.
-- Supports iOS
-- Supports Android
-- By Andreas Heydler, Kapila de Lanerolle
-
-GPL+Classpath Exception
-
-[Get It](https://github.com/chen-fishbein/codenameone-calendar)
-
-### Codename Sockets Library
-
-- This library was started as an attempt to add sockets support to Codename One. \\nSupports iOS, Android, Blackberry, JavaSE and J2ME.
-- Supports all platforms
-- By Steve Hannah
-
-Unclear
-
-[Get It](https://github.com/shannah/CN1Sockets)
-
-### CN1 Native Controls
-
-- Includes a native select widget that is useful in the Javascript port. May be expanded to include other native widgets.
-- Supports all platforms
-- By Steve Hannah
-
-MIT license
-
-[Get It](https://github.com/shannah/cn1-native-controls)
-
-### Codename One WebSockets Library
-
-- This library adds WebSocket client support for Codename One apps.
-- Supports iOS
-- Supports Android
-- Supports Javascript
-- Supports Simulator
-- Supports UWP
-- By Steve Hannah
-
-MIT License
-
-[Get It](https://github.com/shannah/cn1-websockets)
-
-### IRBlaster
-
-- Provides API to use the IR (Infrared) Emitter on Selected Devices
-- Supports Android
-- By Steve Hannah
-
-Apache License
-
-[Get It](https://github.com/shannah/IRBlaster)
-
-### Codename One MP3 Encoder
-
-- Adds support for recording MP3 audio in simulator
-- Supports Simulator
-- By Steve Hannah
-
-MIT License
-
-[Get It](https://github.com/shannah/CN1MP3Encoder)
-
-### Codename One Media Utilies
-
-- Utility classes for working with media
-- Supports all platforms
-- By Steve Hannah
-
-Apache
-
-[Get It](https://github.com/shannah/CN1MediaTools)
-
-### Embedded Webserver Library
-
-- Add an embedded web server to Codename One apps.
-- Supports iOS
-- Supports Android
-- Supports Simulator
-- By Steve Hannah
-
-MIT License
-
-[Get It](https://github.com/shannah/CN1Webserver)
-
-### Codename One Pubnub SDK
-
-- Pubnub SDK for Codename One Apps
-- Supports iOS
-- Supports Android
-- By Pubnub
-
-PubNub license
-
-[Get It](https://www.pubnub.com/docs/codenameone-java/data-streams-publish-and-subscribe)
-
-### Dropbox SDK
-
-- Dropbox SDK for Codename One Apps
-- Supports iOS
-- Supports Android
-- Supports Windows Phone
-- Supports Javascript
-- By CodenameOne
-
-GPL+Classpath Exception
-
-[Get It](https://github.com/chen-fishbein/dropbox-codenameone-sdk)
-
-### BouncyCastle SDK
-
-- Bouncy Castle Crypto API for Codename One
-- Supports all platforms
-- By CodenameOne
-
-GPL+Classpath Exception
-
-[Get It](https://github.com/chen-fishbein/bouncy-castle-codenameone-lib)
-
-### Objective-C Bridge
-
-- Access Objective-C SDKs directly from Java
-- Supports iOS
-- By CodenameOne
-
-BSD
-
-[Get It](https://github.com/shannah/CN1ObjCBridge)
-
-### SalesForce SDK
-
-- SalesForce SDK for Codename One
-- Supports iOS
-- Supports Android
-- Supports Windows Phone
-- Supports Javascript
-- By Bertrand Cirot
-
-LGPL
-
-[Get It](https://www.codenameone.com/blog/combining-salesforce-and-codename-one.html)
-
-### Codename One CKeditor Component
-
-- A WYSIWYG HTML Editor component for Codename One
-- Supports iOS
-- Supports Android
-- Supports Windows Phone
-- Supports Javascript
-- By Steve Hannah
-
-Unclear
-
-[Get It](https://github.com/shannah/cn1-ckeditor)
-
-### Codename One JSON Library
-
-- A library to read and write JSON in Codename One
-- Supports all platforms
-- By Steve Hannah
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/CN1JSON)
-
-### Codename One HTML Parser
-
-- A library for parsing HTML to standard XML DOM
-- Supports all platforms
-- By Steve Hannah
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/CN1HTMLParser)
-
-### CN1Image Map component
-
-- An image map component for rendering an image with clickable areas.
-- Supports all platforms
-- By Steve Hannah
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/CN1ImageMap)
-
-### Codename One Tar Library
-
-- A library for reading and writing TAR files in Codename One
-- Supports all platforms
-- By Steve Hannah
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/CN1JTar)
-
-### Codename One Google Native Maps Support
-
-- Allows Codename One developers to embed native Google Maps on iOS, Android, and Javascript. Uses Google maps in BrowserComponent on simulator and falls back to Codename One\\n MapComponent on UWP.
-- Supports iOS
-- Supports Android
-- Supports Javascript
-- By CodenameOne
-
-Apache 2.0
-
-[Get It](https://github.com/codenameone/codenameone-google-maps)
-
-### sensors-codenameone
-
-- Sensors library for Codename One, implemented on Android and iOS
-- Supports iOS
-- Supports Android
-- By CodenameOne
-
-Apache 2.0
-
-[Get It](https://github.com/chen-fishbein/sensors-codenameone)
-
-### bluetoothle-codenameone
-
-- Bluethooth LE Library for Codename One apps
-- Supports iOS
-- Supports Android
-- By CodenameOne
-
-MIT License
-
-[Get It](https://github.com/codenameone/bluetoothle-codenameone)
-
-### CN1FontBox
-
-- Codename One Port of FontBox. Provides TTF font support with added features like stroking, filling, scaling, transforming, etc...
-- Supports iOS
-- Supports Android
-- Supports Javascript
-- Supports UWP
-- Supports Simulator
-- By Steve Hannah
-
-MIT License
-
-[Get It](https://github.com/shannah/CN1FontBox)
-
-### cn1-filechooser
-
-- Adds support for a native file chooser for opening files of any specified set of extensions and/or mimetypes.
-- Supports iOS
-- Supports Android
-- Supports Javascript
-- Supports UWP
-- Supports Simulator
-- By Codename One
-
-MIT License
-
-[Get It](https://github.com/shannah/cn1-filechooser)
-
-### Codename One GeoViz Library
-
-- This library provides support for loading GeoJSON data in a Codename One application. It also provides a component to render the GeoJSON data.
-- Supports iOS
-- Supports Android
-- Supports Javascript
-- Supports Simulator
-- By Steve Hannah
-
-GPL+Classpath Exception
-
-[Get It](https://github.com/shannah/CN1GeoViz)
-
-### Codename One XMLView Library
-
-- A codename one UI component for rendering XML.
-- Supports all platforms
-- By Steve Hannah
-
-Apache 2.0
-
-[Get It](https://github.com/shannah/cn1-xmlview)
-
-### Codename One Offline Maps Library
-
-- MapProvider that works with the Codename One MapComponent class to provide support for offline maps
-- Supports all platforms
-- By Steve Hannah
-
-LGPL
-
-[Get It](https://github.com/shannah/CN1OfflineMaps)
-
-### Codename One Cloudinary Support
-
-- This library adds support for the Cloudinary image management service to Codename One apps. The library itself is a direct port of the Cloudinary Java SDK.
-- Supports all platforms
-- By Steve Hannah
-
-MIT
-
-[Get It](https://github.com/shannah/cloudinary-codenameone)
-
-### QR Code generator
-
-- A partial port of Zxing for j2me to CN1 for generating QR code
-- Supports all platforms
-- By Roy Wang
-
-Apache 2.0
-
-[Get It](https://github.com/rwanghk/QRMaker)
-
-### ZXing Library
-
-- A port of ZXing Barcode scanner / generator to CN1
-- Supports all platforms
-- By Roy Wang
-
-Apache 2.0
-
-[Get It](https://github.com/rwanghk/ZXing-CN1)
-
-
-
-Please enable JavaScript to view the [comments powered by Disqus.](https://disqus.com/?ref_noscript)
-
-
diff --git a/scripts/website/fetch_ota_skins.sh b/scripts/website/fetch_ota_skins.sh
new file mode 100755
index 0000000000..2783d7604c
--- /dev/null
+++ b/scripts/website/fetch_ota_skins.sh
@@ -0,0 +1,97 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
+WEBSITE_STATIC_DIR="${REPO_ROOT}/docs/website/static"
+OTA_DIR="${WEBSITE_STATIC_DIR}/OTA"
+RELEASES_URL="https://api.github.com/repos/codenameone/codenameone-skins/releases/latest"
+
+if ! command -v curl >/dev/null 2>&1; then
+ echo "curl is required to download OTA skins." >&2
+ exit 1
+fi
+
+if ! command -v python3 >/dev/null 2>&1; then
+ echo "python3 is required to parse release metadata." >&2
+ exit 1
+fi
+
+if ! command -v tar >/dev/null 2>&1; then
+ echo "tar is required to extract OTA skins." >&2
+ exit 1
+fi
+
+tmp_dir="$(mktemp -d)"
+cleanup() {
+ rm -rf "${tmp_dir}"
+}
+trap cleanup EXIT
+
+release_json="${tmp_dir}/release.json"
+archive_file="${tmp_dir}/ota.tar.gz"
+extract_dir="${tmp_dir}/extract"
+
+curl_args=(
+ -fsSL
+ -H "Accept: application/vnd.github+json"
+ -H "X-GitHub-Api-Version: 2022-11-28"
+)
+if [ -n "${GITHUB_TOKEN:-}" ]; then
+ curl_args+=(-H "Authorization: Bearer ${GITHUB_TOKEN}")
+fi
+
+echo "Fetching latest codenameone-skins release metadata..." >&2
+curl "${curl_args[@]}" -o "${release_json}" "${RELEASES_URL}"
+
+asset_url="$(
+ python3 -c '
+import json, re, sys
+with open(sys.argv[1], "r", encoding="utf-8") as f:
+ payload = json.load(f)
+assets = payload.get("assets", [])
+matches = []
+for asset in assets:
+ name = asset.get("name", "")
+ if re.match(r"^ota-.*\.tar\.gz$", name):
+ matches.append((name, asset.get("browser_download_url", "")))
+if not matches:
+ raise SystemExit("No ota-*.tar.gz asset found in latest release.")
+matches.sort(key=lambda pair: pair[0], reverse=True)
+print(matches[0][1])
+' "${release_json}"
+)"
+
+if [ -z "${asset_url}" ]; then
+ echo "Resolved OTA asset URL is empty." >&2
+ exit 1
+fi
+
+echo "Downloading OTA skins archive..." >&2
+curl "${curl_args[@]}" -o "${archive_file}" "${asset_url}"
+
+mkdir -p "${extract_dir}"
+tar -xzf "${archive_file}" -C "${extract_dir}"
+
+skins_path="$(find "${extract_dir}" -type f -name Skins.xml | head -n 1)"
+if [ -z "${skins_path}" ]; then
+ echo "Skins.xml not found in OTA archive." >&2
+ exit 1
+fi
+
+payload_root="$(dirname "${skins_path}")"
+
+rm -rf "${OTA_DIR}"
+mkdir -p "${OTA_DIR}"
+
+(
+ shopt -s dotglob nullglob
+ cp -a "${payload_root}"/* "${OTA_DIR}/"
+)
+
+if [ ! -f "${OTA_DIR}/Skins.xml" ]; then
+ echo "Failed to stage OTA/Skins.xml at ${OTA_DIR}/Skins.xml." >&2
+ exit 1
+fi
+
+echo "Staged OTA skins into ${OTA_DIR}" >&2
diff --git a/scripts/website/update_developer_guide_redirect.sh b/scripts/website/update_developer_guide_redirect.sh
new file mode 100755
index 0000000000..9feb874fc2
--- /dev/null
+++ b/scripts/website/update_developer_guide_redirect.sh
@@ -0,0 +1,92 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
+REDIRECTS_FILE="${REPO_ROOT}/docs/website/static/_redirects"
+RELEASES_URL="https://api.github.com/repos/codenameone/CodenameOne/releases/latest"
+BEGIN_MARKER="# BEGIN: generated developer-guide.pdf redirect"
+END_MARKER="# END: generated developer-guide.pdf redirect"
+
+if [ ! -f "${REDIRECTS_FILE}" ]; then
+ echo "Redirect file not found: ${REDIRECTS_FILE}" >&2
+ exit 1
+fi
+
+if ! command -v curl >/dev/null 2>&1; then
+ echo "curl is required to fetch release metadata." >&2
+ exit 1
+fi
+
+if ! command -v python3 >/dev/null 2>&1; then
+ echo "python3 is required to parse release metadata." >&2
+ exit 1
+fi
+
+tmp_dir="$(mktemp -d)"
+cleanup() {
+ rm -rf "${tmp_dir}"
+}
+trap cleanup EXIT
+
+release_json="${tmp_dir}/release.json"
+new_redirects="${tmp_dir}/_redirects.new"
+
+curl_args=(
+ -fsSL
+ -H "Accept: application/vnd.github+json"
+ -H "X-GitHub-Api-Version: 2022-11-28"
+)
+if [ -n "${GITHUB_TOKEN:-}" ]; then
+ curl_args+=(-H "Authorization: Bearer ${GITHUB_TOKEN}")
+fi
+
+echo "Fetching latest CodenameOne release metadata..." >&2
+curl "${curl_args[@]}" -o "${release_json}" "${RELEASES_URL}"
+
+read -r release_tag asset_url <<<"$(
+ python3 -c '
+import json, sys
+with open(sys.argv[1], "r", encoding="utf-8") as f:
+ payload = json.load(f)
+tag = payload.get("tag_name", "")
+if not tag:
+ raise SystemExit("Latest release tag_name is missing.")
+assets = payload.get("assets", [])
+asset_url = ""
+for asset in assets:
+ if asset.get("name") == "developer-guide.pdf":
+ asset_url = asset.get("browser_download_url", "")
+ break
+if not asset_url:
+ raise SystemExit("developer-guide.pdf asset not found in latest release.")
+print(f"{tag} {asset_url}")
+' "${release_json}"
+)"
+
+if [ -z "${asset_url}" ]; then
+ echo "Resolved developer-guide.pdf URL is empty." >&2
+ exit 1
+fi
+
+awk -v begin="${BEGIN_MARKER}" -v end="${END_MARKER}" '
+ $0 == begin { skip = 1; next }
+ $0 == end { skip = 0; next }
+ !skip { print }
+' "${REDIRECTS_FILE}" > "${new_redirects}"
+
+{
+ printf '\n%s\n' "${BEGIN_MARKER}"
+ printf '# Source release: %s\n' "${release_tag}"
+ printf '/files/developer-guide.pdf %s 302\n' "${asset_url}"
+ printf '%s\n' "${END_MARKER}"
+} >> "${new_redirects}"
+
+mv "${new_redirects}" "${REDIRECTS_FILE}"
+
+if ! grep -Fq "/files/developer-guide.pdf ${asset_url} 302" "${REDIRECTS_FILE}"; then
+ echo "Failed to write developer-guide redirect into ${REDIRECTS_FILE}" >&2
+ exit 1
+fi
+
+echo "Updated redirect: /files/developer-guide.pdf -> ${asset_url}" >&2