{"id":20279748,"url":"https://github.com/genieframework/stipplemakie.jl","last_synced_at":"2026-03-06T11:04:56.562Z","repository":{"id":248938234,"uuid":"829883601","full_name":"GenieFramework/StippleMakie.jl","owner":"GenieFramework","description":null,"archived":false,"fork":false,"pushed_at":"2025-10-05T22:08:35.000Z","size":66,"stargazers_count":16,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-10-06T00:13:37.117Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Julia","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GenieFramework.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-07-17T07:24:24.000Z","updated_at":"2025-10-05T22:08:39.000Z","dependencies_parsed_at":"2024-07-18T02:10:01.280Z","dependency_job_id":"b13cf4ce-cc80-444a-a47d-bf102f609578","html_url":"https://github.com/GenieFramework/StippleMakie.jl","commit_stats":null,"previous_names":["genieframework/stipplemakie.jl"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/GenieFramework/StippleMakie.jl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GenieFramework%2FStippleMakie.jl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GenieFramework%2FStippleMakie.jl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GenieFramework%2FStippleMakie.jl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GenieFramework%2FStippleMakie.jl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GenieFramework","download_url":"https://codeload.github.com/GenieFramework/StippleMakie.jl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GenieFramework%2FStippleMakie.jl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30173376,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T07:56:45.623Z","status":"ssl_error","status_checked_at":"2026-03-06T07:55:55.621Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-14T13:32:57.374Z","updated_at":"2026-03-06T11:04:51.550Z","avatar_url":"https://github.com/GenieFramework.png","language":"Julia","funding_links":[],"categories":[],"sub_categories":[],"readme":"# StippleMakie\n\nStippleMakie is a plugin for the GenieFramework to enable Makie plots via WGLMakie\n\n\n### Demo App\nDon't be surprised if the first loading time of the Webpage is very long (about a minute).\n```julia\nusing Stipple\nusing Stipple.ReactiveTools\nusing StippleUI\nimport Genie.Server.openbrowser\n\nusing StippleMakie\n\nStipple.enable_model_storage(false)\n\n# ------------------------------------------------------------------------------------------------\n\n# if required set a different port, url or proxy_port for Makie's websocket communication, e.g. 8001\n# if not specified, Genie's settings are applied for listen_url and proxy_url and Makie's (Bonito's) settings\n# are applied for the ports\n# configure_makie_server!(listen_port = 8001)\n\n# Example settings for a proxy configuration:\n# proxy_host and proxy_port will be taken from the serving port, just specify a different path\nconfigure_makie_server!(listen_port = 8001, proxy_url = \"/makie\")\n# specify the proxy_port explicitly\n# configure_makie_server!(listen_port = 8001, proxy_url = \"/makie\", proxy_port = 8080)\n\nstartproxy(8080)\n\n@app MakieDemo begin\n    @out fig1 = MakieFigure()\n    @out fig2 = MakieFigure()\n    @in hello = false\n\n    @onbutton hello @notify \"Hello World!\"\n\n    @onchange isready begin\n        init_makiefigures(__model__)\n        # the viewport changes when the figure is ready to be written to\n        onready(fig1) do\n            Makie.scatter(fig1.fig[1, 1], (0:4).^3)\n            Makie.heatmap(fig2.fig[1, 1], rand(5, 5))\n            Makie.scatter(fig2.fig[1, 2], (0:4).^3)\n        end\n    end\nend\n\n\nUI::ParsedHTMLString = column(style = \"height: 80vh; width: 98vw\", [\n    h4(\"MakiePlot 1\")\n    cell(col = 4, class = \"full-width\", makie_figure(:fig1))\n    h4(\"MakiePlot 2\")\n    cell(col = 4, class = \"full-width\", makie_figure(:fig2))\n    btn(\"Hello\", @click(:hello), color = \"primary\")\n])\n\nui() = UI\n\nroute(\"/\") do\n    WGLMakie.Page()\n    global model = @init MakieDemo    \n    html!(ui, layout = Stipple.ReactiveTools.DEFAULT_LAYOUT(head_content = [makie_dom(model)]), model = model, context = @__MODULE__)\n\n    # alternatively, you can use the following line to render the page without the default layout\n    # page(model, ui, prepend = makie_dom(model)) |\u003e html\nend\n\nup()\nopenbrowser(\"http://localhost:8080\")\n```\n![Form](docs/demoapp.png)\n\nAs WGLMakie needs its own websocket port to communicate with the plots, operation behind a proxy needs more careful proxy setup.\nAfter setting up the server, e.g. with `configure_makie_server!(listen_port = 8001, proxy_base_path = \"/makie\")`, `nginx_conf()` returns a valid\nconfiguration for an nginx server to accomodate running Genie and Makie over the same port.\nHere's the nginx configuration for above configuration.\n\n```\nhttp {\n    upstream makie {\n        server localhost:8001;\n    }\n\n    upstream genie {\n        server localhost:8000;\n    }\n\n    server {\n        listen 8080;\n\n        # Proxy traffic to /makie/* to http://localhost:8001/*\n        location /makie {\n            proxy_pass http://makie/;\n            \n            # WebSocket headers\n            proxy_http_version 1.1;\n            proxy_set_header Upgrade $http_upgrade;\n            proxy_set_header Connection \"upgrade\";\n            \n            # Preserve headers\n            proxy_set_header Host $host;\n            proxy_set_header X-Real-IP $remote_addr;\n            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n            proxy_set_header X-Forwarded-Proto $scheme;\n        }\n\n        # Proxy all other traffic to http://localhost:8000/*\n        location / {\n            proxy_pass http://genie/;\n\n            # WebSocket headers\n            proxy_http_version 1.1;\n            proxy_set_header Upgrade $http_upgrade;\n            proxy_set_header Connection \"upgrade\";\n            \n            # Preserve headers\n            proxy_set_header Host $host;\n            proxy_set_header X-Real-IP $remote_addr;\n            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n            proxy_set_header X-Forwarded-Proto $scheme;\n        }\n    }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgenieframework%2Fstipplemakie.jl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgenieframework%2Fstipplemakie.jl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgenieframework%2Fstipplemakie.jl/lists"}